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注解的值来改变默认值