介紹一個(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 ... } }
那么怎么在項(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