1、概述
常规请求方式:
https://www.vatapi.com/book/query.do?page=12&pageSize=20
restful风格请求方式:
https://www.vatapi.com/book/query/12/20
显而易见,restful风格的请求方式简洁、安全性高。(谁知道哪个值对应哪个参数,代表什么意思。。。)
要把常规请求方式转换成restful风格,需要三步:
- 在web.xml中把核心控制器 \color{green}{核心控制器}核心控制器的
url-pattern
的值由/*.do
改为/
。一般在修改成restful风格前,url-pattern
的值是/*.do
,表示拦截所有动态请求;
注:“拦截”指处理器映射器寻找控制器的过程。 - 在 @RequestMapper 中,在路径后加
{a}
,比如上述的query.do
,@RequestMapper 内的值是“query
”,现在改成“query/{a}
”; - 在 @RequestMapper 注解的方法形参前加
@PathVariable
,用以映射参数值。
举个例子:
那请求就是:
${pageContext.request.contextPath}/book/queryBySyllabusId/12
2、使用细节
2.1 关于第一步
拦截的路径在修改前是/*.do
,表示只拦截以.do
结尾的请求。一般在请求后加.do
,表示访问动态资源。比如login.do、query.do
。
将路径修改为/
后,表示拦截所有请求,也包括类似login.do
这样的动态资源请求。那问题来了,现在拦截路径是/
,而请求是login.do
,为什么处理器映射器还能找到@RequestMapper("login")
这个控制器?
从SpringMVC的源码以及一些资料中得知,springmvc在底层排除掉了login.do
中的.do
。
2.2 关于请求数据封装机制
restful风格完全抛弃了SpringMVC的请求数据封装机制(映射封装),如上述:https://www.vatapicom/book/query/12/20
中的12、20
,并没有参数与其绑定,映射关系完全取决于控制器形参前@PathVariable
注解内的值.
2.3 补充第一点
SpringMVC底层会排除掉请求后的后缀。因此,对于访问非restful控制器,在请求时加不加后缀.do
都可行。
因此,restful风格的配置不会影响其他非restful控制器,对于其他非restful控制器的访问不用修改。但是,需要注意的是,访问restful控制器时不能加后缀,如:
https://www.vatapi.com/book/query/12/20 √ https://www.vatapi.com/book/query/12/20.do ×
2.4 关于静态资源的访问
关于静态资源配置,推荐一篇博文《SpringMVC访问静态资源 mvc:resources》(转发)。
由于restful风格的配置会拦截所有资源,也包括静态资源(如:image、css、js)。
https://www.vatapi.com/gd-book/28282718.jpg // 找不到图片 https://www.vatapi.com/css/menu.css // 找不到css,页面没有样式 https://www.vatapi.com/js/index.js // 找不到js,页面没有功能
这样的请求是访问一张图片,但处理器映射器会把他当作一个对控制器的访问去寻找控制器,而不会去寻找图片,自然无法找到图片。因此,需要对静态资源做配置。
<mvc:resources location="/static/" mapping="/static/**" /> // 举例
2.5 关于拦截器
在配置拦截器时,若拦截的是restful控制器,{}
内不需要一致。
示例:
<mvc:mapping path="/commonQuestion/queryByQuestionId/{questionId}"/>
{questionId}
内的questionId
可任意名称。
3、最后
本文的文面有点乱,这是因为restful风格的使用细节比较多,那五点是我在使用restful风格时所遇到问题的总结。
本文完结。