曾经写过一篇博文《很轻的,Servlet + Freemarker 组合体,没有那么硬~ 》,不过那是基于Servlet 2.× 系列的,今天谈谈如何在Servlet 3.0 下使用Freemarker进行更快的开发方式。
Servlet 3.0的强大、简单的,摆脱以前的约束,重构类名还得需要到web.xml中手动修改,如今再也没有那么多烦恼,当然这仅仅是一个侧面而已,就已经说明了其强大。
Freemarker强大的模板化能力,据说解析速度超越JSP,让讨厌JSP+ JAVA混合体编程的人得到一种解脱,身心的。还有一点就是快速的模型填充,不需要随处可见的JAVA代码,任何角落都是。
总之:Servlet 3.0 + Freemarker, 超级轻的MVC组合,让人愉悦。
闲话短说,先来一个Servlet + JSP组合体:
TemplateTestAction.java
@WebServlet("/test1") public class TemplateTest1Action extends HttpServlet { private static final long serialVersionUID = 6576879808909808L; protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { String id = "1688"; String title = "使用freemarker"; String content = "这是测试"; request.setAttribute("blog", new UserBlog(id, title, content, new Date())); request.getRequestDispatcher("/WEB-INF/pages/template1.html").forward(request, response); } }
对应JSP:
<%@page import="java.text.SimpleDateFormat"%> <%@page import="com.demo.UserBlog"%> <%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>JSP + Servlet <%UserBlog blog = (UserBlog)request.getAttribute("blog"); %>ID : <%=blog.getId() %>
TITLE : <%=blog.getTitle() %>
DATETIME : <%=new SimpleDateFormat("yyyy-MM-dd HH:mm").format(blog.getDate()) %>
CONTENT :
<%=blog.getContent() %>
看看代码,以前大家也都是这么写过来的。
对比一下Servlet + Freemarker :
@WebServlet("/test1") public class TemplateTest1Action extends HttpServlet { private static final long serialVersionUID = 6576879808909808L; protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { String id = "1688"; String title = "使用freemarker"; String content = "这是测试"; request.setAttribute("blog", new UserBlog(id, title, content, new Date())); request.getRequestDispatcher("/WEB-INF/pages/template1.html").forward(request, response); } }
Servlet代码没有发生什么变化,只是这次转向了html文件:
Freemaker模板测试1 ID : ${blog.id}
TITLE : ${blog.title}
DATETIME : ${blog.date?string("yyyy-MM-dd HH:mm")}
CONTENT :
${blog.content}
请再次对比一下JSP 和 html文件的区别,您会选择写HTML还是JSP页面呢 ?
要想让TemplateTest1Action转向HTML页面生效,您需要配置一个Freemarker的控制器,用以解析html页面。
这里控制器为:TemplateController.java 文件:
@WebServlet( urlPatterns = {"*.html"}, // 需要定义Freemarker解析的页面后缀类型 asyncSupported = false, loadOnStartup = 0, name = "templateController", displayName = "TemplateController", initParams = { @WebInitParam(name = "TemplatePath", value = "/"), @WebInitParam(name = "NoCache", value = "true"),//定义是否缓存 @WebInitParam(name = "ContentType", value = "text/html; charset=UTF-8"),// 定义内容类型 @WebInitParam(name = "template_update_delay", value = "0"), // 开发环境中可设置为0 @WebInitParam(name = "default_encoding", value = "UTF-8"), @WebInitParam(name = "number_format", value = "0.##########") } ) public class TemplateController extends FreemarkerServlet { private static final long serialVersionUID = 8714019900490761087L; }
这里仅仅需要继承FreemarkerServlet,再加上一些注解即可,内容代码不用写。当然也可以省去
TemplateController,直接在web.xml文件中配置:
freemarker freemarker.ext.servlet.FreemarkerServlet TemplatePath / NoCache true ContentType text/html; charset=UTF-8 template_update_delay 0 default_encoding UTF-8 number_format 0.########## 2 freemarker *.html
记得把 freemarker-2.3.13.jar 文件扔进WEB-INF/lib 目录下。
项目源代码下载地址:
下载地址
接下来一篇将体验一下Servlet 3.0 的WebFragment功能,支持组件、功能的插拔,使之可以模块化构造一个站点服务,大的跨越,一个变革,必将受益开发者社区。