因为,在当前工程中,web应用选择Servlet3.1和FreeMarker。所以,我们需要在当前项目中整合FreeMarker。(有关FreeMarker的内容可以参考FreeMarker一:什么是模板引擎;FreeMarker和JSP的比较;及邻近的几篇博客,快速浏览十几分钟就能OK啦)
目录
2.FreeMarker配置:在web.xml中配置FreemarkerServlet
(3)发布前配置:设置IDEA发布中包括maven的jar包
一:整个FreeMarker
1.引入依赖
(1)引入FreeMarker依赖
(2)引入Servlet依赖
说明:
(1)Servlet的版本四3.1.0,这是因为这个版本必须要和创建这个Maven web工程时所指定的版本一致;
(2)provided:因为web容器(比如Tomcat)本身就是一个Servlet容器,其自带了Servlet-apr.jar。所以,我们这儿引入的Servlet依赖只需要在程序编译的时候用到,并不需要将这个Servlet依赖发布到最终的运行环境中,因为Tomcat已经自带了。
***可以帮助我们控制当前的依赖在哪个阶段参与。比如junit是个单元测试框架,在实际线上运行时是不需要这个依赖的,所以junit可以增加标签。
2.FreeMarker配置:在web.xml中配置FreemarkerServlet
在web.xml中配置FreeMarker。要想使freemarker在web项目中起作用,需要对freemarker.jar中的FreemarkerServlet的这个Servlet类进行配置:
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd"
version="4.0">
<servlet>
<servlet-name>freemarker</servlet-name>
<servlet-class>freemarker.ext.servlet.FreemarkerServlet</servlet-class>
<init-param>
<param-name>TemplatePath</param-name>
<param-value>/WEB-INF/ftl</param-value>
</init-param>
<init-param>
<!--default_encoding:用于设置读取ftl文件时采用的字符集-->
<param-name>default_encoding</param-name>
<param-value>UTF-8</param-value>
</init-param>
</servlet>
<servlet-mapping>
<servlet-name>freemarker</servlet-name>
<url-pattern>*.ftl</url-pattern>
</servlet-mapping>
</web-app>
说明:
(1)这部分的内容可以对比参考FreeMarker七:FreeMarker与Servlet整合;(这篇博客是Freemarker部分的核心重点);很多内容都是都是重复的;这个参考文章十分重要!!!
(2)
default_encoding这是编码方式utf-8,是出于兼容性考虑。FreemarkerServlet需要去读取指定的ftl文件,再将这个ftl文件结合实际的数据产生最终的HTML,但是ftl文件是一个纯粹的文本文件,对于ftl这个文件本身来说其也是有字符集的。。。。。在绝大多数系统中,这个字符集默认都是utf-8,但是少数情况下ftl文件的字符集可能是其他的编码方式,因此这儿设置default_encoding,就是告诉FreemarkerServlet统一的按照utf-8的这种字符集格式来读取ftl文件。。。。。在大多数情况下,使用IDE创建的ftl文件的默认字符集都是utf-8格式,所以default_encoding不写也不会产生中文乱码,,,,这儿写default_encoding仅仅是以防万一。
但是,这样设置之后,只是FreemarkerServlet按照UTF-8的编码方式去解析jst文件,,,,,,,所以还需要确保ftl文件的编码方式是UTF-8.可以参考这篇文章:解决freemarker的ftl文件中文乱码问题
***********************************
最近使用freemarker模板引擎输出html时,发现java服务端返回的中文数据在ftl文件中显示正常,但是ftl文件写死的中文出现乱码的情况。
1.首页ftl文件设置了网页的编码如下:<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
2.spring-mvc关于freemarker的配置如下,需要在freemarker的配置里加上
<!-- freemarker的配置 --> <bean id="freemarkerConfig" class="org.springframework.web.servlet.view.freemarker.FreeMarkerConfigurer"> <property name="templateLoaderPath"> <value>/WEB-INF/views/</value> </property> <!--设置编码 --> <property name="defaultEncoding" value="UTF-8" /> <!-- 页面数值的显示格式,避免1000显示成1,000 --> <property name="freemarkerSettings"> <props> <prop key="number_format">#</prop> </props> </property> </bean> <!--FreeMarker视图配置--> <bean id="ftlviewResolver" class="org.springframework.web.servlet.view.freemarker.FreeMarkerViewResolver"> <property name="suffix" value=".ftl" /> <property name="order" value="0"/> <property name="contentType" value="text/html;charset=UTF-8"/> <property name="viewClass" value="org.springframework.web.servlet.view.freemarker.FreeMarkerView"/> <!-- 方便页面获得项目的绝对路径 --> <property name="requestContextAttribute" value="request" /> </bean>
这样就解决了乱码的问题。
原文作者技术博客:https://www.jianshu.com/u/ac4daaeecdfe***********************************
3.测试
(1)创建ftl文件
(2)创建Servlet
(PS:右键没有Servlet的可以参考IntelliJ IDEA开发工具入门七:创建Web工程;启动Web应用;设置上下文路径;热部署设置;创建Servlet;项目打包(war)发布;【这篇博客十分重要!!!】)
TestServlet:内容很简单
package com.imooc.oa.test;
import com.imooc.oa.utils.MybatisUtils;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
@WebServlet(name = "TestServlet",urlPatterns = "/test")
public class TestServlet extends HttpServlet {
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
String resultehaha = (String) MybatisUtils.executeQuery(sqlSession -> sqlSession.selectOne("test.sample"));
request.setAttribute("result", resultehaha);
request.getRequestDispatcher("/test.ftl").forward(request,response);
}
}
说明:
(1)只需要强调一点,以前使用Eclipse开发的时候:可以:
方式一:先新建一个类然后让这个类继承HTTPServlet类,然后如果采用注解形式的话,可以如下:(参见:Servlet入门十:Servlet的注解: @WebServlet(“/anno“))
方式二:右键直接新建一个Servlet,其注解中也只是有一个"/"
这与IDEA中自动创建的Servlet的注解中的内容还是有差别的。
(3)发布前配置:设置IDEA发布中包括maven的jar包
(4)发布
(在发布的时候,遇到了一个问题,参见:pom中的junit依赖的<scope>设置为了test → maven项目的test目录隐藏了 → 运行时报错org.junit没发现;;;maven中的scope属性;)
至此,就说明在当前imooc-oa工程中,mybatis和FreeMarker就整合成功了。
二:最后一点额外的东西,设置下logback;
可以参考:MyBatis进阶一:MyBatis日志管理;(【如何输出日志到日志文件中】待补充……)