聶永的博客

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

          Servlet 3.0筆記之包含在JAR文件中可直接訪問的資源文件特性(資源綁定)

          這次標題夠長的,在Servlet3協議規范中,包含在JAR文件/META-INFO/resources/路徑下的資源可以直接訪問了。這么說一說,可能感覺不到到底有什么好處,以往的JSP或者HTML頁面只能存在站點的目錄下,或者在WEB-INF目錄下(只是不能直接訪問)。
          規范說,${jar}/META-INF/resources/被視為根目錄,假設home.jsp被放在${jar}/META-INF/resources/home.jsp,用戶可以直接通過 http://域名/home.jsp 訪問了。
          呈現一個常見的代碼片段:
          /**
          * 簡單示范
          * @author yongboy
          * @date 2011-1-16
          * @version 1.0
          */
          @WebServlet("/jarHome")
          public class HelloJarServlet extends HttpServlet {
          private static final long serialVersionUID = 6177346686921106540L;

          protected void doGet(HttpServletRequest request,
          HttpServletResponse response) throws ServletException, IOException {
          request.setAttribute("date", new Date());
          request.getRequestDispatcher("/jarpage/jarhome.jsp").forward(request, response);
          }
          }
          而jarhome.jsp文件路徑則位于 ${jar}/META-INF/resources/jarpage/jarhome.jsp
          當然jarhome.jsp文件則沒有什么特別之處:
          <%@ 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">
          <link rel="stylesheet" href="css/style.css" type="text/css" />
          <title>Welcome to jar home</title>
          </head>
          <body>
          <img alt="j2ee" src="img/j2ee.png" /><br/>
          <br/>
          now date : <%=((java.util.Date)request.getAttribute("date")).toString()%>
          </body>
          </html>
          jarhome.jsp文件所引用css/style.css和img/j2ee.png等文件分別位于 ${jar}/META-INF/resources/css/style.css${jar}/META-INF/resources/img/j2ee.png目錄下。
          把生成的jar文件存放在 WEB-INF/lib/ 中,下面為一個運行示范圖:

          樣式和圖片等都可以正常訪問。
          有時候可能需要使用路徑信息等,再看一個示范吧:
          /**
          * 演示jarDemo
          *
          * @author yongboy
          * @date 2011-1-16
          * @version 1.0
          */
          @WebServlet("/jarDemo")
          public class DemoWebINFPagesServlet extends HttpServlet {
          private static final long serialVersionUID = -1040850432869481349L;
          private static final Log log = LogFactory
          .getLog(DemoWebINFPagesServlet.class);

          @SuppressWarnings("deprecation")
          @Override
          protected void doGet(HttpServletRequest request,
          HttpServletResponse response) throws ServletException, IOException {
          log.info("the /jarDemo is accessed now!");

          log.info("getRealPath : " + request.getRealPath("/"));
          log.info("ServletContext : getRealPath : "
          + getServletContext().getRealPath("/"));
          log.info("getPathTranslated : " + request.getPathTranslated());

          log.info("get jar's resource:");

          InputStream is = getServletContext().getResourceAsStream(
          "/jarfile/demo.txt");
          log.info("the JAR/META-INF/resources/jarfile/demo.txt's content is :\n"
          + IOUtils.toString(is));

          request.getRequestDispatcher("/WEB-INF/pages/notaccess.jsp");
          }
          }
          輸入命令行信息為:
          [framework] 2011-01-03 11:45:16,664 - com.learn.servlet3.jardync.DemoWebINFPagesServlet -798292 [http-8080-exec-6] INFO  com.learn.servlet3.jardync.DemoWebINFPagesServlet  - the /jarDemo is accessed now!
          [framework] 2011-01-03 11:45:16,664 - com.learn.servlet3.jardync.DemoWebINFPagesServlet -798292 [http-8080-exec-6] INFO  com.learn.servlet3.jardync.DemoWebINFPagesServlet  - getRealPath : /home/yongboy/workspace/.metadata/.plugins/org.eclipse.wst.server.core/tmp0/wtpwebapps/d/
          [framework] 2011-01-03 11:45:16,664 - com.learn.servlet3.jardync.DemoWebINFPagesServlet -798292 [http-8080-exec-6] INFO  com.learn.servlet3.jardync.DemoWebINFPagesServlet  - ServletContext : getRealPath : /home/yongboy/workspace/.metadata/.plugins/org.eclipse.wst.server.core/tmp0/wtpwebapps/d/
          [framework] 2011-01-03 11:45:16,665 - com.learn.servlet3.jardync.DemoWebINFPagesServlet -798293 [http-8080-exec-6] INFO  com.learn.servlet3.jardync.DemoWebINFPagesServlet  - getPathTranslated : null
          [framework] 2011-01-03 11:45:16,665 - com.learn.servlet3.jardync.DemoWebINFPagesServlet -798293 [http-8080-exec-6] INFO  com.learn.servlet3.jardync.DemoWebINFPagesServlet  - get jar's resource:
          [framework] 2011-01-03 11:45:16,665 - com.learn.servlet3.jardync.DemoWebINFPagesServlet -798293 [http-8080-exec-6] INFO  com.learn.servlet3.jardync.DemoWebINFPagesServlet  - the ${JAR}/META-INF/resources/jarfile/demo.txt's content is :
          haha,the demo.s's content!
          haha,haha,haha!
          可以看到getRealPath("/")得到的是項目的根路徑(可以參照JAR解壓后的路徑)。而request.getPathTranslated則因為是包含在jar文件中(規范中說包含在遠程主機、數據庫、JAR存檔文件中,getPathTranslated都會返回null),則返回null。
          包含在jar中的資源文件,一樣可以使用getResourceAsStream獲取到。
          再來看看jar文件META-INF/resources目錄下文件結構:
          • css/style.css
          • img/j2ee.png
          • jarfile/demo.txt
          • jarpage/jarhome.jsp
          • jsp/h.jsp
          • jsp/helloWorld.jsp
          很顯然,就是一個小型站點目錄結構。
          每一個模塊,建立一個WEB站點應用,使用ANT腳本自動打包成jar文件,拷貝到真正站點WEB-INF/lib下。
          假設一個JAR文件包含一個具體的模塊,那么模塊的部署與裝載將是十分方便的。

          posted on 2011-01-03 12:20 nieyong 閱讀(7032) 評論(2)  編輯  收藏 所屬分類: Servlet3

          評論

          # re: Servlet 3.0筆記之包含在JAR文件中可直接訪問的資源文件特性(資源綁定)[未登錄] 2012-08-01 11:24 lixor

          這樣做最大的好處就是可以做產品定制化項目。
          例如有一個產品P,此產品的絕大多數功能都是不需要做客戶化的,只有個別模塊需要客戶化定制。
          如果按照以前的做法需要為每個客戶創建一個項目并進行一些修改,這樣源碼管理的控制就比會較混亂。
          如果采用jar包封裝那個需要客戶化的模塊的話,這樣就不需要修改產品主體,每次只要在實施時把客戶化的jar放進去就行了。  回復  更多評論   

          # re: Servlet 3.0筆記之包含在JAR文件中可直接訪問的資源文件特性(資源綁定)[未登錄] 2015-06-19 22:41 tom

          @lixor
          的確是這樣,做過客戶化開發的深有體會,這樣做有兩點好處  回復  更多評論   

          公告

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

          新浪微博,歡迎關注:

          導航

          <2011年1月>
          2627282930311
          2345678
          9101112131415
          16171819202122
          23242526272829
          303112345

          統計

          常用鏈接

          留言簿(58)

          隨筆分類(130)

          隨筆檔案(151)

          個人收藏

          最新隨筆

          搜索

          最新評論

          閱讀排行榜

          評論排行榜

          主站蜘蛛池模板: 巴青县| 绥宁县| 昌吉市| 尚义县| 西林县| 赣榆县| 平武县| 久治县| 仪征市| 晋江市| 阳山县| 天柱县| 元谋县| 玉门市| 温宿县| 黄骅市| 专栏| 兰州市| 盐津县| 武陟县| 长岛县| 开化县| 安新县| 湛江市| 容城县| 当雄县| 五大连池市| 普兰店市| 水富县| 友谊县| 江津市| 肃宁县| 乐平市| 平塘县| 昌图县| 南昌市| 德阳市| 金堂县| 噶尔县| 景洪市| 比如县|