文档章节

让Servlet支持REST风格的url

英强
 英强
发布于 2015/06/16 14:54
字数 805
阅读 3K
收藏 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
作品 2
深圳
后端工程师
私信 提问
加载中
此博客有 1 条评论,请先登录后再查看。
Stripes视图框架简介

https://blog.csdn.net/boonya/article/details/14164117 Stripes第一次接触就觉得它很神奇,不禁让喜欢编码的程序员产生好奇心。是什么让他做到了灵活自如的进行页面跳转呢? Stripes是一个...

osc_30db5uqw
2018/04/13
2
0
Spring MVC 系列(四)---DispatcherServlet说明

四、DispatcherServlet说明 使用Spring MVC,配置DispatcherServlet是第一步。 DispatcherServlet是一个Servlet,所以可以配置多个DispatcherServlet。 DispatcherServlet是前置控制器,配置在...

恋空御月
2015/07/17
27
0
JavaWeb中的资源映射

一、/与/* <url-pattern>/</url-pattern> 会匹配到/login这样的路径型url,不会匹配到模式为.jsp这样的后缀型url < url-pattern>/</url-pattern> 会匹配所有url:路径型的和后缀型的url(包括......

osc_pyq23enu
2019/03/22
2
0
servlet匹配路径时/和/*的区别(转)

本文转自https://blog.csdn.net/rongxiang111/article/details/53008829 一、<url-pattern>/</url-pattern> 会匹配到/login这样的路径型url,不会匹配到模式为.jsp这样的后缀型url < url-pat......

osc_eiolhkks
2018/04/10
6
0
Spring MVC入门

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

为梦而来
2014/01/25
3.7K
0

没有更多内容

加载失败,请刷新页面

加载更多

​DAX 2 中文版在线学习

阅读学习传送门 本文分享自微信公众号 - PowerBI战友联盟(powerbichina)。 如有侵权,请联系 support@oschina.cn 删除。 本文参与“OSC源创计划”,欢迎正在阅读的你也加入,一起分享。...

BI佐罗
2019/11/17
0
0
《OpenCV 4快速入门》终于见面啦!

近几个月以来,有众多小伙伴在公众号后台或者微信群里询问《OpenCV 4快速入门》出版的进度。非常感谢大家对本书的关注和期待,经过了不断地修改和完善,这次终于可以大声的告诉各位小伙伴。 ...

小白学视觉
06/16
0
0
GitHub 通过 jsdelivr CDN加持

GitHub 通过 jsdelivr CDN加持 两种引用方式: 存入仓库分支里面,直接引用 创建版本号后,在引用 在这是不是很好奇,为什么引用要弄成这么麻烦。网上我看过类似教程,他们总是忽略一个关键的...

Zero游戏人生丶
14分钟前
0
0
百人计划 5期 启动报名

温馨提醒: 1. 在2月22日24点前,此公号后台回复「百人计划」可先预定再报名,可以省100 RMB 2. 在2月25日24点前,报名成功的,省50 RMB 3. 一旦报名,一律不退费(建议报名前,想清楚,再报...

IDO老徐
02/20
0
0
Android小知识-如何加载外部dex文件中的类

想要了解插件化,首先得知道如何加载外部的dex文件,这里的插件APK会存放在主APP的assets目录中,用于模拟服务器下载插件。 第一步:创建主项目和插件项目 先创建我们的主项目,并在项目中创...

音视频开发进阶
05/13
0
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部