聶永的博客

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

          介紹一個為Servlet增加REST URL支持的超小框架,一點都不侵入!

          這個框架(ServletRest)最近剛剛被提交上谷歌代碼托管,目標是為servlet增加rest風格URL支持,僅僅如此而已,目標非常明確:不做那么多,只做一點點。

          說這個很輕、很微小的框架,一點都不過分,只有10個java文件,只是用注解的話,那就可以減少為7個java文件。

          說這個小東西目標明確,一點不摻假,就是為現有的servlet增加rest風格的URL支持,僅此而已。

          我們表示一個具有結構形式的URL為:

          /book/head first java/chapter/12 看圖說故事

          傳統的servlet在URL處怎么映射呢 ?

          /book/*

          那么chapter怎么辦 ?

          /chapter/*(這里假設/book/*排在較上位置)

          顯然上面的鏈接地址則很難到達 /chapter/*。當然會有兄弟跳出來說,這一切可以交給 /book/*進行處理,嗯,book也一并處理了chapter部分,當然是可以的,帶來了責任不單一的問題了,混雜在一起,造成代碼管理的混亂。

          那么怎么在ServletRest里面怎么做呢 ?

          @RestSupport("/book/*/chapter/*")
          其風格完全是以往的servlet映射的風格,只不過支持的參數多了些。
          更重要的是以往的Servlet編程經驗一點都沒有舍棄,都還保留著。在ServletRest里沒有強迫人們按照新的繼承格式創造一個處理類,還是和以往一樣,創建一個需要繼承 HttpServlet 的servlet,重寫GET、POST、DELETE、PUT等方法,在類的合適位置添加上注解即可:
          @RestSupport("/book/*/chapter/*") 即可。當然這部分可以在xml文件中完成配置,下一篇文章會講到。
          這里有一個示范:
          @RestSupport("/book/*/chapter/*")
          public class ChapterServlet extends HttpServlet {
                  private static final long serialVersionUID = -1534235656L;
          
                  protected void doGet(HttpServletRequest request,
                                  HttpServletResponse response) throws ServletException, IOException {
                          // code here ...
                  }
          
                  protected void doPost(HttpServletRequest request,
                                  HttpServletResponse response) throws ServletException, IOException {
                          // code here ...
                  }
          
                  protected void doPut(HttpServletRequest request,
                                  HttpServletResponse response) throws ServletException, IOException {
                          // code here ...
                  }
          
                  protected void doDelete(HttpServletRequest request,
                                  HttpServletResponse response) throws ServletException, IOException {
                          // code here ...
                  }
          }
          RestSupport同時支持多個url @RestSupport({"url1","url2"}),除此之外,沒有多余功能。

           

          那么怎么在項目中使用呢 ?

          在web.xml 中配置filter:

          <filter>
            <filter-name>RestFilter</filter-name> 
            <filter-class>com.servlet.rest.RestFilter</filter-class> 
            <init-param>
              <param-name>scanPackage</param-name> 
              <param-value>com.yong.test.servlet</param-value> 
            </init-param>
          </filter>
          <filter-mapping>
            <filter-name>RestFilter</filter-name> 
            <url-pattern>/*</url-pattern> 
          </filter-mapping>

          scanPackage需要接收一個需要掃描的包的參數,若有多個包,可以包路徑之間有一個分隔符逗號“,”,eg:

          com.yong.test.servlet,com.xiaomin.bookstore

          ServletRest 注解需要JDK 1.5支持,Servlet 2.*, 3.* 版本,僅僅把ServletRest-0.8.jar (下載地址)放到項目classpath中,并且不依賴于第三方JAR包,除了servlet.jar之外。

          在運行期間可以對Servlet的進行動態裝載和卸載等操作,ServletRest已經封裝了相應的接口(必須從全局Context中獲取,下面代碼是從示范JSP代碼中摘取):

          		ServletFactory servletFactory = (ServletFactory)application.getAttribute("servletFactory");
          		
          		// 注冊新的Servlet
          		String mappingUrl = "新的Servlet映射URL";
          		Class servletClass = Class.forName("要映射的Servlet Class路徑");
          		
          		servletFactory.register(mappingUrl, servletClass);
          		
          		// 注銷Servlet
          		//servletFactory.destory(servletClass);

           

          假如不在JSP中操作,那就需要:

          getServletContext().getAttribute("servletFactory");

          ServletRest遵循的原則和原有的servlet容器處理方式一致,一個URL對應一個Servlet實例原則。

          更多信息請閱讀ServletRest源代碼。

          posted on 2010-10-01 16:06 nieyong 閱讀(4538) 評論(1)  編輯  收藏 所屬分類: Servlet3

          評論

          # re: 介紹一個為Servlet增加REST URL支持的超小框架,一點都不侵入![未登錄] 2013-12-24 01:42 Jerry

          入侵的很嚴重!  回復  更多評論   

          公告

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

          新浪微博,歡迎關注:

          導航

          <2010年10月>
          262728293012
          3456789
          10111213141516
          17181920212223
          24252627282930
          31123456

          統計

          常用鏈接

          留言簿(58)

          隨筆分類(130)

          隨筆檔案(151)

          個人收藏

          最新隨筆

          搜索

          最新評論

          閱讀排行榜

          評論排行榜

          主站蜘蛛池模板: 永靖县| 宁安市| 图们市| 莲花县| 达拉特旗| 北流市| 若羌县| 化德县| 金溪县| 烟台市| 太和县| 崇义县| 扶余县| 武乡县| 桦南县| 精河县| 剑川县| 沅江市| 濉溪县| 房产| 开江县| 梨树县| 黄大仙区| 勐海县| 新民市| 拉萨市| 奈曼旗| 牟定县| 宜兴市| 来宾市| 桓仁| 杨浦区| 遂平县| 文山县| 棋牌| 张家口市| 长兴县| 长治市| 浦东新区| 莆田市| 天台县|