介紹一個為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 ... } }
那么怎么在項目中使用呢 ?
在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 閱讀(4533) 評論(1) 編輯 收藏 所屬分類: Servlet3