您的位置:首页 > 编程语言 > Java开发

SpringMVC对RESTful格式的url支持

2017-05-13 16:14 363 查看

什么是RESTful

RESTful架构,就是目前最流行的一种互联网软件架构。它结构清晰、符合标准、易于理解、扩展方便,所以正得到越来越多网站的采用。

RESTful(即Representational State Transfer的缩写)其实是一个开发理念,是对http的很好的诠释。

1、对url进行规范,写RESTful格式的url

非REST的url:http://…../queryItems.action?id=001&type=T01

REST的url风格:http://…./items/001

特点:url简洁,将参数通过url传到服务端

2、http的方法规范

不管是删除、添加、更新。。使用url是一致的,如果进行删除,需要设置http的方法为delete,同理添加。。。

后台controller方法:判断http方法,如果是delete执行删除,如果是post执行添加。

3、对http的contentType规范

请求时指定contentType,要json数据时,设置成json格式的type。。

REST的例子

查询商品信息,返回json数据。

controller

定义方法,进行url映射使用REST风格的url,将查询商品信息传入controller .

输出json使用@ResponseBody将java对象输出json。

/**
* 查询商品信息,输出json
* /testRESTfulLink/{name}/{time}里面的{name}和{time}表示占位符,通过@PathVariable获取占位符中的参数,默认@PathVariable获取与形参名相同的占位符所表示的值。
* 如果@PathVariable获取了一个不存在的占位符的值,如@PathVariable(name = "lang") String xxx,这个就会报异常!!!!
* 在@PathVariable(name = "name")中的name名称可以省略,写成@PathVariable("name")两种都表示获取name占位符中的值。
* 形参顺序没有要求,本来就是通过@PathVariable来获取占位符的值。
* 如果我们的浏览器链接没有和该地址匹配上,也就是说该有占位符的地方浏览器url中没有,那么就会出现404----/testRESTfulLink/{name}/{time}
* 如:/testRESTfulLink/FireLang/2017-05-06 访问正常
* /testRESTfulLink/FireLang 出现404
*
* @param time
* @param xxx
* @return
* @throws Exception
*/
@RequestMapping("/testRESTfulLink/{name}/{time}")
public @ResponseBody ItemCustom testRESTfulLink(@PathVariable String time,@PathVariable(name = "name") String xxx) throws  Exception{
ItemCustom itemCustom = new ItemCustom();
itemCustom.setName(xxx);
itemCustom.setCreatetime(new SimpleDateFormat("yyyy-MM-dd").parse(time));
return  itemCustom;
}


在web.xml配置:

注意:如果要实现这种风格的浏览器,那么前端控制器必须拦截所有的请求,所以要把Servlet的url-pattern设置为
"/"
,当然对于你不需要拦截的请求,你可以根据请求后缀名,如请求.css,.js,.html等后缀结尾的请求包含在外。

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://xmlns.jcp.org/xml/ns/javaee" xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd" id="WebApp_ID" version="3.1">
<!-- SpringMVC前端控制器 -->
<servlet>
<servlet-name>SpringMVC</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<!-- contextConfigLocation配置SpringMVC加载的配置文件(配置处理器映射器、适配器等等)
如果不配置contextConfigLocation,默认加载的是/WEB-INF/servlet名称-servlet.xml(SpringMVC-servlet.xml)
-->
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:Spring/applicationContext*.xml</param-value>
</init-param>
<!-- 配置servlet创建的优先级 -->
<load-on-startup>1</load-on-startup>
</servlet>

<servlet-mapping>
<servlet-name>SpringMVC</servlet-name>
<!--
第一种:*.action,访问以.action结尾由DispatcherServlet进行解析
第二种:/,所以访问的地址由DispatcherServlet进行解析,对于静态文件的解析需要配置不让DispatcherServlet进行解析,对于静态文件的解析需要配置,不让DispatcherServlet进行解析。
使用此种方式可以实现 RESTful 风格的url 。
第三种:/*,这样配置不对,使用这种配置,最终要转发到一个jsp页面时,仍然会由DispatcherServlet解析jsp地址,不能根据jsp页面找到Handler,会报错。
-->
<url-pattern>/</url-pattern>
</servlet-mapping>
<!-- post乱码过虑器 -->
<filter>
<filter-name>CharacterEncodingFilter</filter-name>
<filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>
<init-param>
<param-name>encoding</param-name>
<param-value>utf-8</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>CharacterEncodingFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>

<!-- 这里就是去掉那些不需要被前端控制器处理的请求,让Tomcat默认servlet帮你解析 -->
<servlet-mapping>
<servlet-name>default</servlet-name>
<url-pattern>*.jpg</url-pattern>
</servlet-mapping>
<servlet-mapping>
<servlet-name>default</servlet-name>
<url-pattern>*.js</url-pattern>
</servlet-mapping>
<servlet-mapping>
<servlet-name>default</servlet-name>
<url-pattern>*.css</url-pattern>
</servlet-mapping>

<welcome-file-list>
<welcome-file>index.html</welcome-file>
<welcome-file>index.htm</welcome-file>
<welcome-file>index.jsp</welcome-file>
<welcome-file>default.html</welcome-file>
<welcome-file>default.htm</welcome-file>
<welcome-file>default.jsp</welcome-file>
</welcome-file-list>
</web-app>


你会看都别人是下面这种写法来排除访问静态资源:

在springmvc.xml中添加静态资源解析方法。



mapping表示要过滤的访问路径(
"/**" 表示过滤所有层级路径
),不让前端控制器来处理。

location表示过滤请求后要访问的静态资源路径。

关于访问静态文件的配置方式你可以查看该博客

本博客代码下载
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: