- @RequestMapping除了可以修饰方法,还可以修饰类.
-
类定义处:提供初步的请求映射信息,相对于web应用的根目录
-
方法处:提供进一步的细分映射信息,相对于类定义处,若类定义处为标注@RequestMapping,则方法标记的URL相对于WEB应用的跟目录
-
示例:使用@RequestMapping修饰类
package mao.shu.springmvc.action;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
@RequestMapping("/hello")
@Controller
public class HelloWorld {
@RequestMapping("/HelloWorld")
public String execute(){
System.out.println("Hello World");
return "success";
}
}
- 此时HelloWorld类处理的请求路径就是:http://localhost:8080/SpringMVCModule1/hello/HelloWorld
- 格式为:
项目跟路径/类映射路径/方法映射路径
RequestMapping请求方式
- 网页有不同的请求方法,其中常用的为:get和post两种请求
使用@RequestMapping映射请求方法
示例:
@RequestMapping(value="/HelloWorld",method = RequestMethod.POST)
public String execute(){
System.out.println("Hello World");
return "success";
}
- 在jsp页面中使用表单的方式请求该方法
<form method="post" action="hello">
<input type="submit" value="提交"/>
</form>
请求参数和请求头
在"@RequestMapping"注解中使用params参数来描述请求中提交参数的控制,使用headers描述请求头的控制
- 示例:
//请求必须包含uname和password两个参数
//并且uname参数值必须是"admin"
//age参数值必须是"123"
//请求头中,Accept-Language 参数必须为 zh-CN
@RequestMapping(value = "/testParamsAndHeaders",
params = {"uname=admin", "age=22"},
headers ="Accept-Language=zh-CN")
public String testParamsAndHeaders() {
return "success";
}
Ant路径
- Ant 风格资源地址支持 3 种匹配符:
- ?:匹配文件名中的一个字
- *:匹配文件名中的任意字符
- **:** 匹配多层路径
@RequestMapping 支持 Ant 风格的 URL:
-
/user/*/createUser: 匹配
- /user/aaa/createUser
- /user/bbb/createUser 等 URL
-
/user/**/createUser: 匹配
- /user/createUser
- /user/aaa/bbb/createUser 等 URL
-
/user/createUser??: 匹配
- /user/createUseraa
- /user/createUserbb 等 URL
-
示例:
@RequestMapping(value = "/testAntPath/**/abc")
public String testAntPath() {
return "success";
}
PathVariable注解
- 示例:
//在映射路径中设置一个占位符"{var}"
//在方法参数中接收这个占位符作为方法的参数值
@RequestMapping(value = "/testPathVariable/{var}")
public String testPathVariable(@PathVariable("var") String var) {
System.out.println("testPathVariable - var = "+var);
return "success";
}
HiddenHttpMethodFilter过滤器
- html的基本表单<form>只支持"post"和"get"请求,而不支持"DELETE"和"put"请求,如果想要执行"Delete"和"put"请求可以利用SpringMVC框架中的"HiddenHttpMethodFilter"过滤器进行转换
- 观察HiddenHttpMenthodFilter类中的处理源码
- 在HiddenHttpMethodFilter类中从post请求中区分出"DELETE"和"Put"请求,区分的标识符是"_method".
- 所以如果要进行"DELTE"或"Put"请求,则也需要由post请求转换,但是需要提交一个"_method"参数来区分.
配置HiddenHttpMethodFilter过滤器
- 可以在web.xml文件中配置HiddenHttpMethodFilter过滤器
<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>
- 测试编写四个方法,处理四种请求
@RequestMapping(value="/testDelete/{id}",method=RequestMethod.PUT)
public String testPut(@PathVariable("id") Integer id){
System.out.println("testPut请求处理 请求参数 id=" +id);
return "success";
}
@RequestMapping(value="/testDelete/{id}",method=RequestMethod.DELETE)
public String testDelete(@PathVariable("id") Integer id){
System.out.println("testDelete请求处理 请求参数 id=" +id);
return "success";
}
@RequestMapping(value="/testPost")
public String testPost(){
System.out.println("post请求");
return "success";
}
@RequestMapping(value="/testGet/{id}",method=RequestMethod.GET)
public String testGet(@PathVariable("id") Integer id){
System.out.println("get请求处理 请求参数 id=" +id);
return "success";
}
- 定义测试页面,创建四个表单,使用<input type=hidden> 标签来区分请求
<%--
Created by IntelliJ IDEA.
User: Xiemaoshu
Date: 2019/3/6
Time: 22:59
To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>$Title$</title>
</head>
<body>
<form method="post" action="testPut/">
<input type="submit" value="提交"/>
<%--使用隐藏域 提交"_method" 参数,表示delete请求--%>
<input type="hidden" value="PUT" name="_method"/>
<input type="hidden" value="1" name="id"/>
</form>
<br>
<br>
<form method="post" action="testDelete/">
<input type="submit" value="提交"/>
<%--使用隐藏域 提交"_method" 参数,表示delete请求--%>
<input type="hidden" value="DELETE" name="_method"/>
<input type="hidden" value="1" name="id"/>
</form>
<br>
<br>
<form method="post" action="testPost">
<input type="submit" value="提交"/>
<input type="hidden" value="1" name="id"/>
</form>
<br>
<br>
<a href="/testGet/1">testGet</a>
</body>
</html>
- 依次测试之后,后台输出
- 成功输出则表示配置成功.
- 如果Tomcat的版本为8或以上,可能jsp页面中会出现错误,表示jsp页面无法处理除了get和post或者head请求之外的请求,但是后台可以正常输出.
-
这是因为,HiddenMethodFilter将请求转换为了"delete"和"put"但是在返回的时候,没有将方法转换为"get"或 post",而jsp页面无法接收除了get或post之外的请求,所以出现了错误,
-
解决思路有:
- 降低tomcat的版本
- 先跳转到其他页面,然后再跳转到jsp页面
- 在跳转的jsp页面头上 添加"isErrorPage"属性,属性值设置为"true"(感觉不是很好,不建议这样使用)
- 请求的方法上添加"@ResponseBody" 注解,表示该方法返回的是回应信息,于是会直接返回字符串不会跳转到指定的jsp页面(这种方式已经偏离了业务需求,也不建议这样使用)
-
我也还未想到更好的方法,如果有哪位大侠有更好的办法,请告诉我,感谢