springMVC-3-获取参数
RequestMapping修饰类
源码:
根据源码可以知道,requestmapping既可以修饰方法也可以修饰类
@Target({ElementType.METHOD, ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Mapping
public @interface RequestMapping {}
总结:
在控制器的类定义及方法定义处都可标注 @RequestMapping
- 类定义处:提供初步的请求映射信息。相对于 WEB 应用的根目录
- 方法处:提供进一步的细分映射信息。相对于类定义处的 URL.
- 若 类定义处未标注 @RequestMapping,则方法处标记的 URL 相对于 WEB 应用的根目录
RequestMapping请求属性
标准的 HTTP 请求报头

method属性-请求方式
在注解中添加属性
@RequestMapping(value = "test1",method = RequestMethod.POST)
之前我们在index.jsp中使用的是a来跳转,这是get请求,也需要改成post、
get请求:
<a href="/mycontrol/test1">test1</a>
post请求:
<form action="/mycontrol/test2" method="post">
<input type="submit">
</form>
params、headers属性-请求参数、请求头
params 和 headers支持简单的表达式:
- param1: 表示请求必须包含名为 param1 的请求参数
- !param1: 表示请求不能包含名为 param1 的请求参数
- param1 != value1: 表示请求包含名为 param1 的请求参数,但其值不能为 value1
- {“param1=value1”, “param2”}:
- 请求必须包含名为 param1 和param2 的两个请求参数,
- 且 param1 参数的值必须为 value1
@RequestMapping(value = "test2",
params = {"username","age!=10"},
headers = {"Accept-Language=zh-CN,zh;q=0.9"})

@RequestMapping可以匹配的url
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
@PathVariable映射URL绑定的占位符
可以直接将url里的参数不通过get方式也能传输到servlet程序中
@RequestMapping(value = "test3/{id}")
public String test3(@PathVariable("id") int id){
System.out.println(id+"输出");
System.out.println("占位符");
return "success";
}
REST中的State Transfer状态转换
HTTP 协议里面,四个表示操作方式的动 词:GET、POST、PUT、DELETE。
-
它们分别对应四种基本操作:
- GET 用来获 取资源
- POST 用来新建资源
- PUT 用来更新资源
- DELETE 用来删除资源。
-
示例:
-
/order/1 HTTP GET :得到 id = 1 的 order
-
/order/1 HTTP DELETE:删除 id = 1的
-
/order/1 HTTP PUT:更新id = 1的
-
/order HTTP POST:新增 order
HiddenHttpMethodFilter
- 浏览器form表单只支持get方法和post请求,而delete和put请求方式并不支持
- 而hiddenhttpmethodfilter这个过滤器就可以把post方式转成delete和put请求
怎么转换
需要在web.xml中配置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>
index.jsp中
- 在DELETE/PUT请求时,需要携带一个name="_method"的隐藏域,值为DELETE/PUT
- name=name="_method" value="PUT"
- 或:name="_method" value="DELETE"
<h1>Rest</h1>
<%--rest--%>
<br>
<form action="/Transfer/test/1" method="post">
<input type="hidden" name="_method" value="PUT"/>
<input type="submit" value="testRest PUT"/>
</form>
<br>
<form action="/Transfer/test/1" method="post">
<input type="hidden" name="_method" value="DELETE"/>
<input type="submit" name="_method" value="testRest DELETE">
</form>
<br>
<form action="/Transfer/test" method="post">
<input type="submit" value="testRest POST"/>
</form>
<br>
<a href="/Transfer/test/1">testRest GET</a>
control中
- 在刚刚配置了DELETE/PUT中我们只需要配置方式属性为对应的方式即可
- 如何获取传入的数据:
- 只需要使用@Pathvariable注解即可
@Controller()
@RequestMapping("Transfer")
public class Transfer {
@RequestMapping(value = "test/1",method = RequestMethod.PUT)
public String testRestPut(@PathVariable("id") Integer id){
System.out.println("更新id为1的数据");
return "rest";
}
@RequestMapping(value = "test/1",method = RequestMethod.DELETE)
public String testRestDelete(@PathVariable("id") Integer id){
System.out.println("删除id为1的数据");
return "rest";
}
@RequestMapping(value ="test",method = RequestMethod.POST)
public String testRestPost(){
System.out.println("新加post发送过来的数据");
return "rest";
}
@RequestMapping(value ="test/1",method = RequestMethod.GET)
public String testRestGet(@PathVariable("id") Integer id){
System.out.println("获取id为1的数据");
return "rest";
}
}
出现问题
当我们去访问delete方式和put方式:

后来才知道tomcat8以上是不支持delete方式和put方式
解决方法:
把目标跳转的jsp的头文件改为(加上了isErrorPage="true")
<%@ page contentType="text/html;charset=UTF-8" language="java" isErrorPage="true" %>
这样可以捕获异常继续执行
1、获取基本类型参数
1.1、使用 @RequestParam 获取请求参数值
@PathVariable主要获取的时rest的那种参数
@RequestParam映射请求参数,属性有:
- values:传入参数的键名
- required:这个参数是不是必须存在的
- defaultValue:没有传入时的默认值
@Controller
@RequestMapping("param")
public class Param {
@RequestMapping(value = "test1")
public String test1(@RequestParam(value = "username",required = false,defaultValue = "无名") String username,
@RequestParam(value = "age",required = false,defaultValue = "0") int age){
System.out.println(username);
System.out.println(age);
return "rest";
}
}
1.2、使用 @RequestHeader 获取请求报头的属性值
类似于@RequestParam()一样的获取数据方式
@Controller
@RequestMapping("param")
public class Param {
@RequestMapping(value = "test1")
public String test1(
@RequestParam(value = "username",required = false,defaultValue = "无名") String username,
@RequestParam(value = "age",required = false,defaultValue = "0") int age,
@RequestHeader(value = "Accept-Language") String al){
System.out.println(al);
System.out.println(username);
System.out.println(age);
return "rest";
}
}
1.3、使用 @CookieValue 绑定请求中的 Cookie 值
类似于@RequestParam()一样的获取数据方式
@Controller
@RequestMapping("param")
public class Param {
@RequestMapping(value = "test1")
public String test1(
@RequestParam(value = "username",required = false,defaultValue = "无名") String username,
@RequestParam(value = "age",required = false,defaultValue = "0") int age,
@RequestHeader(value = "Accept-Language") String al,
@CookieValue(value = "JSESSIONID") String cookie){
System.out.println(cookie);
System.out.println(al);
System.out.println(username);
System.out.println(age);
return "rest";
}
}
1.4、使用 Servlet API 作为入参(放入方法中)
MVC 的 Handler 方法可以接受 哪些 ServletAPI 类型的参数
- HttpServletRequest
- HttpServletResponse
- HttpSession
- java.security.Principal
- Locale • InputStream
- OutputStream
- Reader
- Writer
使用实例:
@RequestMapping(value = "test3")
public String test3(HttpServletRequest request, HttpServletResponse response, Writer out) throws IOException {
System.out.println(request);
System.out.println(response);
out.write("write");
System.out.println();
return "rest";
}
2、获取参数-实体收参(POJO)
POJO实体类
@Data
public class User {
private String username;
private String password;
private String email;
//级联属性
private Address address;
}
@Data
public class Address {
private String province;
private String city;
}
index.jsp
<h1>POJO收参</h1>
<form action="/param/test2" method="post">
<br>
username:<input type="text" name="username">
<br>
password:<input type="password" name="password">
<br>
email:<input type="text" name="email">
<%--级联赋值属性--%>
<br>
province:<input type="text" name="address.province">
<br>
city:<input type="text" name="address.city">
<br>
<input type="submit" value="提交">
</form>
control
- 只需要把我们需要实体化的那个类传入方法即可
@RequestMapping(value = "test2")
public String test2(User user){
System.out.println(user);
return "rest";
}

浙公网安备 33010602011771号