FreeMarker集成
在Servlet中使用FreeMarker
简单的使用方式是,在Servlet中直接处理模板与数据模型,然后输出到响应中
如下的一个TestServlet
Configuration
对象使用setServletContextForTemplateLoading
方法,设置要加载模板的servlet上下文
@WebServlet(name="test", urlPatterns="/test")
public class TestServlet extends HttpServlet {
private static final long serialVersionUID = 1L;
private Configuration cfg;
@Override
public void init() throws ServletException {
cfg = new Configuration(Configuration.VERSION_2_3_26);
cfg.setServletContextForTemplateLoading(getServletContext(), "/WEB-INF/ftl");
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
Map root = new HashMap();
root.put("name", "小明");
root.put("names", Arrays.asList("Tom", "John", "Sasha"));
Template template = cfg.getTemplate("index.ftl");
response.setCharacterEncoding("UTF-8");
Writer writer = response.getWriter();
try {
template.process(root, writer);
} catch (TemplateException e) {
e.printStackTrace();
}
}
}
原来中Servlet中,如果转发到一个页面,之前使用jsp的时候,是交由Servlet容器来进行处理的。如果现在转到ftl,容器当然是不能解析的。
但此时在web.xml
中做一个配置,将以.ftl
结尾的请求交给一个特定的Servlet来处理,这样达到将视图交给FreeMarker来处理
如下的Servlet,数据保存在request中,页面转到了一个模板中
@WebServlet(name="test2", urlPatterns="/test2")
public class TestServlet2 extends HttpServlet {
private static final long serialVersionUID = 1L;
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
request.setAttribute("name", "小明");
request.setAttribute("names", Arrays.asList("Tom", "John", "Sasha"));
request.getRequestDispatcher("index.ftl").forward(request, response);
}
}
web.xml
中内容如下:
<servlet>
<servlet-name>freemarker</servlet-name>
<servlet-class>freemarker.ext.servlet.FreemarkerServlet</servlet-class>
<init-param>
<!-- 指定ftl路径 -->
<param-name>TemplatePath</param-name>
<param-value>/WEB-INF/ftl</param-value>
</init-param>
<init-param>
<param-name>ContentType</param-name>
<param-value>text/html;charset=UTF-8</param-value>
</init-param>
<init-param>
<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>
Struts2集成FreeMarker
Struts2默认的模板技术就是FreeMarker,只需配置result
的type="freemarker"
即可
如下,创建一个TestAction
,在其execute()
方法中设置了一些属性的值,在ftl中获取这些值:
public class TestAction {
private String name;
private List<String> names;
public String execute()
{
name = "小王";
names = Arrays.asList("Tom", "小红", "John");
return "test";
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public List<String> getNames() {
return names;
}
public void setNames(List<String> names) {
this.names = names;
}
}
在struts.xml
中的配置文件中,设置result
的type
为freemarker
即可
<package name="freemarker" extends="struts-default">
<action name="test" class="com.wz.action.TestAction">
<result type="freemarker" name="test">/WEB-INF/ftl/index.ftl</result>
</action>
</package>
Freemarker 与SpringMVC集成
如下的一个TestController
,添加数据,返回页面
@Controller
public class TestController {
@RequestMapping("test")
public String test(Model model)
{
model.addAttribute("name", "小王");
model.addAttribute("names", Arrays.asList("Tom", "Josn", "Aya"));
return "index";
}
}
最主要在SpringMVC的配置文件中配置2个bean
1.一个是模板的配置
2.一个是视图解析器
<mvc:annotation-driven></mvc:annotation-driven>
<mvc:default-servlet-handler/>
<context:component-scan base-package="com.wz"></context:component-scan>
<bean class="org.springframework.web.servlet.view.freemarker.FreeMarkerConfigurer">
<!-- 模板的位置 -->
<property name="templateLoaderPath" value="/WEB-INF/ftl/" />
<!-- 设置默认的编码 -->
<property name="defaultEncoding" value="UTF-8" />
</bean>
<bean class="org.springframework.web.servlet.view.freemarker.FreeMarkerViewResolver">
<!-- 后缀 -->
<property name="suffix" value=".ftl" />
<property name="contentType" value="text/html;charset=UTF-8"/>
</bean>
也可参考SpringMVC搭配Freemarker实例解析,直接指定后缀为html
<property name="suffix" value=".html"/>