我们都知道,表单中请求参数都是基于 key=value 的。SpringMVC 绑定请求参数的过程是通过把表单提交请求参数,作为控制器中方法参数进行绑定的。
例如:
<a href="/param1?username=张三"> 参数绑定a>
请求参数为username=张三
@GetMapping("/param1")
public String test1(String username){
return "success";
}
1、基本类型参数:
2、POJO 类型参数:
3、数组和集合类型参数:
一、基本类型参数和String
请求地址和参数:
<a href="/param1?username=张三&age=10"> 参数绑定a>
controller方法会处理请求,并把数据回显给客户端。
@Controller
public class ParamController {
@GetMapping("/param1")
public String test1(String username, Integer age, Model model){
model.addAttribute("username",username);
model.addAttribute("age",age);
return "success";
}
}
成功跳转页面success.jsp:
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>成功页面title>
head>
<body>
姓名:${username}<br>
年龄:${age}
body>
html>
测试结果:
点击a标签链接后,会跳转到成功页面。
说明:在方法上的参数名必须和请求参数的属性名保存一致。不然接收不了传递值。
@GetMapping("/param1")
//param1?username=张三&age=10">
public String test1(String name, Integer userage, Model model){
model.addAttribute("username",name);
model.addAttribute("age",userage);
return "success";
}
解决方法:@RequestParam注解。说到该注解的时候会说明。
二、POJO 类型参数
实体类User
@Data
@NoArgsConstructor
@AllArgsConstructor
public class User {
private String username;
private char sex;
private Integer age;
private String address;
}
请求表单,post提交:
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>参数绑定</title>
</head>
<body>
<a href="/param1?username=张三&age=10"> 参数绑定</a>
<br>
<br>
<form action="/pojoParam" method="post">
姓名:<input type="text" name="username"><br>
性别:<input type="text" name="sex"><br>
年龄:<input type="text" name="age"><br>
地址:<input type="text" name="address"><br>
<input type="submit" value="提交">
</form>
</body>
</html>
说明:pojo类型参数请求数据的属性名和实体类的属性名必须一致,不然数据传递不了为null。
controller方法处理请求:
@PostMapping("/pojoParam")
public String test1(User user, Model model){
model.addAttribute("user",user);
return "success";
}
说明:在方法参数上定义实体类参数,springMVC会自动识别把参数封装。
成功页面:
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>成功页面title>
head>
<body>
姓名:${username}<br>
年龄:${age}<br><br><br>
用户:
姓名:${user.username}<br>
性别:${user.sex}<br>
年龄:${user.age}<br>
地址:${user.address}<br>
body>
html>
POJO 类中包含集合类型参数
User
@Data
@NoArgsConstructor
@AllArgsConstructor
public class User2 {
private String username;
private String password;
private Integer age;
private List<Account> accounts;
private Map<String,Account> accountMap;
}
Account
@Data
@NoArgsConstructor
@AllArgsConstructor
public class Account {
private String name;
private double money;
}
form表单数据:
<form action="/collectionParam" method="post">
用户名称:<input type="text" name="username" ><br/>
用户密码:<input type="password" name="password" ><br/>
用户年龄:<input type="text" name="age" ><br/>
账户 1 名称:<input type="text" name="accounts[0].name" ><br/>
账户 1 金额:<input type="text" name="accounts[0].money" ><br/>
账户 2 名称:<input type="text" name="accounts[1].name" ><br/>
账户 2 金额:<input type="text" name="accounts[1].money" ><br/>
账户 3 名称:<input type="text" name="accountMap['one'].name" ><br/>
账户 3 金额:<input type="text" name="accountMap['one'].money" ><br/>
账户 4 名称:<input type="text" name="accountMap['two'].name" ><br/>
账户 4 金额:<input type="text" name="accountMap['two'].money" ><br/>
<input type="submit" value="保存">
form>
controller处理请求:
@PostMapping("/collectionParam")
public String updateAccount(User2 user2, Model model) {
model.addAttribute("user2",user2);
return "success";
}
成功页面:
用户:<br>
用户名称:${user2.username}<br>
用户密码:${user2.password}<br>
用户年龄:${user2.age}<br>
账户:<br>
账户1姓名:${user2.accounts[0].name}<br>
账户1金额:${user2.accounts[0].money}<br>
账户2姓名:${user2.accounts[1].name}<br>
账户2金额:${user2.accounts[1].money}<br>
map:<br>
${user2.accountMap}
一、@RequestParam
注解作用:把请求中指定名称的参数给控制器中的形参赋值。
属性:
案例演示:
请求:
<a href="/param1?username=张三&age=10"> 参数绑定a>
controller方法处理请求
@GetMapping("/param1")
public String test1(@RequestParam(value = "username",required = true) String name, @RequestParam(value = "age",required = true) Integer userage, Model model){
model.addAttribute("username",name);
model.addAttribute("age",userage);
return "success";
}
说明:
二、@RequestBody
注解作用:
属性:
请求表单:
<form action="/useRequestBody" method="post">
用户名称:<input type="text" name="username" ><br/>
用户密码:<input type="password" name="password" ><br/>
用户年龄:<input type="text" name="age" ><br/>
<input type="submit" value="保存">
form>
controller处理方法:
@PostMapping("/useRequestBody")
public String useRequestBody(@RequestBody(required = false) String body) {
System.out.println(body);
return "success";
}
测试结果:
username=admin&password=123456&age=20
三、@PathVariable
注解作用:
属性:
示例使用:
请求:
<a href="/usePathVariable/100">pathVariable 注解a>
controller处理方法:
@GetMapping("/usePathVariable/{id}")
public String usePathVariable(@PathVariable("id") Integer id){
System.out.println("id="+id);
return "success";
}
测试结果:
id=100
四、@RequestHeader
作用:
属性:
jsp 中代码:
<a href="/useRequestHeader">获取请求消息头a>
controller处理方法:
@GetMapping("/useRequestHeader")
public String useRequestHeader(@RequestHeader(value="Accept-Language",
required=false)String requestHeader){
System.out.println(requestHeader);
return "success";
}
五、@CookieValue
作用:
属性:
使用示例:
请求:
<a href="/useCookieValue">绑定 cookie 的值a>
controller处理方法:
@RequestMapping("/useCookieValue")
public String useCookieValue(@CookieValue(value="JSESSIONID",required=false)
String cookieValue){
System.out.println(cookieValue);
return "success";
}
六、@ModelAttribute
作用:
属性:
1、 基于 POJO 属性的基本使用示例:
jps 代码:
<a href="/testModelAttribute?username=test">测试 modelattributea>
controller处理方法:
/**
* 被 ModelAttribute 修饰的方法
* @param user
*/
@ModelAttribute
public void showModel(User user) {
System.out.println("执行了 showModel 方法"+user.getUsername());
}
/**
* 接收请求的方法
* @param user
* @return
*/
@RequestMapping("/testModelAttribute")
public String testModelAttribute(User user) {
System.out.println("执行了控制器的方法"+user.getUsername());
return "success";
}
测试结果:
执行了 showModel 方法test
执行了控制器的方法test
2、 基于 Map 的应用场景示例 一:ModelAttribute 修饰方法带返回值
需求:
jsp 的代码:
<form action="springmvc/updateUser" method="post">
用户名称:<input type="text" name="username" ><br/>
用户年龄:<input type="text" name="age" ><br/>
<input type="submit" value="保存">
form>
controller处理方法:
/**
* 模拟修改用户方法
* @param user
* @return
*/
@PostMapping("/updateUser")
public String updateUser(User user){
System.out.println("控制器中处理请求的方法:修改用户:"+user);
return "success";
}
@ModelAttribute
public User showModel(String username) {
//模拟去数据库查询
User abc = findUserByName(username);
System.out.println("执行了 showModel 方法"+abc);
return abc;
}
private User findUserByName(String username) {
User user = new User();
user.setUsername(username);
user.setAge(19);
user.setPassword("123456");
return user;
}
3 、基于 Map 的应用场景示例 1:ModelAttribute 修饰方法不带返回值
需求:
修改用户信息,要求用户的密码不能修改。
请求表单:
<form action="springmvc/updateUser" method="post">
用户名称:<input type="text" name="username" ><br/>
用户年龄:<input type="text" name="age" ><br/>
<input type="submit" value="保存">
form>
controller处理方法:
/**
* 查询数据库中用户信息
* @param user
*/
@ModelAttribute
public void showModel(String username,Map<String,User> map) {
//模拟去数据库查询
User user = findUserByName(username);
System.out.println("执行了 showModel 方法"+user);
map.put("abc",user);
}
/**
* 模拟修改用户方法
* @param user
* @return
*/
@RequestMapping("/updateUser")
public String testModelAttribute(@ModelAttribute("abc")User user) {
System.out.println("控制器中处理请求的方法:修改用户:"+user);
return "success";
}
/**
* 模拟去数据库查询
* @param username
* @return
*/
private User findUserByName(String username) {
User user = new User();
user.setUsername(username);
user.setAge(19);
user.setPassword("123456");
return user;
}
七、@SessionAttribute
作用:
属性:
使用示例:
jsp 中的代码:
<a href="/testPut">存入 SessionAttributea>
<hr/>
<a href="/testGet">取出 SessionAttributea>
<hr/>
<a href="s/testClean">清除 SessionAttributea>
controller处理方法:
@Controller("sessionAttributeController")
@RequestMapping("/springmvc")
@SessionAttributes(value ={"username","password"},types={Integer.class})
public class SessionAttributeController {
/**
* 把数据存入 SessionAttribute
* @param model
* @return
* Model 是 spring 提供的一个接口,该接口有一个实现类 ExtendedModelMap
* 该类继承了 ModelMap,而 ModelMap 就是 LinkedHashMap 子类
*/
@RequestMapping("/testPut")
public String testPut(Model model){
model.addAttribute("username", "泰斯特");
model.addAttribute("password","123456");
model.addAttribute("age", 31);
//跳转之前将数据保存到 username、password 和 age 中,因为注解@SessionAttribute 中有这几个参数
return "success";
}
@RequestMapping("/testGet")
public String testGet(ModelMap model){
System.out.println(model.get("username")+";"+model.get("password")+";"+model.get("age"));
return "success";
}
@RequestMapping("/testClean")
public String complete(SessionStatus sessionStatus){
sessionStatus.setComplete();
return "success";
}
}
controller 方法在提供了 String 类型的返回值之后,默认就是请求转发。我们也可以写成:
@RequestMapping("/testForward")
public String testForward() {
System.out.println("AccountController 的 testForward 方法执行了。。。。");
return "forward:/WEB-INF/pages/success.jsp";
}
也可以转发到controller内处理方法的请求:
@GetMapping("/hello2")
public String hello2(){
return "forward:/hello";
}
说明:如果用了 formward:则路径必须写成实际视图 url,不能写逻辑视图。它相当于“request.getRequestDispatcher(“url”).forward(request,response)”。使用请求转发,既可以转发到 jsp,也可以转发到其他的控制器方法。
contrller 方法提供了一个 String 类型返回值之后,它需要在返回值里使用:redirect:。
@RequestMapping("/testRedirect")
public String testRedirect() {
System.out.println("AccountController 的 testRedirect 方法执行了。。。。");
return "redirect:testReturnModelAndView";
}
也可以重定向到controller内处理方法的请求。
@GetMapping("/hello3")
public String hello3(){
return "redirect:/hello2";
}
说明:它相当于“response.sendRedirect(url)”。需要注意的是,如果是重定向到 jsp 页面,则 jsp 页面不能写在 WEB-INF 目录中,否则无法找到。