聶永的博客

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

          Servlet 3.0筆記之體驗可插拔特性,以及在實際中可能的應用范圍

          我預先建立一個WEB項目Hiservlet3,作為主項目。下面再建立一個Web Fragment項目作為主項目的從屬:
          webfragment
          建立Servlet,Filter,Listener等,沒有什么區別。
          使用Web Fragment,較為麻煩的是頁面文件的存放,其它到沒有多大區別。但有以下兩個方法解決:

          1. 使用ANT編寫 build.xml 文件,自動打成JAR包,假如有HTML文件的話,可以把HTML等頁面文件部署到主項目的部署設定目錄下
                  比如,我們設置轉向到oneuser.html文件:
                 request.getRequestDispatcher("/oneuser.html").forward(request, response);



                   就需要在發布時把oneuser.html文件放在主項目的部署根目錄下,其它路徑,以此類推。
                  建議編寫ANT腳本搞定。


          2. 把頁面文件也打進JAR包,使用Freemarker硬編碼實現頁面渲染。這種方式有些硬,另一方面移植性好,一個JAR包直接包含了Servlet 和頁面文件,但會帶來修改頁面文件的麻煩。
          下面為演示如何使用Freemarker實現硬編碼:

          /**
          * 這次,我們把模板文件放在JAR文件包中
          *
          * @author xiaomin
          *
          */
          @WebServlet("/some/")
          public class ViewSomethingAction extends HttpServlet {
              private static final long serialVersionUID = 65464645L;
              private static final String DEFAULT_ENCODING = "UTF-8";
              private static final String TEMPLATE_NAME = "some";
              private String templateString;
              private Configuration configuration;
              public void init() throws ServletException {
                  configuration = new Configuration();
                  configuration.setDefaultEncoding(DEFAULT_ENCODING);
                  configuration.setEncoding(Locale.CHINA, DEFAULT_ENCODING);
                  // 初始化模板
                  templateString = getTemplateString("pages/something.html");
              }
              protected void doGet(HttpServletRequest request,
                      HttpServletResponse response) throws ServletException, IOException {
                  // 構造要傳遞到模板的屬性值
                  Map<String, Object> map = new HashMap<String, Object>();       
                  map.put("userName", "小敏");
                  response.setContentType("text/html; charset=" + DEFAULT_ENCODING);
                  printResponsesString(response, map);
              }
              /**
               * 輸出請求內容
               * @param response
               * @param map
               * @throws IOException
               */
              private void printResponsesString(HttpServletResponse response,
                      Map<String, Object> map) throws IOException {
                  Template template = new Template(TEMPLATE_NAME, new StringReader(
                          templateString), configuration, DEFAULT_ENCODING);
                  Writer out = response.getWriter();
                  try {
                      template.process(map, out);
                  } catch (TemplateException e) {
                      e.printStackTrace();
                  } finally {
                      out.flush();
                      template = null;
                  }
              }

              /**
               * 獲取JAR包內的HTML模板文件內容
               * @param jarHtmlPath eg: pages/something.html
               * @return
               */
              private String getTemplateString(String jarHtmlPath) {
                  ClassLoader myCL = this.getClass().getClassLoader();
                  InputStream is = myCL.getResourceAsStream(jarHtmlPath);
                  if (is == null) {
                      return null;
                  } else {
                      try {
                          return templateString = IOUtils.toString(is, DEFAULT_ENCODING);
                      } catch (IOException e) {
                          e.printStackTrace();
                          return null;
                      }
                  }
              }
          }

          運行效果如圖:
          something
          注意在Eclipse下,可在Web Fragment項目上點擊運行,即可正常運行主項目,見下圖:
          web fragment startup
          當然也可以在主項目上點擊運行,依然可以運行。
          關于多個Web Fragment之間順序加載問題,可以參閱如下文章:
          http://blogs.sun.com/swchan/entry/servlet_3_0_web_fragment
          獲得更多認知。
          小結一下Servlet Web Fragment 可能在以下情況下很受用:
          1. 作為用戶攔截、日志記錄,實現項目之間的解耦。
          2. 提供RSS訂閱模塊
          3. 后臺管理
          4. 項目檢測等
          5. 不需要頁面的模塊
          ......
          最后附加上一個JAR文件,里面包含了源代碼和要發布的文件:
          本次項目演示,依賴JAR:
          commons-io-1.4.jar
          freemarker-2.3.13.jar
          commons-lang-2.3.jar
          本次項目JAR文件:
          下載
          下次寫些什么呢,不如實現更加友好的URL,也來一把REST,讓URL簡單一些。

          posted on 2010-07-05 22:08 nieyong 閱讀(575) 評論(0)  編輯  收藏 所屬分類: Servlet3

          公告

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

          新浪微博,歡迎關注:

          導航

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

          統計

          常用鏈接

          留言簿(58)

          隨筆分類(130)

          隨筆檔案(151)

          個人收藏

          最新隨筆

          搜索

          最新評論

          閱讀排行榜

          評論排行榜

          主站蜘蛛池模板: 洞口县| 岫岩| 西宁市| 松阳县| 安庆市| 西峡县| 营口市| 綦江县| 杂多县| 耒阳市| 清涧县| 宝鸡市| 天气| 广灵县| 扬中市| 长汀县| 克什克腾旗| 华池县| 皋兰县| 巢湖市| 盘山县| 易门县| 锦屏县| 稻城县| 嘉禾县| 江源县| 伊金霍洛旗| 隆德县| 宁南县| 都安| 赤壁市| 务川| 乌兰浩特市| 高阳县| 万载县| 湘潭县| 康定县| 紫金县| 神农架林区| 西乌珠穆沁旗| 宁乡县|