SpringMVC请求参数处理
背景
我们在执行业务的过程中通常会将一些请求参数传递到服务端,服务端如何获取参数并注入给我们的方法参数的呢?
准备工作
Spring Web 依赖(提供了spring mvc支持并且会嵌入一个tomcat)
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
Thymeleaf 依赖(提供了以html作为页面模板进行解析和操作的相关对象)
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-thymeleaf</artifactId>
</dependency>
定义一个controller对象,用户处理客户端请求,例如:
@RestController
public class ParamObjectController {}
GET请求:
直接量方式
在ParamObjectController中添加方法,基于直接量方式接受客户端请求参数,例如:
@GetMapping("/doParam01")
public String doMethodParam(String name){
return "request params "+name;
}
访问时,可以这样传参,例如:
http://localhost:8080/doParam01?name=zhengzhou
POJO(实体类)对象方式
定义pojo对象,用于接受客户端请求参数,例如:
package com.cy.pj.module.pojo;
public class RequestParameter {
private String name;
//......
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
@Override
public String toString() {
return "RequestParam{" +
"name='" + name + ''' +
'}';
}
}
定义Controller方法,方法中使用pojo对象接收方法参数,例如:
@RequestMapping("/doParam02")
public String doMethodParam(RequestParameter param){//pojo对象接收请求参数,pojo对象中需提供与参数名相匹配的set方法
return "request params "+param.toString();
}
启动服务进行访问测试,可以这样传参,例如:
http://localhost:8080/doParam02?name=henan
Map对象方式
定义Controller方法,基于map对象接收请求参数,例如:
@GetMapping("/doParam03")
public String doMethodParam(@RequestParam Map<String,Object> param){
return "request params "+param.toString();
}
启动服务进行访问测试,可以这样传参,例如:
http://localhost:8080/doParam03?name=beijing
POST请求:(项目中用的比较多)
直接量方式
post的请求参数中都要加上@RequestBody注解,原因:post请求是客户端向服务端发来的json型的数据。
@PostMapping("/doParam04")
public String doMethodParam(@RequestBody String name){
return "post请求方式测试: "+name;
}
访问时用Postman提交Json型数据
http://localhost:8080/doParam04
POJO对象方式
@PostMapping("/doParam01")
public String doPostParam(@RequestBody RequestParameter req){
return "post params "+req;
}
http://localhost:8080/doParam01
Map集合
–1,概述
是接口,和Collection没有继承实现的关系。
数据是一对儿一对儿出现的。必须同时指定这组数据的K,V
K是键,V是值。其中,K不能重复.V可以重复
K--key ,V--value
也可以用泛型约束K的类型和V的类型
–2,常用方法
void clear()
从此映射中移除所有映射关系(可选操作)。
boolean containsKey(Object key)
如果此映射包含指定键的映射关系,则返回 true。
boolean containsValue(Object value)
如果此映射将一个或多个键映射到指定值,则返回 true。
Set<Map.Entry<K,V>> entrySet()
返回此映射中包含的映射关系的 Set 视图。
boolean equals(Object o)
比较指定的对象与此映射是否相等。
V get(Object key)
返回指定键所映射的值;如果此映射不包含该键的映射关系,则返回 null。
int hashCode()
返回此映射的哈希码值。
boolean isEmpty()
如果此映射未包含键-值映射关系,则返回 true。
Set<K> keySet()
返回此映射中包含的键的 Set 视图。
V put(K key, V value)
将指定的值与此映射中的指定键关联(可选操作)。
void putAll(Map<? extends K,? extends V> m)
从指定映射中将所有映射关系复制到此映射中(可选操作)。
V remove(Object key)
如果存在一个键的映射关系,则将其从此映射中移除(可选操作)。
int size()
返回此映射中的键-值映射关系数。
Collection<V> values()
返回此映射中包含的值的 Collection 视图。
测试
//测试 HashMap实现类
public class Test5 {
public static void main(String[] args) {
//1,创建HashMap对象
// HashMap<key的类型,value的类型> map = new HashMap();
HashMap<Integer,String> map = new HashMap<>();
//2,调用方法
map.put(9527,"吴彦祖");//把一组映射关系的数据存入map
map.put(9528,"郭富城");
map.put(9525,"霍建华");
map.put(9520,"陈冠希");
map.put(9520,"李家兴");
//特点:数组无序 + key不能相同,相同时value被覆盖
System.out.println(map);
System.out.println( map.containsKey(9520) );//判断是否包含9520的key
System.out.println( map.containsValue("陈冠希") );//判断是否包含"唐伯虎"的value
System.out.println( map.equals("陈冠希") );//判断是否相等
// map.clear();//清空集合
System.out.println(map.get(9525));//根据key获取value
System.out.println(map.hashCode());//获取哈希码值
System.out.println(map.isEmpty());//判断是否为空
System.out.println(map.size());//获取map的长度
System.out.println(map.remove(9528));//根据key删除记录
//迭代遍历
//方式1::Set<K> keySet()--把所有key获取到并存入set
Set<Integer> keys = map.keySet();//把所有key存入到set里
for (Integer k: keys) {//迭代set,得到每个key
//拿着key查对应的vlaue
String v = map.get(k);
System.out.println(k+",,,"+v);
}
//方式2::Collection<V> values()--只能把map里的所有value取出来
Collection<String> vs = map.values();//把map里的value们获取到
for (String v : vs) {//迭代Collection获取每个value
System.out.println("v = " + v);
}
//方式3::Set<Map.Entry<K,V>> entrySet()
//把map里数据的key和value都获取到并封装成Entry存入set中
Set<Map.Entry<Integer,String>> entrys = map.entrySet();
//迭代set,获取每个entry
for(Map.Entry<Integer,String> entry :entrys){
//再获取entry封装着的key和value
Integer k = entry.getKey();
String v = entry.getValue();
System.out.println(k+v);
}
}
}