SpringMVC中映射请求参数,即@RequestParam、@RequestHeader、@CookieValue注解

  • 默认情况下请求中的参数会与方法参数名字一样的形参自动装配,但是如果名字不一致,就不行了,这时就需要注解了。
  • 可以对方法及方法入参标注相应的注解( @PathVariable 、@RequestParam、@RequestHeader 等)、Spring MVC 框架会将 HTTP 请求的信息绑定到相应的方法入参中,并根据方法的返回值类型做出相应的后续处理。

@RequestParam注解

在处理方法入参的时候使用@RequestMapping可以将请求参数传递给请求方法
例如,在这个请求方法中,public String test(@RequestParam(“uid”) Integer id);会将请求中key为uid的参数赋值给方法id这个参数,如果请求中不带uid这个参数,就会报错,但是可以通过配置@RequestPatam的属性,将某一个属性设置为不是必须的。

 @RequestMapping("/param")
    public String test(@RequestParam(value = "uid", required = false) Integer id){
        return "hello";
    }

在这里插入图片描述
SpringMVC中映射请求参数,即@RequestParam、@RequestHeader、@CookieValue注解_第1张图片

  • value:参数名
  • required:是否必须。默认为 true, 表示请求参数中必须包含对应的参数,若不存在,将抛出异常

public String test(@RequestParam(value = “uid”, required = false) Integer id), 将required的值设置为false,那么就算请求参数中没有这个参数uid,也不会报错。

@RequestHeader

请求头包含了若干个属性,服务器可据此获知客户端的信息,通过 @RequestHeader 即可将请求头中的属性值绑定到处理方法的入参中
例如:public String test1(@RequestHeader(“Accept-Encoding”) String encoding);获取请求头中Accept-Encoding所带的值,如果没有带则会报错,可以通过设置required属性修改

  • value:参数名
  • required:是否必须,默认为true,表示请求中必须包含对应的参数,若不存在,将抛出异常
  • defaultValue:设置默认值,如果请求中不存在对应参数,那么这个参数的默认值就是这个属性设置的
  @RequestMapping("/param1")
    public String test1(@RequestHeader(value = "Accept-Encoding" ) String encoding){
        System.out.println(encoding);
        return "hello";
    }

@CookieValue

@CookieValue 可让处理方法入参绑定某个 Cookie 值。
获取某个cookie的值,并将这个值给对应的参数。

   @RequestMapping("/cookie")
    public String cookieTest(@CookieValue("JSESSIONID") String session){
        System.out.println(session);
        return "hello";
    }

获取浏览器中JSESSIONID的值,如果浏览器中没有JSESSIONID就直接请求,那么将会报错。同样,可以通过设置required值,来说明这个参数是否必须存在。

 	@RequestMapping("/cookie")
 	// 不一定必须存在这个cookie
    public String cookieTest(@CookieValue(value = "JSESSIONID", required = false) String session){  
        System.out.println(session);
        return "hello";
    }

上边介绍的是通过注解的方式,为参数映射值,还可以使用 POJO 对象绑定请求参数值。

创建两个实体类,一个是People类,一个是Department类,People类中有个Department类型的属性。
People.java

public class People {
    private String name;
    private Integer age;
    private Department department;

Department.java

public class Department {
	private Integer id;
	private String departmentName;
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>People</title>
</head>
<body>
<form action="/addPeople" method="post">
    姓名:<input name="name" type="text"/><br>
    年龄: <input name="age" type="text"/><br>
    <input type="submit" value="提交" >
</form>
</body>
</html>

表单中,输入表单的name属性要与POJO类的属性一一对应,这样SpringMVC才能获取对应的值,装配到POJO中。
例如,我上边写的,运行起来,效果如下

在浏览器中添加:
SpringMVC中映射请求参数,即@RequestParam、@RequestHeader、@CookieValue注解_第2张图片
提交之后,控制台输出:
SpringMVC中映射请求参数,即@RequestParam、@RequestHeader、@CookieValue注解_第3张图片
因为,输入表单中没有输入与department对应的值,所以 department 属性为null,为类类型的属性赋值,需要用到级联属性。
为类类型属性赋值,输入框的name属性值为 “类类型属性名.属性”,在这个例子中,类类型属性是 department ,为这个属性赋值,使用 department.这个类对应的属性名称 ,比如:department .id;

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>People</title>
</head>
<body>
<form action="/addPeople" method="post">
    姓名:<input name="name" type="text"/><br>
    年龄: <input name="age" type="text"/><br>
    部门id:<input name="department.id" /><br>  
    部门名字:<input name="department.departmentName" /><br>
    <input type="submit" value="提交" >
</form>
</body>
</html>

SpringMVC中映射请求参数,即@RequestParam、@RequestHeader、@CookieValue注解_第4张图片
提交之后,控制台输出
SpringMVC中映射请求参数,即@RequestParam、@RequestHeader、@CookieValue注解_第5张图片除了以上方式之外,使用 Servlet API 作为入参

  • HttpServletRequest
  • HttpServletResponse
  • HttpSession
  • Locale:国际化有关区域信息对象
  • InputStream
  • OutputStream
  • Reader
  • Writer
// 使用原生WEB的API
@RequestMapping("/param03")
public String test04(HttpServletRequest request, HttpSession session){
    request.setAttribute("req", "我是请求域中的值");
    session.setAttribute("ses", "我是Session中的值");
    return "success";
}

你可能感兴趣的:(spring学习之路,SpringMVC,请求参数,映射参数)