聶永的博客

          記錄工作/學習的點點滴滴。

          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("/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:
          template.jsp<%@page import="java.text.SimpleDateFormat"%>
          <%@page import="com.demo.UserBlog"%>
          <%@ page language="java" contentType="text/html; charset=UTF-8"
          pageEncoding="UTF-8"%>
          <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
          <html>
          <head>
          <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
          <title>JSP + Servlet</title>
          </head>
          <body>
          <%UserBlog blog = (UserBlog)request.getAttribute("blog"); %>
          <h1>ID : <%=blog.getId() %></h1>
          <h5>TITLE : <%=blog.getTitle() %></h5>
          <p>DATETIME : <%=new SimpleDateFormat("yyyy-MM-dd HH:mm").format(blog.getDate()) %></p>
          <div>
          CONTENT : <br/>
          <p><%=blog.getContent() %></p>
          </div>
          </body>
          </html>

          看看代碼,以前大家也都是這些寫過來的。
          對比一下Servlet + Freemarker :
          TemplateTest1Action.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);
          }
          }

          Servlet代碼沒有發生什么變化,只是這次轉向了html文件:
          <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
          <html>
          <head>
          <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
          <title>Freemaker模板測試1</title>
          </head>
          <body>
          <h1>ID : ${blog.id}</h1>
          <h5>TITLE : ${blog.title}</h5>
          <p>DATETIME : ${blog.date?string("yyyy-MM-dd HH:mm")}</p>
          <div>CONTENT : <br />
          <p>${blog.content}</p>
          </div>
          </body>
          </html>
          請再次對比一下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文件中配置:
            <servlet>
          <servlet-name>freemarker</servlet-name>
          <servlet-class>freemarker.ext.servlet.FreemarkerServlet</servlet-class>
          <init-param>
          <param-name>TemplatePath</param-name>
          <param-value>/</param-value>
          </init-param>
          <init-param>
          <param-name>NoCache</param-name>
          <param-value>true</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>template_update_delay</param-name>
          <param-value>0</param-value>
          </init-param>
          <init-param>
          <param-name>default_encoding</param-name>
          <param-value>UTF-8</param-value>
          </init-param>
          <init-param>
          <param-name>number_format</param-name>
          <param-value>0.##########</param-value>
          </init-param>
          <load-on-startup>2</load-on-startup>
          </servlet>
          <servlet-mapping>
          <servlet-name>freemarker</servlet-name>
          <url-pattern>*.html</url-pattern>
          </servlet-mapping>

          記得把 freemarker-2.3.13.jar 文件扔進WEB-INF/lib 目錄下。
          項目源代碼下載地址:
          下載地址
          接下來一篇將體驗一下Servlet 3.0 的WebFragment功能,支持組件、功能的插拔,使之可以模塊化構造一個站點服務,大的跨越,一個變革,必將受益開發者社區。

          posted on 2010-07-04 02:36 nieyong 閱讀(5168) 評論(0)  編輯  收藏 所屬分類: Servlet3

          公告

          所有文章皆為原創,若轉載請標明出處,謝謝~

          新浪微博,歡迎關注:

          導航

          <2010年7月>
          27282930123
          45678910
          11121314151617
          18192021222324
          25262728293031
          1234567

          統計

          常用鏈接

          留言簿(58)

          隨筆分類(130)

          隨筆檔案(151)

          個人收藏

          最新隨筆

          搜索

          最新評論

          閱讀排行榜

          評論排行榜

          主站蜘蛛池模板: 林甸县| 藁城市| 淄博市| 金山区| 宁陵县| 潞城市| 丰顺县| 香格里拉县| 玛纳斯县| 建瓯市| 常德市| 房山区| 石景山区| 望江县| 乐安县| 罗源县| 兴山县| 闽侯县| 杨浦区| 龙井市| 北宁市| 襄垣县| 曲靖市| 新乡市| 长治市| 清原| 神农架林区| 电白县| 梅河口市| 白朗县| 新兴县| 锡林浩特市| 怀来县| 龙口市| 宣威市| 突泉县| 启东市| 黄冈市| 西林县| 高雄市| 银川市|