Spring MVC 请求参数封装

使用request封装形式
String username=request.getParameter("username");
自动封装
  • 1、直接在方法的参数列表里出现表单汇总提交的同名参数
package com.bamzhy.controller;

import com.bamzhy.bean.User;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;

@Controller
public class registerController {
    @RequestMapping(path = "/register",method = {RequestMethod.GET,RequestMethod.POST})
    public String register(String username,String password,int age,Model model){
        User user = new User(username, password, age,null);
        model.addAttribute("user",user);
        return "/WEB-INF/haha/user.jsp";
    }
}
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
  <head>
    <title>$Title$</title>
  </head>
  <body>
  <form action="${pageContext.request.contextPath}/register.html" method="post">
    用户名: <input type="text" name="username"/><br>
    密码:: <input type="text" name="password"/><br>
    年龄:: <input type="text" name="age"/><br>
    生日:: <input type="text" name="birthday"/><br>
    <input type="submit" value="提交">
  </form>
  </body>
</html>
  • 2、Bean中还有其他对象引用
    请求参数封装到嵌套JavaBean中
public class User{
    String username;
    String password;
    int age;
    Teacher teacher;
}

public class Teacher{
    int id;
    String name;
}
teacher Id<input type="text" name="teacher.id">
teacher Name<input type="text" name="teacher.name">
请求参数接收数组类型
  • 可以直接放在SpringMVC执行的方法参数上
  • 也可以放在一个JavaBean里,作为成员接收。要求名字一致,有getter和setter
通过PathVariable来获取路径中的参数
@RequestMapping(value="/haha7/{username}/{password}",method=RequestMethod.GET)
    public String test5(@PathVariable String username, @PathVariable String password) {
        System.out.println("username is:"+username);
        System.out.println("password is:"+password);
        return "/index.jsp";
    }
}

比如http://localhost:8080/haha7/gouliguojiashengsiyi/12345,username被置为gouliguojiashengsiyi,password被置为12345

@ RequestHeader 将请求头中符合要求的值赋给带有注解的参数
@RequestMapping("/haha123")
    public String test12(@RequestHeader(value="User-Agent") String userAgent){
        System.out.println("userAgent: "+userAgent);
        return "/WEB-INF/haha/user.jsp";
    }
@ CookieValues 将JSESSIONID赋值给带有此参数的注解(代码中的sessionId)
@RequestMapping("/haha12")
    public String test11(@CookieValue(value="JSESSIONID",defaultValue = "") String sessionId){
        System.out.println("sessionId: "+sessionId);
        return "/WEB-INF/haha/user.jsp";
    }
@ SessionAttributes

SessionAttributes允许我们有选择地指定Model中的哪些属性需要转存到HTTPSession对象中
SessionAttributes 只能声明在类上而不能声明在方法上
- 将Model中的属性名为user的属性放入HttpSession对象中

@ SessionAttributes("user")
public String test{
}
  • 不同的写法
@SessionAttributes(types={User.class},value="user")
  • 可以设置多个对象到HTTPSession中
@SessionAttributes(types={User.class,Dept.class},value={"user","dept"})

types属性用来指定放入HTTPSession当中的对象类型

@ SessionAttribute
  • 该方法放置在参数列表中
  • 作用是从Session里取出对应的值赋给参数user
public String test(@SessionAttribute("user") User user){
}
@ ModelAttribute

ModelAttribute注解类型将请求参数绑定到Model对象
被@ ModelAttribute注释的方法会在Contoll而每个方法执行前被执行,因此在一个Contoller映射到多个URL时候要谨慎使用
- 在方法上使用@ ModelAttribute
SpringMVC在调用目标方法前,将@ ModelAttribute注解的value属性值作为key,返回值作为value存入到model中
结果是想Model中添加一个键值对,key是“user”,value是方法的返回值

  • 在方法参数上使用
    1、只出现注解,不指定名字
    public String test(@ ModelAttribute User user){}

说明了该方法参数的值将由model中取得,如果model中找不到,那么该参数会被先实例化,然后被添加到model中。
在model存在以后,请求中所有名称匹配的参数都会填充到该参数中。这在SpringMVC中被称为数据绑定。

以下代码等价

@RequestMapping(/haha)
public String test(@ ModelAttribute User user){
    return "/index.jsp";
}

@RequestMapping(/haha)
public String test(Model model , User user){
    model.addAttribute("user",user);
    return "/index.jsp";
}
  • 方法和方法参数都出现:去model中取出名字叫user的对象赋值给方法里的user
  • 如果存在多个ModelAttribute标注的方法,返回值为同一个类型User,且@ ModelAttribute的user属性值不同。那么在目标方法处,需要以User实体作为参数
@ModelAttribute("user")
    public User getUser1(){
        return new User("zhangsan","zhangsan",23,null);
    }
    @ModelAttribute("user")
    public User getUser2(){
        return new User("lisi","lisi",25,null);
    }

//不标注
    @RequestMapping("/haha")
    public String test8(User user){
        return "/WEB-INF/haha/user.jsp";
    }
//User: User{username='zhangsan', password='zhangsan', id=23}
        @RequestMapping("/nidaye")

//在形参这里标注具体名字
    public String test9(@ModelAttribute("user2") User user){
        System.out.println("User: "+user);
        return "/WEB-INF/haha/user.jsp";
    }
// User: User{username='lisi', password='lisi', id=25}

//在形参这里不标注具体名字
    public String test10(@ModelAttribute User user){
        System.out.println("User: "+user);
        return "/WEB-INF/haha/user.jsp";
    }
// User: User{username='null', password='null', id=0}
//会根据当前参数类型比如User,使用User首字母小写 user作为key去model里取对应的值。如果没有,则新建一个空的model.
TIP

属性名没有被显式的指定时,框架将会根据属性的类型给与一个默认名称
例如:我们返回一个User类型的对象,则默认的属性名为user
我们可以通过设置@ ModelAttribute注解的值来改变默认值