介绍一个为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源代码。