Java – SpringMVC – REST获取请求参数
通过Servlet获取
SpringMVC 是基于Servlet 封装的 Web 控制器,且请求方法是由Servlet 接收请求,SpringMVC进行截获并调用我们的请求方法,因此SpringMVC会把Servlet接收到的HTTPRequest也传给我们。
@RequestMapping("unsoft/servletAPI")
public String request(HttpServletRequest request, HttpServletResponse response) {
System.out.println("request:" + request + ",response:" + response);
return "index";
}
但是通常我们在SpringMVC中比较少用Servlet的方式获取参数。
通过 SpringMVC 获取
SpringMVC 非常智能,提供了直接传递参数的方法,在前端传递的表单名与控制器方法接收的参数名一致的情况下,可以直接传递。
表单名一致
在前端的表单名一致的情况下,SpringMVC支持直接接收参数
【HTML表单】
<form action="@{/unsoft/param}" method="post">
用户名:<input type="text" name="username"><br>
密码:<input type="password" name="password"><br>
<input type="submit" value="登陆">
</form>
【控制器方法】
@RequestMapping("unsoft/param")
public String param(String username, String password) {
System.out.println("username:" + username + ",password:" + password);
return "index";
}
在表单中的名称如果和控制器方法中的形参名一致时,可以直接传递
表单名不一致
若表单中的名称如果和控制器方法中的形参名不一致时,SpringMVC提供了注解 @RequestParam
自定义绑定表单名功能。
【HTML表单】
<form action="@{/unsoft/param}" method="post">
用户名:<input type="text" name="userName"><br>
密码:<input type="password" name="passWord"><br>
<input type="submit" value="登陆">
</form>
【控制器方法】
@RequestMapping("unsoft/param")
public String param(@RequestParam("userName") String username, @RequestParam("passWord") String password) {
System.out.println("username:" + username + ",password:" + password);
return "index";
}
@RequestParam
属性
@RequestParam 注解是用于接收表单数据的,它会根据表单名自动与控制器参数名进行绑定
value、name
value
用于存放表单名,与形参绑定的值
required
required
默认值为 true
,意指该参数值必须传递,如果设置为false
,则可以不传递表单参数,但是控制器中的对应形参会赋值为 null
【控制器方法】
@RequestMapping("unsoft/param")
public String param(@RequestParam(value = "userName",required = true) String username, String password) {
System.out.println("username:" + username + ",password:" + password);
return "index";
}
defaultValue
defaultValue
是当表单没有传递参数过来时的默认值,默认为 null
当 defaultValue
初定义时,required
将失效,因为required
指定的是必须传值,当表单没有传值时,defaultValue
会帮其赋默认值,在意义上不存在没有值的情况,所以required
失效。
【控制器方法】
@RequestMapping("unsoft/param")
public String param(@RequestParam(value = "userName",defaultValue = "admin") String username, String password) {
System.out.println("username:" + username + ",password:" + password);
return "index";
}
@RequestHeader
属性
@RequestHeader 注解是用于接收请求头数据的,它会根据请求头的key与控制器参数名进行绑定
value、name
value
用于存放请求头名称key,与形参绑定的值
required
required
默认值为 true
,意指该参数值必须传递,如果设置为false
,则请求头可以不存在,但是控制器中的对应形参会赋值为 null
@RequestMapping("unsoft/param")
public String param(
@RequestParam("userName") String username,
String password,
@RequestHeader(value = "referer",required = true) String referer) {
System.out.println("username:" + username + ",password:" + password);
return "index";
}
defaultValue
defaultValue
是当没有该请求头时将被赋默认值,默认为 null
当 defaultValue
初定义时,required
将失效,因为required
指定的是必须传值,当请求头没有值时,defaultValue
会帮其赋默认值,在意义上不存在没有值的情况,所以required
失效。
@RequestMapping("unsoft/param")
public String param(
@RequestParam("userName") String username,
String password,
@RequestHeader(value = "referer",defaultValue = "http://www.unsoft.cn") String referer) {
System.out.println("username:" + username + ",password:" + password);
return "index";
}
@CookieValue
属性
@CookieValue 注解是用于接收cookie数据的,它会根据请求头中的cookies自动与控制器参数名进行绑定
value、name
value
用于存放请求头cookie名称key,与形参绑定的值
required
required
默认值为 true
,意指该参数值必须传递,如果设置为false
,则请求头cookie可以不存在,但是控制器中的对应形参会赋值为 null
@RequestMapping("unsoft/param")
public String param(
@RequestParam("userName") String username,
String password,
@CookieValue(value = "username",required = true) String cookies) {
System.out.println("username:" + username + ",password:" + password);
return "index";
}
defaultValue
defaultValue
是当没有该请求头cookie时将被赋默认值,默认为 null
当 defaultValue
初定义时,required
将失效,因为required
指定的是必须传值,当请求头cookie没有值时,defaultValue
会帮其赋默认值,在意义上不存在没有值的情况,所以required
失效。
@RequestMapping("unsoft/param")
public String param(
@RequestParam("userName") String username,
String password,
@CookieValue(value = "username",defaultValue = "admin") String cookies) {
System.out.println("username:" + username + ",password:" + password);
return "index";
}
通过 POJO 实体类获取
通过上面直接接收表单数据的方式外,如果表单数据非常多,那么控制器方法中的接收形参也会变得非常多,SpringMVC提供了以POJO实体类封装的方式对表单参数进行赋值,但前提是POJO实体类中的属性名之须要和表单名一致。
【POJO实体类】
public class User {
private String username;
private String password;
private Integer age;
private String gender;
}
【控制器方法】
@RequestMapping("/unsoft/pojo")
public String getParamByPOJO(User user){
System.out.println(user);
return "index";
}
解决POST或GET中文乱码问题
在SpringMVC中,提供了对编码解码的问题,可以在web.xml文件中增下以下配置,设定UTF-8编码
forceEncoding 在SpringMVC源码中会设定 request 请求 和 response 响应 的编码过程,使得 response 响应 也经过UTF-8编码过滤
【web.xml文件】
<!--配置springMVC的编码过滤器-->
<filter>
<filter-name>CharacterEncodingFilter</filter-name>
<filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>
<init-param>
<param-name>encoding</param-name>
<param-value>UTF-8</param-value>
</init-param>
<init-param>
<param-name>forceEncoding</param-name>
<param-value>true</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>CharacterEncodingFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
注意:SpringMVC中处理编码的过滤器一定要配置到其他过滤器之前,否则无效
Serlvet中解决乱码问题请查看以下文章
获取Axios请求参数
基于Axios异步请求的特殊性,在Axios使用POST请求时所发送的参数中,有两种请求参数
【param】: URL请求参数,Axios中设置param参数后,会直接把参数拼接到URL中
【data】: 请求体参数,就是我们平时POST请求的参数,它保存在请求头中,Axios会对请求体参数以json格式进行打包
接收param参数
SpringMVC 可以通过使用【@PathVariable】定义接收URL上的请求参数,这里不再赘述.
接收data参数
因为Axios发送的请求会以一个json格式发送过来,那么我们需要对接收到的json数据解析成Java对象。
接收请求体参数,使用【@RequestBody】注解。
通过【@RequestBody】注解的形参,可以接收到Axios的json请求体
方法一:实体类对象
/**
* 使用实体类对象进行封装
* @param id
* @param user
*/
@RequestMapping("/axios/{id}")
public void getJsonData(@PathVariable("id") Integer id, @RequestBody User user){
/**
* 接收到Axios请求的URL参数【id】
* 接收到Axios请求的请求体参数 {"id":"xx", "username":"xx", "password":"xx", "age":"xx", } 并封装成 User 对象
*/
}
方法二:Map集合
/**
* 使用Map集合进行封装
* @param id
* @param map
*/
@RequestMapping("/axios/{id}")
public void getJsonData(@PathVariable("id") Integer id, @RequestBody Map<String,Object> map){
/**
* 接收到Axios请求的URL参数【id】
* 接收到Axios请求的请求体参数 {"id":null, "username":"xx", "password":"xx", "age":"xx", "gender":"男"}
* 并封装成 Map 对象 {username="xx", password="xx", age="xx", gender="男"}
*/
}
方法三:String字符串,只接收,不进行解析
/**
* 使用String接收,不进行任何解析
* @param id
* @param json
*/
@RequestMapping("/axios/{id}")
public void getJsonData(@PathVariable("id") Integer id, @RequestBody String json){
/**
* 接收到Axios请求的URL参数【id】
* 接收到Axios请求的请求体参数 {"id":null, "username":"xx", "password":"xx", "age":"xx", "gender":"男"}
* 接到到字符串 json 中 => {"username":"xx", "password":"xx", "age":"xx", "gender":"男"}
*/
}
注意:
使用 @RequestBody 注解将json格式的请求参数转换为java对象
1> 导入 jackson 的依赖
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
<version>2.12.1</version>
</dependency>
2> 在SpringMvc的配置文件中设置【<mvc:annotation-driven />】
3> 在外理请求的控制器方法的形参位置,直接设置 json 格式的请求参数要转换的 java 类型的形参,使用 @ReauestBody
响应数据
SpringMVC中使用 HTTPServletResponse 对象进行写数据
@RequestMapping("/axios")
public void getJsonData(HttpServletResponse response) throws IOException {
PrintWriter writer = response.getWriter();
writer.write("Axios接收数据");
}
@ResponseBody
@ResponseBody用于标识一个控制器方法,可以将该方法的返回值直接作为响应报文的响应体响应到浏览器
在控制器中注解【@ResponseBody】后所返回的String字符串将原始输出,不会转发HTML文件。
@RequestMapping("/axios/response")
@ResponseBody
public String JavaToJson(){
return "{\"username\":\"admin\", \"password\":\"123456\"}";
}
方法一:返回实体类转为JSON
通过直接返回实体类,可以自动转为Json格式
@RequestMapping("/axios/response")
@ResponseBody
public User JavaToJson() {
User user = new User("admin", "123456", 23, "男");
return user;
}
JSON ==> {"username":"admin", "password":"123456", "age":"23", "gender":"男" }
方法二:返回Map集合转为JSON
@RequestMapping("/axios/response")
@ResponseBody
public Map<String, User> MapToJson() {
User u1 = new User("admin1", "password1", 23, "男");
User u2 = new User("admin2", "password2", 25, "女");
User u3 = new User("admin3", "password3", 24, "未知");
Map<String, User> map = Map.of("1000", u1, "1001", u2, "1002", u3);
return map;
}
JSON ==> {"1000":{u1的数据}, "1001":{u2的数据}, "1002":{u3的数据} }
方法三:返回List集合转为JSON
@RequestMapping("/axios/response")
@ResponseBody
public List<User> MapToJson() {
User u1 = new User("admin1", "password1", 23, "男");
User u2 = new User("admin2", "password2", 25, "女");
User u3 = new User("admin3", "password3", 24, "未知");
List<User> users = Arrays.asList(u1, u2, u3);
return users;
}
JSON ==> [0:{u1的数据}, 1:{u2的数据}, 2:{u3的数据}]
@RestController 注解
@RestController注解是springMVC提供的一个复合注解,标识在控制器的类上,就相当于为类添加了@Controller注解,并且为其中的每个方法添加了@ResponseBody注解
共有 0 条评论