文档章节

让Servlet支持REST风格的url

英强
 英强
发布于 2015/06/16 14:54
字数 805
阅读 2114
收藏 29

前言

Servlet自从上了3.0版本之后,用起来已经是相当舒服了。注解的加入,让你基本可以抛弃web.xml,零配置写web。

不过,用了之后,还是有些遗憾。就是REST风格URL的支持。很久之前用过SpringMVC之后,对于REST风格的URL就喜欢得不得了。上网查了下,发现了个项目servletrest,项目托管在google code上:http://code.google.com/p/servletrest/

源码就几个类,很快就看完了,也试用了一下。确实是可以支持,但是bug也比较明显。最明显的一个就是,支持了REST的servlet,是无法获取到ServletContext。原因是servletrest在初始化servlet的时候,没有调用servlet的init方法,即没有初始化ServletConfig。还有一个问题,就是获取URI中的参数时,太过繁琐。而且基于第一个问题,参数其实是获取不到的。

花了点时间,重新写了个新的实现,叫summer-restful。主要作用,就是让普通的servlet支持rest风格的url,并且也修复中servletrest的明显bug。

实现原理

定义一个Filter。

init

在容器启动的时候,对所有已通过注解标记的servlet进行扫描验证。这里提到的注解是我们自定义的,叫@SummerServlet,参数有两个,name,UrlPatterns。符合规则的servlet初始化,并用他们的urlPatterns作为该servlet的key,存入一个Map中进行维护。说明下,我们自定义的@SummerServlet中的urlPatterns,跟原生servlet的UrlPatterns有些区别。自定义的urlPatterns中,是支持类似这种格式的url:/*/detail/* 的,也通过这里,让普通的servlet支持了REST风格的url。

doFilter

过滤器拦截所有请求。分析请求的servletPath,跟Map中的key进行比对,若匹配,则返回key对应的servlet,并且会注入url中的参数到request;否则,执行默认的动作。

使用

有两个步骤。

配置全局的Filter

通过web.xml配置的话,例子如下

<filter>
	<filter-name>summerFilter</filter-name>
	<filter-class>cn._5iurl.restful.SummerFilter</filter-class>
	<init-param>
		<param-name>servletPackage</param-name>
		<param-value>cn._5iurl.test.servlet</param-value>
	</init-param>
</filter>
<filter-mapping>
	<filter-name>summerFilter</filter-name>
	<url-pattern>/*</url-pattern>
</filter-mapping>
也可以通过注解来配置。这时候需要新建一个Filter继承SummerFilter,例子如下
@WebFilter(filterName="restFilter", initParams=@WebInitParam(name="servletPackage", value="cn._5iurl.test.servlet"), urlPatterns="/*")
public class CRestFilter extends SummerFilter{

}

配置Servlet

在需要Rest风格URL的servlet类中,不再配置到xml或者用@WebServlet注解,而是改用@SummerServlet注解。例子如下

@SummerServlet(name="detailServlet", urlPatterns="/*/detail/*")
public class DetailServlet extends HttpServlet{

	private static final long serialVersionUID = 8268477143225755822L;

	@Override
	protected void doGet(HttpServletRequest req, HttpServletResponse resp)
			throws ServletException, IOException {
		String category = (String)req.getAttribute("p0");
		String id = (String)req.getAttribute("p1");
		
		req.setAttribute("id", id);
		req.getRequestDispatcher("/WEB-INF/www/"+category+"/detail.jsp").forward(req, resp);
	}

}

获取URL中的参数

获取url中的参数。啥意思呢?还是上面的例子。假设用户访问的是:http://localhost:8015/cms/user/detail/1,可以看到,是符合我们定义的url规则:

/*/detail/*
那我们怎么获取中隐藏其中的参数值:user和1呢。还是看例子
String category = (String)req.getAttribute("p0");
String id = (String)req.getAttribute("p1");

源码

源码已经放在Git@OSC上面,有兴趣可以看下:http://git.oschina.net/cevin15/summer-restful

© 著作权归作者所有

共有 人打赏支持
英强

英强

粉丝 171
博文 29
码字总数 18802
作品 1
深圳
后端工程师
加载中

评论(1)

天蓬小猪
天蓬小猪
牛逼!
Spring MVC入门

核心类与接口: 先来了解一下,几个重要的接口与类。现在不知道他们是干什么的没关系,先混个脸熟,为以后认识他们打个基础。 DispatcherServlet -- 前置控制器 HandlerMapping接口 -- 处理请...

为梦而来
2014/01/25
0
0
spring mvc 中如何访问到静态的文件,如jpg js css

如何你的DispatcherServlet拦截".do"这样的有后缀的URL,就不存在访问不到静态资源的问题。 如果你的DispatcherServlet拦截"/",为了实现REST风格,拦截了所有的请求,那么同时对.js,.jpg等静...

随智阔
2014/03/11
0
0
深入理解Spring MVC 思想

一、前言 二、spring mvc 核心类与接口 三、spring mvc 核心流程图 四、spring mvc DispatcherServlet说明 五、spring mvc 父子上下文的说明 六、springMVC-mvc.xml 配置文件片段讲解 七、s...

qq58edf1d989a2d
06/26
0
0
com.sun.jersey.api.container.ContainerException

com.sun.jersey.api.container.ContainerException: The ResourceConfig instance does not contain any root resource classes jersey 在配置文件web.xml中没有写对而出现的错误!! 出错的......

Jeremy_pan
2014/10/19
0
2
【转】设计 REST 风格的 MVC 框架

传统的 JavaEE MVC 框架如 Struts 等都是基于 Action 设计的后缀式映射,然而,流行的 Web 趋势是 REST 风格的架构。尽管使用 Filter 或者 Apache mod_rewrite 能够通过 URL 重写实现 REST 风...

晨曦之光
2012/03/09
0
0

没有更多内容

加载失败,请刷新页面

加载更多

权限框架Shiro学习之表结构设计

权限框架Shiro学习之表结构设计 Shiro是一款优秀的开源安全框架,学习Shiro大家可以参考张开涛老师的博客:跟我学Shiro,当然也可参考我之前的笔记:Shiro实现身份认证、Shiro实现授权。 在学...

TyCoding
20分钟前
1
0
find命令和文件名后缀

9月18日任务 2.23/2.24/2.25 find命令 2.26 文件名后缀 which which 搜索可执行文件,必须在PATH环境变量目录中!!否则无法搜到! [root@centos7 ~]# which lsalias ls='ls --color=auto'...

robertt15
24分钟前
1
0
阿里Java程序员必备的Intellij IDEA 插件

善用Intellij插件可大幅提升我们的效率,以下是我用过不错的Intellij插件,分享给大家希望能帮到大家。 1. .ignore 生成各种ignore文件,一键创建git ignore文件的模板,免得自己去写 2. lom...

我是你大哥
34分钟前
1
0
为什么Java大神,都在看Spring Boot和Spring Cloud的书?

如果你是一名Java开发人员,并且最近正打算学习Spring Boot和Spring Cloud框架并寻找一些关于它们的最好的书籍,那么,你今天就来对地方了。 本文,我们将讨论一些学习Spring Boot和Spring ...

Java小铺
52分钟前
12
0
springboot logback日志配置

springboot 如果不使用外部tomcat的话,日志是需要自己配置的,不然的话就只有控制台的日志,但是日志又是我们在项目上了生产环境,出问题时,检查问题的唯一途径,所以我们要配置详细的日志...

曾大大胖
52分钟前
2
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部