介绍一个为Servlet增加REST URL支持的超小框架,一点都不侵入!

介绍一个为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 ...
        }
}
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需要接收一个需要扫描的包的参数,若有多个包,可以包路径之间有一个分隔符逗号“,”,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源代码。

你可能感兴趣的:(介绍一个为Servlet增加REST URL支持的超小框架,一点都不侵入!)