注解位置
- 类定义处
提供初步的请求映射信息。相对于WEB应用的根目录。 - 方法处
提供进一步的细分映射信息。相对于类定义处的URL,若类定义处未标注@RequestMapping,则方法处标记的URL相对于WEB应用的根目录。
如:
@RequestMapping("/springmvc")
@Controller
public class SrpingMVCTest {
private static final String SUCCESS = "success";
/**
* 1. @RequestMapping 除了修饰方法,还可修饰类
* 2. 区别:
* 1). 类定义处:提供初步的请求映射信息。相对于WEB应用的根目录。
* 2). 方法处:提供进一步的细分映射信息。相对于类定义处的URL,
* 若类定义处未标注@RequestMapping,则方法处标记的URL相对于WEB应用的根目录。
* @return
*/
@RequestMapping("/testRequestMapping")
public String testRequestMapping() {
System.out.println("testRequestMapping");
return SUCCESS;
}
}
访问http://localhost:8080/springMVC1/springmvc/testRequestMapping
,会被该方法处理,注意其中是类定义的@RequestMapping和方法的@RequestMapping共同拼成的URL(springmvc/testRequestMapping)。
请求方式
HTTP请求分为POST和GET请求(DELETE、PUT),通过@RequestMapping中的method属性,可以设置处理请求的请求方式。
Java代码如下:
/**
* 常用:使用method属性指定请求方式
*/
@RequestMapping(value = "/testMethod", method = RequestMethod.POST)
public String testMethod() {
System.out.println("testMethod");
return SUCCESS;
}
Jsp访问代码如下:
<body>
<form action="springmvc/testMethod" method="POST">
<input type="submit" value="submit">
</from>
<a href="springmvc/testMethod">Test Method</a>
<br />
<a href="springmvc/testRequestMapping">Test RequestMapping</a>
<br />
<a href="helloworld">Hello World</a>
</body>
请求参数和请求头(了解)
在@RequestMapping中,有两个属性,params
设置请求参数,headers
设置请求头,从命名上看,是复数,说明可以设置多个值。
params和headers支持简单的表达式
:
- param1:表示请求必须包含名为param1的请求参数
- !param1:表示请求不能包含名为param1的请求参数
- param1 != value1:表示请求包含名为param1的请求参数,但其值不能为value1
- {“param1=value1”,”param2”}:请求必须包含名为param1和param2的两个请求参数,且param1参数的值必须为value1
headers同理,也可以设置。
示例代码:
/**
* 了解: 可以使用params和headers来更加精确的映射请求,params和headers支持简单的表达式
* 请求参数中必须含有username和age两个属性,求age不能等于10
*/
@RequestMapping(value = "/testParamsAndHeaders", params = { "username",
"age!=10" }, headers = "Accept-Language=zh-CN")
public String testParamsAndHeaders() {
System.out.println("testParamsAndHeaders");
return SUCCESS;
}
URL通配符
@RequestMapping支持Ant风格资源地址的3种通配符
- ? :匹配一个字符
- * :匹配任意多个字符
- ** :匹配任意多层路径
示例代码:
/**
* 该方法处理/testAndPath/任意字符串/abc
*/
@RequestMapping("/testAndPath/*/abc")
public String testAndPath() {
System.out.println("testAndPath");
return SUCCESS;
}
@PathVariable(映射URL绑定的占位符)
带占位符的URL是Spring3.0新增的功能,该功能在SoringMVC向REST
目标挺进发展过程中具有里程碑的意义。
通过@PathVariable可以将URL中占位符参数绑定到控制器处理方法的入参中
:URL中的{XXX}占位符可以通过@PathVariable(“XXX”)绑定到操作方法的入参中。
示例代码:
/**
* @PathVariable 可以来映射URL中的占位符到目标方法的参数中
*/
@RequestMapping("/testPathViariable/{myId}")
public String testPathViariable(@PathVariable("myId") int id) {
System.out.println("testPathViariable " + id);
return SUCCESS;
}
注意:占位符{X}要与@PathVariable(“X”)的X名字一致。
REST
- REST:即 Representational State Transfer。(资源)表现层状态转化。是目前最流行的一种互联网软件架构。它结构清晰、符合标准、易于理解、扩展方便,所以正得到越来越多网站的采用。
- 资源(Resources):网络上的一个实体,或者说是网络上的一个具体信息。它可以是一段文本、一张图片、一首歌曲、一种服务,总之就是一个具体的存在。可以用一个URI(统一资源定位符)指向它,每种资源对应一个特定的 URI 。要获取这个资源,访问它的URI就可以,因此 URI 即为每一个资源的独一无二的识别符。
- 表现层(Representation):把资源具体呈现出来的形式,叫做它的表现层(Representation)。比如,文本可以用 txt 格式表现,也可以用 HTML 格式、XML 格式、JSON 格式表现,甚至可以采用二进制格式。
- 状态转化(State Transfer):每发出一个请求,就代表了客户端和服务器的一次交互过程。HTTP协议,是一个无状态协议,即所有的状态都保存在服务器端。因此,如果客户端想要操作服务器,必须通过某种手段,让服务器端发生“状态转化”(State Transfer)。而这种转化是建立在表现层之上的,所以就是 “表现层状态转化”。具体说,
就是 HTTP 协议里面,四个表示操作方式的动词:GET、POST、PUT、DELETE。它们分别对应四种基本操作:GET 用来获取资源,POST 用来新建资源,PUT 用来更新资源,DELETE 用来删除资源。
HiddenHttpMethodFilter
浏览器 form 表单只支持 GET与 POST 请求,而DELETE、PUT 等 method 并不支持,Spring3.0 添加了一个过滤器,可以将这些请求转换为标准的 http 方法,使得支持 GET、POST、PUT 与DELETE 请求。
HiddenHttpMethodFilter可以将POST转换成DELETE或PUT请求,过程如下。
配置过滤器
在/WEB-INF/web.xml中增加如下代码:
<!-- 配置 org.springframework.web.filter.HiddenHttpMethodFilter : 可以把POST请求转为 DELETE
或 PUT请求 -->
<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>
编写代码
在源码中增加如下代码:
/**
* Rest风格的URL.
* 以CRUD为例:
* 新增: /order POST 传统方式↓
* 修改: /order/1 PUT update?id=1
* 获取: /order/1 GET get?id=1
* 删除: /order/1 DELETE delete?id=1
*
* 如何发送PUT请求和DELETE请求呢?
* 1. 需要配置HiddenHttpMethodFilter
* 2. 需要发送POST请求
* 3. 需要在发送POST请求时,携带一个name="_method"的隐藏域,值为DELETE或PUT
*
* 在SpringMVC的目标方法中如何得到id呢?
* 使用@PathVariable注解
*/
@RequestMapping(value = "/testRest/{id}", method = RequestMethod.PUT)
public String testRestPut(@PathVariable("id") int id) {
System.out.println("testRest Put: " + id);
return SUCCESS;
}
@RequestMapping(value = "/testRest/{id}", method = RequestMethod.DELETE)
public String testRestDelete(@PathVariable("id") int id) {
System.out.println("testRest Delete: " + id);
return SUCCESS;
}
@RequestMapping(value = "/testRest", method = RequestMethod.POST)
public String testRest() {
System.out.println("testRest POST");
return SUCCESS;
}
@RequestMapping(value = "/testRest/{id}", method = RequestMethod.GET)
public String testRest(@PathVariable("id") int id) {
System.out.println("testRest GET: " + id);
return SUCCESS;
}
编写前端代码
<form action="springmvc/testRest/1" method="post">
<input type="hidden" name="_method" value="PUT">
<input type="submit" value="TestRest PUT">
</form>
<br />
<form action="springmvc/testRest/1" method="post">
<input type="hidden" name="_method" value="DELETE">
<input type="submit" value="TestRest DELETE">
</form>
<br />
<form action="springmvc/testRest" method="post">
<input type="submit" value="TestRest Post">
</form>
<br />
<a href="springmvc/testRest/1">Test Rest Get</a>
<br />
其中,要form表单有一个input,类型为hidden,name为“_method
”,value=“转换的指定请求类型DELETE
、PUT
”。
这样请求可以通过过滤器修改成响应的请求方式,被相应的处理器方法处理。