解决请求参数绑定时 请求参数名 不一致的情况。
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>Titletitle>
head>
<body>
<%-- 前台这里用的 是 uname--%>
<a href="${pageContext.request.contextPath}/anno/testRequestParam?uname=xptx">testRequestParama>
body>
html>
package com.springmvc.controller;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
/**
* 常见的注解
*/
@Controller
@RequestMapping("/anno")
public class AnnotionController {
/**
* 前台 jsp 页面参数名称是 uname ,如果后台用 username 是无法绑定成功的,
* 所以需要用 @RequestParam 注解进行绑定一下。
* @param username
* @return
*/
@RequestMapping("/testRequestParam")
public String testRequestParam(@RequestParam(name="uname") String username) {
System.out.println("执行了。。。。。");
System.out.println(username);
return "success";
}
}
获取请求体的内容:
- 必须是 post 请求,get 请求会报 400 的错误。
<form action="${pageContext.request.contextPath}/anno/testRequestBody" method="post">
用户名:<input type="text" name="username"> <br>
密码: <input type="password" name="password"> <br>
<input type="submit" value="提交">
form>
@RequestMapping("/testRequestBody")
public String testRequestBody(@RequestBody String body) {
System.out.println(body);
return "success";
}
拥有**绑定 url 中的 占位符**。例如: url 中有 /delete/{id},{id} 就是占位符。
一般都和 RestFul 风格结合起来使用。
<a href="${pageContext.request.contextPath}/anno/testPathVariable/18">testRequestParama>
@RequestMapping("/testPathVariable/{sid}")
public String testPathVariable(@PathVariable(name="sid") String id) {
System.out.println(id);
return "success";
}
作用 :
- 出现在方法上,表示当前方法会在控制器的方法执行之前,先执行。可以修饰没有返回值的方法,也可以修饰有返回值的方法。
- 出现在参数上,获取指定的数据给参数赋值。
应用场景: :
- 当表单提交数据不是完整的实体数据时,保证没有提交数据的字段使用数据库原来的字段。
- 例如:我们在编辑一个用户时,用户拥有一个创建信息的字段,该字段的值是不允许被修改的,在提交表单数据是必然没有此字段的内容,一旦更新后会把该字段内容设置为 null,当遇到类似的问题时,就可以使用该注解来解决问题。
<form action="${pageContext.request.contextPath}/anno/testModelAttribute" method="post">
用户名:<input type="text" name="studentName"> <br>
年龄: <input type="text" name="studentAge"> <br>
<input type="submit" value="提交">
form>
@RequestMapping("/testModelAttribute")
public String testModelAttribute() {
System.out.println("执行了。。。。。");
return "success";
}
@ModelAttribute
public void showUser() {
System.out.println("执行了showUser 方法");
}
可以看到,控制器先执行了 @ModelAttribute 的方法。
当表单提交的数据不完整时:
可以看到, birth 的值是 null。
带返回值的 @ModelAttribute 方法:
@RequestMapping("/testModelAttribute")
public String testModelAttribute(Student student) {
System.out.println("执行了。。。。。");
System.out.println(student);
return "success";
}
@ModelAttribute
public Student showUser(String studentName) {
// 根据 studentName 从数据库中拿到数据(模拟)
Student student = new Student();
student.setStudentName(studentName);
student.setStudentAge(18);
student.setBirth(new Date());
return student;
}
不带返回值的 @ModelAttribute 方法:
@RequestMapping("/testModelAttribute")
public String testModelAttribute(@ModelAttribute("abc") Student student) {
System.out.println("执行了。。。。。");
System.out.println(student);
return "success";
}
/**
* 当没有返回值时,需要提供一个 Map 集合,存储对象,然后与上述方法相对应
* @param studentName
* @param map
*/
@ModelAttribute
public void showUser(String studentName, Map<String,Student> map) {
// 根据 studentName 从数据库中拿到数据(模拟)
Student student = new Student();
student.setStudentName(studentName);
student.setStudentAge(18);
student.setBirth(new Date());
map.put("abc",student);
}