SpringMVC–04获取请求参数
文章目录
5.1 直接获取
我们可以通过和前端的数据传递时的name来获取数据,SpringMVC会将数据名一样的数据帮我们转化好,我们只需要在参数列表中加上对应的名字的数据即可
Jsp:
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>参数测试</title>
</head>
<body>
<h2>参数测试</h2>
<form method="post" action="/">
姓名:<input type="text" name="name">
<br/>
年龄:<input type="number" name="age" min="0" max="100" value="18">岁
<br/>
<button>doPost New</button>
</form>
<div>
${msg}
</div>
</body>
</html>
Java:
@Controller
public class ParameterTestController {
/**
* 首页
*
* @return 返回首页
*/
@GetMapping("/")
public String welcomePage() {
return "index";
}
/**
* 使用post请求进行拦截
* @param name 传入name
* @param age 传入age
* @param model model模型
* @return 视图
*/
@PostMapping("/")
public String getInfo(String name, Integer age, Model model) {
model.addAttribute("msg", name + "--->" + age);
return "index";
}
}
5.2 绑定获取
很多时候后端使用小驼峰命名的方法,而前端使用下划线连接,这时我们就不可以使用上面通过名字直接去获得了,而是需要去将前端的参数绑定
@Controller
public class ParameterTestController {
/**
* 首页
*
* @return 返回首页
*/
@GetMapping("/")
public String welcomePage() {
return "index";
}
/**
* 使用post请求进行拦截
*
* @param userName 传入name,绑定请求中name
* @param userAge 传入age,绑定请求中age
* @param model model模型
* @return 视图
*/
@PostMapping("/")
public String getInfo(@RequestParam("name") String userName, @RequestParam("age") Integer userAge, Model model) {
model.addAttribute("msg", userName + "--->" + userAge);
return "index";
}
}
5.5 获取多个参数
如果前端传入多个参数,我们也可以使用list或者数组来接受,但是这时候必须要使用
@RequestParam
来标识这个数据需要SpringMVC来帮我们处理
Jsp:
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>参数测试</title>
</head>
<body>
<h2>参数测试</h2>
<form method="post" action="/">
姓名:<input type="text" name="name">
<br/>
年龄:<input type="number" name="age" min="0" max="100" value="18">岁
<br/>
爱好:
<div>
<input type="checkbox" name="hobbies" value="sing">唱
<input type="checkbox" name="hobbies" value="dance">跳
<input type="checkbox" name="hobbies" value="basketball">篮球
<input type="checkbox" name="hobbies" value="other">其他
</div>
<button>doPost New</button>
</form>
<div>
${msg}
</div>
</body>
</html>
List:
@PostMapping("/")
// 这里需要标记list,通知SpringMVC帮助处理
public String getInfo(String name, Integer age,@RequestParam(required = false) List<String> hobbies, Model model) {
model.addAttribute("msg", name + "--->" + age + "--->" + hobbies.toString());
return "index";
}
数组:
@PostMapping("/")
// 这里同样也需要标注
public String getInfo(String name, Integer age,@RequestParam(defaultValue ="noHobby") String[] hobbies, Model model) {
model.addAttribute("msg", name + "--->" + age + "--->" + Arrays.toString(hobbies));
return "index";
}
5.4 map获取
在比较原始的方法中是可以通过map集合来获取前端的参数,这样的好处是不需要通过注解去绑定值,参数的name和值会以k-v形式完整的放在map中。
缺点:
- 因为map中的key是唯一的,所有多个同名参数传来的时候是不能存储的,而且因为在SpringMVC中转化参数时也进行了处理,如果是map来接收的话,value会以第一次存入的为主,不会被后面覆盖。
- 多参数,还是需要集合或者数组来接收
Java:
@PostMapping("/")
// 使用map的话也需要标注注解,交给SpringMVC来处理 多个参数还是通过数组获取
public String getInfo(@RequestParam(required = false) Map<String,Object> map, @RequestParam(defaultValue ="noHobby") String[] hobbies, Model model) {
// map获取name map获取age
model.addAttribute("msg", map.get("name") + "--->" + map.get("age") + "--->" + Arrays.toString(hobbies));
return "index";
}
5.5 对象获取
我们也可以通过一个对应的对象来获得参数,SpringMVC会来识别参数,如果是对对象参数的话,会帮助我们自动装配到对应的属性上。
特点:
- 值得注意的是,对于多个参数的获取,不需要我们去通知Spring来处理了,也就是说我们不需要任何对的注解,使用对象就可以简单的活到
- 但是要注意的是我们同样也需要将前端的名字和对象的属性名对应
pojo:
public class AdminInfo {
private String name;
private Integer age;
private List<String> hobbies;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Integer getAge() {
return age;
}
public void setAge(Integer age) {
this.age = age;
}
public List<String> getHobbies() {
return hobbies;
}
public void setHobbies(List<String> hobbies) {
this.hobbies = hobbies;
}
@Override
public String toString() {
return "AdminInfo{" +
"name='" + name + '\'' +
", age=" + age +
", hobbies=" + hobbies +
'}';
}
}
Java:
@PostMapping("/")
// 这里通过编写的实体类来获得,SpringMVC识别到对象会自动装配
public String getInfo(AdminInfo adminInfo, Model model) {
model.addAttribute("msg", adminInfo.getName() + "--->" + adminInfo.getAge() + "--->" + adminInfo.getHobbies());
return "index";
}
5.6 Restful风格获取参数
Restful风格的参数不再是在后面使用
?
来绑定参数,而是通过/
来匹配参数
Jsp:
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>参数测试</title>
</head>
<body>
<h2>参数测试</h2>
姓名:<input type="text" name="name" id="name">
<br/>
年龄:<input type="number" name="age" id="age" min="0" max="100" value="18">岁
<br/>
爱好:
<div>
<input type="checkbox" name="hobbies" value="sing">唱
<input type="checkbox" name="hobbies" value="dance">跳
<input type="checkbox" name="hobbies" value="basketball">篮球
<input type="checkbox" name="hobbies" value="other">其他
</div>
<button id="submit_btn" οnclick="submit()">doPost New</button>
<div>
${msg}
</div>
</body>
<script type="application/javascript">
let submit = function () {
// 获取name值
let name = document.getElementById("name").value;
// 获取age值
let age = document.getElementById("age").value;
// 声明字符串和数组
let hobbies = "", arr = [];
// 获得爱好标签
let els = document.getElementsByName("hobbies");
// 遍历标签
for (let i = 0; i < els.length; i++) {
// 如果选择,加入数组
if (els[i].checked === true) {
arr.push(els[i].value);
}
}
// 将数组转化为字符串
hobbies = arr.join(",");
// restful风格访问
window.location = "/" + name + "/" + age + "/" + hobbies;
}
</script>
</html>
Java:
// 将参数声明在url
@GetMapping("/{name}/{age}/{hobbies}")
// 绑定参数
public String getInfo(@PathVariable("name") String adminName, @PathVariable Integer age, @PathVariable String[] hobbies, Model model) {
model.addAttribute("msg", adminName + "--->" + age + "--->" + Arrays.toString(hobbies));
return "index";
}
5.7 关联对象的接收
如果是俩个对象嵌套为一个对象,SpringMVC也可以通过对象来获取,这时候我们需要在前端传值的时候,需要我们来指定对象里面的对象,比如我们在Form对象里面嵌套一个EmsInfo对象
pojo:
public class EmsInfo implements Serializable {
private static final long serialVersionUID = 3866110295644636936L;
private String address;
private String phone;
public String getAddress() {
return address;
}
public void setAddress(String address) {
this.address = address;
}
public String getPhone() {
return phone;
}
public void setPhone(String phone) {
this.phone = phone;
}
@Override
public String toString() {
return "EmsInfo{" +
"address='" + address + '\'' +
", phone='" + phone + '\'' +
'}';
}
}
public class Form implements Serializable {
private static final long serialVersionUID = 3485707772111567814L;
private String name;
private String lady;
private List<Integer> reason;
// 在Form中嵌套emsInfo对象
private EmsInfo emsInfo;
public EmsInfo getEmsInfo() {
return emsInfo;
}
public void setEmsInfo(EmsInfo emsInfo) {
this.emsInfo = emsInfo;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getLady() {
return lady;
}
public void setLady(String lady) {
this.lady = lady;
}
public List<Integer> getReason() {
return reason;
}
public void setReason(List<Integer> reason) {
this.reason = reason;
}
@Override
public String toString() {
return "Form{" +
"name='" + name + '\'' +
", lady='" + lady + '\'' +
", reason=" + reason +
", emsInfo=" + emsInfo +
'}';
}
}
前端传输name:
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>调查问卷</title>
</head>
<body>
<h1>你喜欢什么样的女孩子</h1>
<form action="/" method="post">
<h3><label for="name">你的名字是:</label></h3>
<input id="name" name="name"><br/>
<h3><label for="lady">你的女神是:</label></h3>
<select id="lady" name="lady">
<option value="Yoona">林允儿</option>
<option value="Orange">橙子</option>
<option value="Actress">天海翼</option>
<option value="Java">Java</option>
</select>
<h3><label for="lady">你喜欢她的原因是:</label></h3>
<div>
<h3>你喜欢她的原因是:</h3>
<input type="checkbox" name="reason" value="1">长相甜美
<input type="checkbox" name="reason" value="2">为了学习
<input type="checkbox" name="reason" value="3">演技精湛
<input type="checkbox" name="reason" value="4">其他
</div>
<div>
<%--在这里的name是我们对应form对象里面的emsinfo对象,所以我们使用emsInfo来点出属性--%>
邮件地址:<input type="text" name="emsInfo.address"><br/>
手机:<input type="text" name="emsInfo.phone">
</div>
<button>点我提交</button>
</form>
</body>
</html>
Java获得数据:
@PostMapping("/")
public String getData(Form form){
System.out.println(form);
return "index";
}
5.8 获得时间参数
正常的Spring支持将
2021/6/5
这样的格式进行转化为一个Date类
@PostMapping("/testDate")
public String testDate(Form form,Date time) {
return "FreeMarkerDemo";
}
局部解决方法:
但是通过其他的方式进行传输的话Spring是不会帮我们转化的,这时候我们需要一个注解
@DateTimeFormat
,其中的属性pattern
代表时间的格式参数"yyyy年MM月dd日"
,如果使用的包装类中,我们只需要把该注解加在对应的Date的属性字段上
@PostMapping("/testDate")
// 这里的注解只是局部的,不会影响到其他方法
public String testDate(Form form, @DateTimeFormat(pattern = "yyyy年MM月dd日") Date time) {
return "FreeMarkerDemo";
}
全局解决方案:
全局的解决方案可以通过编写一个Converter类来处理数据的转化,在后面有详细的说明