SpringMVC 学习笔记
@RequestMapping
@RequestMapping注解用于为控制器指定可以处理哪些URL请求,在类和方法定义上都可以标注,
- 在类上定义:提供初步的映射信息,相对于web应用的根目录。
- 在类方法上定义:提供进一步的细分映射信息,在类映射路径的基础上进行映射定义。如果类上没有定义映射,则方法上定义的映射路径相对于web应用的根目录。
DispatcherServlet在截获HTTP请求后,就通过控制器上@RequestMapping信息确定该请求的具体映射路径,从而确定该请求对应的处理方法。
@ResquestMapping请求路径映射的多种方式
- 根据请求路径URL,对应注解属性value。
- 根据请求方法,对应注解属性method。
- 根据请求参数,对应注解属性params。
- 根据请求头参数,对应注解属性headers。
上述四种映射方式可以同时使用,这样能够使请求路径的映射更加精确。
- params、headers属性的几种用法
- params={"param1"}:表示请求必须包含param1参数。
- params={"!param1"}:表示请求必须不包含param1参数。
- params={"param1=value1","param2=value2"}:表示请求必须包含param1和param2参数,但是param1的值不能是value1,param2的值必须是value2。
headers属性的用法和params属性的用法一样。
- @ResquestMapping的映射属性value支持Ant风格的通配符注解
- ?:匹配路径中的一个字符。
- :匹配路径中的任意多个字符。
- ** :匹配任意多层路径。
@PathVariable
@PathVariable映射URL绑定的占位符。通过@PathVariable可以将URL请求路径中的占位符参数绑定到对应的处理器方法的形式参数中。主要是处理“/path/{param}“这样的请求,用来将请求中的路径参数param对应到处理方法的形式参数上。
@RequestMapping(value="/path/{xxx}")
@PathVariable("xxx")
使用上述的注解方式,即可将URL中xxx绑定到处理器方法的形式参数中。
- 如果处理器方法的形式参数名称和请求URL的占位符参数一样,则@PathVariable中可以为空。如果两者的名称不一样,则必须在@PathVariable中指定占位符参数的名称,这样才能正确绑定到方法的形式参数上。
- 正是因为@PathVariable的特性,才使得SpringMVC支持REST风格的URL。
REST
REST:Representational State Transfer。(资源)表现层状态转化。
-
REST主要具有四种特性:
- 资源:网络上的每一个实体,每一个URL请求的具体信息,诸如一段文字、图片、视频、音频等都可以作为一种资源,在系统中,是一种具体的存在。对于每一种资源,使用一个唯一的URI(统一资源定位符)标识。因此,对于特定资源的访问就是对特定URI的访问。
- 表现层:把资源以何种的形式展现出来(这里的展现,是指资源在后端取出后,如何呈现给前端)。常用的可以采用JSON、XML、二进制、HTML、文本等。
- 状态转化:状态转化指的是服务器端的状态转化。每发送一个请求,就表示客户端和服务器端的一次交互过程。HTTP协议是无状态的,即所有的状态都是保存在服务器端,HTTP请求本身并不会携带任何有关客户端和服务器端的状态。因此如果想控制服务器资源的状态,则客户端必须使用特定的方法,因为REST基于HTTP协议,因此,针对资源的状态转化对应于HTTP请求的四种方法:GET(获取)、PUT(更新)、POST(新建0和DELETE(删除)
-
HiddenHttpMethodFilter:可以将POST请求转化为PUT和DELETE请求。(form表单只支持GET和POST请求)使用HiddenHttpMethodFilter需要在web.xml中配置filter参数。
浏览器form表单只支持GET与POST请求,而DELETE、PUT等method并不支持,spring3.0添加了一个过滤器,可以将这些请求转换为标准的http方法,使得支持GET、POST、PUT与DELETE请求,该过滤器为HiddenHttpMethodFilter。
<!--配置HiddenHttpMethodFilter,作用是可以把POST请求转化为PUT和DELETE请求-->
<filter>
<filter-name>HiddenHttpMethodFilter</filter-name>
<filter-class>org.springframework.web.filter.HiddenHttpMethodFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>HiddenHttpMethodFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
HiddenHttpMethodFilter的filter配置在web.xml中必须置于dispatcherservlet配置之前。
HiddenHttpMethodFilter的父类是OncePerRequestFilter,它继承了父类的doFilterInternal方法,工作原理是将jsp页面的form表单的method属性值在doFilterInternal方法中转化为标准的Http方法,即GET,、POST、 HEAD、OPTIONS、PUT、DELETE、TRACE,然后到Controller中找到对应的方法。
需要注意的是,由于doFilterInternal方法只对method为post的表单进行过滤。配置HiddenHTTPMethodFilter之后,在发送诸如PUT、DELETE请求时,应该通过form表单的形式。
<form action="..." method="post">
<input type="hidden" name="_method" value="put" />
......
</form>
而不是
<form action="..." method="put">
......
</form>
@RequestParam
在处理方法的形式参数上使用@RequestParam可以将请求参数传递给请求方法。主要是用来处理“/path?param1=?&¶m2=?”这样的请求,提取其中的param1和param2并对应到处理方法的形式参数上。
它有两个主要属性:
- value:参数名。
- required:是否必须。是一个boolean值,默认为true。表示请求参数中必须包含对应的参数,如果不存在,则会抛出异常。
@PathVariable和@RequestParam区别(类似于@PathParamhe和@QueryParam?)
@RequestHeader
请求头会包含若干个请求的属性信息,使用@RequestHeader可以将请求头中的属性值绑定到对应处理方法的形式参数上。
它与@RequestParam有一样的属性,使用方法一样。
@CookieValue
@CookieValue可以将请求中的cookie值绑定到处理方法的对应形式参数上。
它与@RequestParam有一样的属性,使用方法一样。
网友评论