Servlet 3.0 开发手记之---使用Freemarker替代JSP,更快更轻更高效

阅读更多

曾经写过一篇博文《很轻的,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);
	}
}
 

 

@WebServlet("/test ")
public class TemplateTestAction extends HttpServlet {
private static final long serialVersionUID = 88687687987980L;
      
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
String id = "1687 ";

String title = "JSP测试 ";
String content = "这是JSP测试 ";

request.setAttribute("blog ", new UserBlog(id, title, content, new Date()));

request.getRequestDispatcher("/WEB-INF/pages/template.jsp ").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功能,支持组件、功能的插拔,使之可以模块化构造一个站点服务,大的跨越,一个变革,必将受益开发者社区。

 

你可能感兴趣的:(Servlet,JSP,freemarker,HTML,Blog)