這個框架(ServletRest)最近剛剛被提交上谷歌代碼托管,目標是為servlet增加rest風格URL支持,僅僅如此而已,目標非常明確:不做那么多,只做一點點。
說這個很輕、很微小的框架,一點都不過分,只有10個java文件,只是用注解的話,那就可以減少為7個java文件。
說這個小東西目標明確,一點不摻假,就是為現(xiàn)有的servlet增加rest風格的URL支持,僅此而已。
我們表示一個具有結(jié)構(gòu)形式的URL為:
/book/head first java/chapter/12 看圖說故事
傳統(tǒng)的servlet在URL處怎么映射呢 ?
/book/*
那么chapter怎么辦 ?
/chapter/*(這里假設(shè)/book/*排在較上位置)
顯然上面的鏈接地址則很難到達 /chapter/*。當然會有兄弟跳出來說,這一切可以交給 /book/*進行處理,嗯,book也一并處理了chapter部分,當然是可以的,帶來了責任不單一的問題了,混雜在一起,造成代碼管理的混亂。
那么怎么在ServletRest里面怎么做呢 ?
@RestSupport("/book/*/chapter/*")
其風格完全是以往的servlet映射的風格,只不過支持的參數(shù)多了些。
更重要的是以往的Servlet編程經(jīng)驗一點都沒有舍棄,都還保留著。在ServletRest里沒有強迫人們按照新的繼承格式創(chuàng)造一個處理類,還是和以往一樣,創(chuàng)建一個需要繼承 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需要接收一個需要掃描的包的參數(shù),若有多個包,可以包路徑之間有一個分隔符逗號“,”,eg:
com.yong.test.servlet,com.xiaomin.bookstore
ServletRest 注解需要JDK 1.5支持,Servlet 2.*, 3.* 版本,僅僅把ServletRest-0.8.jar (下載地址)放到項目classpath中,并且不依賴于第三方JAR包,除了servlet.jar之外。
在運行期間可以對Servlet的進行動態(tài)裝載和卸載等操作,ServletRest已經(jīng)封裝了相應的接口(必須從全局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源代碼。