聶永的博客

          記錄工作/學(xué)習(xí)的點(diǎn)點(diǎn)滴滴。

          介紹一個(gè)為Servlet增加REST URL支持的超小框架,一點(diǎn)都不侵入!

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

          說(shuō)這個(gè)很輕、很微小的框架,一點(diǎn)都不過(guò)分,只有10個(gè)java文件,只是用注解的話,那就可以減少為7個(gè)java文件。

          說(shuō)這個(gè)小東西目標(biāo)明確,一點(diǎn)不摻假,就是為現(xiàn)有的servlet增加rest風(fēng)格的URL支持,僅此而已。

          我們表示一個(gè)具有結(jié)構(gòu)形式的URL為:

          /book/head first java/chapter/12 看圖說(shuō)故事

          傳統(tǒng)的servlet在URL處怎么映射呢 ?

          /book/*

          那么chapter怎么辦 ?

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

          顯然上面的鏈接地址則很難到達(dá) /chapter/*。當(dāng)然會(huì)有兄弟跳出來(lái)說(shuō),這一切可以交給 /book/*進(jìn)行處理,嗯,book也一并處理了chapter部分,當(dāng)然是可以的,帶來(lái)了責(zé)任不單一的問(wèn)題了,混雜在一起,造成代碼管理的混亂。

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

          @RestSupport("/book/*/chapter/*")
          其風(fēng)格完全是以往的servlet映射的風(fēng)格,只不過(guò)支持的參數(shù)多了些。
          更重要的是以往的Servlet編程經(jīng)驗(yàn)一點(diǎn)都沒(méi)有舍棄,都還保留著。在ServletRest里沒(méi)有強(qiáng)迫人們按照新的繼承格式創(chuàng)造一個(gè)處理類(lèi),還是和以往一樣,創(chuàng)建一個(gè)需要繼承 HttpServlet 的servlet,重寫(xiě)GET、POST、DELETE、PUT等方法,在類(lèi)的合適位置添加上注解即可:
          @RestSupport("/book/*/chapter/*") 即可。當(dāng)然這部分可以在xml文件中完成配置,下一篇文章會(huì)講到。
          這里有一個(gè)示范:
          @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同時(shí)支持多個(gè)url @RestSupport({"url1","url2"}),除此之外,沒(méi)有多余功能。

           

          那么怎么在項(xiàng)目中使用呢 ?

          在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需要接收一個(gè)需要掃描的包的參數(shù),若有多個(gè)包,可以包路徑之間有一個(gè)分隔符逗號(hào)“,”,eg:

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

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

          在運(yùn)行期間可以對(duì)Servlet的進(jìn)行動(dòng)態(tài)裝載和卸載等操作,ServletRest已經(jīng)封裝了相應(yīng)的接口(必須從全局Context中獲取,下面代碼是從示范JSP代碼中摘?。?

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

           

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

          getServletContext().getAttribute("servletFactory");

          ServletRest遵循的原則和原有的servlet容器處理方式一致,一個(gè)URL對(duì)應(yīng)一個(gè)Servlet實(shí)例原則。

          更多信息請(qǐng)閱讀ServletRest源代碼。

          posted on 2010-10-01 16:06 nieyong 閱讀(4533) 評(píng)論(1)  編輯  收藏 所屬分類(lèi): Servlet3

          評(píng)論

          # re: 介紹一個(gè)為Servlet增加REST URL支持的超小框架,一點(diǎn)都不侵入![未登錄](méi) 2013-12-24 01:42 Jerry

          入侵的很?chē)?yán)重!  回復(fù)  更多評(píng)論   

          公告

          所有文章皆為原創(chuàng),若轉(zhuǎn)載請(qǐng)標(biāo)明出處,謝謝~

          新浪微博,歡迎關(guān)注:

          導(dǎo)航

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

          統(tǒng)計(jì)

          常用鏈接

          留言簿(58)

          隨筆分類(lèi)(130)

          隨筆檔案(151)

          個(gè)人收藏

          最新隨筆

          搜索

          最新評(píng)論

          閱讀排行榜

          評(píng)論排行榜

          主站蜘蛛池模板: 全椒县| 安义县| 广平县| 曲沃县| 沁源县| 易门县| 阿尔山市| 台中县| 东乡县| 晴隆县| 乌什县| 星座| 辽中县| 扶余县| 应用必备| 普陀区| 黄石市| 建宁县| 尉氏县| 克东县| 界首市| 屯门区| 隆昌县| 德兴市| 疏附县| 临桂县| 扎鲁特旗| 特克斯县| 南郑县| 黑龙江省| 措美县| 永顺县| 土默特左旗| 铜川市| 高邑县| 兴城市| 常宁市| 北海市| 昭通市| 龙里县| 宕昌县|