目录
前言
请求
简单参数
原始方法
Spring方式
Post请求乱码处理
实体参数
简单实体参数
复杂实体参数
编辑
数组集合参数
数组参数
编辑
集合参数
日期参数
编辑
Json参数
编辑
传递json数据
json数组
json对象(POJO)
json集合(POJO)
注意
路径参数
请求映射路径
@RequestMapping
请求参数
响应
@ResponseBody
统一响应结果
前言
请求:获取请求数据
响应:设置响应数据
BS架构 Browser/Server,浏览器/服务器架构模式,客户端只需要浏览器,应用程序的逻辑和数据都存储在服务端(维护方便,体验一般)
CS架构 Client/Server,客户端/服务器架构模式(开发维护麻烦,体验不错)
请求
简单参数
原始方法
通过HttpServletRequest手动获取
import jakarta.servlet.http.HttpServletRequest;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
public class RequestController {
@RequestMapping("/SimpleParam")
public String SimpleParam(HttpServletRequest request){ //返回的字符串类型是String
String name=request.getParameter("name");
String age=request.getParameter("age"); //通过这个方法得到字符串类型的
int age1=Integer.parseInt(age); //将年龄进行类型转换
System.out.println(name+":"+age1); //设置返回格式
return "OK";
}
}
Spring方式
简单参数:参数名与形参变量名相同,定义形参即接收参数
@RestController
public class RequestController {
@RequestMapping("/SimpleParam")
public String SimpleParam(String name,Integer age){
System.out.println(name+":"+age);
return "OK";
}
}
注意这里的postman的网址均为http://localhost:8080/SimpleParam?name=tom&age=10
以上两种均为get请求,当为post请求时只需要在postman中网址输入http://localhost:8080/SimpleParam
Post请求乱码处理
如果post里面有汉字传进去,后台会出现乱码所以在配置那里设置过滤器
为web容器添加过滤器并指定字符集,Spring-web包中提供了专用的字符过滤器
public class ServletContainersInitConfig extends AbstractAnnotationConfigDispatcherServletInitializer {
protected Class<?>[] getRootConfigClasses() {
return new Class[0];
}
protected Class<?>[] getServletConfigClasses() {
return new Class[]{SpringMvcConfig.class};
}
protected String[] getServletMappings() {
return new String[]{"/"};
}
//乱码处理
@Override
protected Filter[] getServletFilters() {
CharacterEncodingFilter filter = new CharacterEncodingFilter();
filter.setEncoding("UTF-8");
return new Filter[]{filter};//如果有多个过滤器,在这里用,隔开
}
}
注意这个处理的是post的,如果get传入中文依旧会出现乱码
如果方法形参名称与请求参数名称不匹配,可以使用@RequestParam完成映射
@RestController
public class RequestController {
@RequestMapping("/SimpleParam")
public String SimpleParam(@RequestParam(name="name") String username, Integer age){ //引号中写的是请求参数名
System.out.println(username+":"+age);
return "OK";
}
}
@PequestParam中的required属性默认为true,代表该请求参数必须传递,如果不传递,将会报错,如果该参数是可选的(也就是可以传递可以不传递),可以将required属性设置为false(这样你传或者不传都不会报错)
实体参数
简单实体参数
请求参数名与形参属性名相同,定义Pojo接收即可
@RestController
public class SimplePojo {
@RequestMapping("/SimpleParam1")
public String SimplePojo(user user) {
System.out.println(user);
return "yes";
}
}
public class user {
private String name;
private Integer age;
//加getter和setter方法toString
}
这里的url是http://localhost:8080/SimpleParam1?name=cat&age=29
复杂实体参数
请求参数名与形参属性名相同,按照对象层次结构关系即可接收嵌套pojo属性参数
public class user {
private String name;
private Integer age;
private Address address;
//加getter和setter和toString
}
public class Address {
private String province;
private String city;
//加getter和setter还有toString
}
@RestController
public class SimplePojo {
@RequestMapping("/ComplexParam1")
public String ComplexParam(user user) {
System.out.println(user);
return "yes";
}
}
数组集合参数
数组参数
请求参数名与形参数组名称相同且请求为多个,定义数组类型形参即可接收参数
@RestController
public class SimplePojo {
@RequestMapping("/arrayParam")
public String ArrayParam(String[] hobby) {//在这里建立一个数组,然后后面的名称和传入参数相同
System.out.println(Arrays.toString(hobby));
return "yes";
}
}
集合参数
请求参数名与形参集合名称相同且请求参数为多个,@RequestParam绑定参数关系
@RestController
public class SimplePojo {
@RequestMapping("/listParam")
public String ArrayParam(@RequestParam List<String> hobby) {
System.out.println(hobby);
return "yes";
}
}
日期参数
使用@DateTimeFormat注解完成日期参数格式转换
@RestController
public class SimplePojo {
@RequestMapping("/dateParam")
public String dateParam(@DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")LocalDateTime updateTime) {
System.out.println(updateTime);
return "yes";
}
}
//日期参数
//使用@DateTimeFormat注解设置日期类型数据格式,默认格式yyyy/MM/dd @RequestMapping("/dataParam")
@ResponseBody
public String dataParam(Date date,@DateTimeFormat(pattern="yyyy-MM-dd") Date date1, @DateTimeFormat(pattern="yyyy/MM/dd HH:mm:ss") Date date2){
System.out.println("参数传递 date ==> "+date);
System.out.println("参数传递 date1(yyyy-MM-dd) ==> "+date1);
System.out.println("参数传递 date2(yyyy/MM/dd HH:mm:ss) ==> "+date2);
return "{'module':'data param'}"; }
}
//@DateTimeFormat是形参注解,用在SpringMVC控制器方法形参前面,用于设定日期时间型数据格式//属性:pattern:日期时间格式字符串
Get测试:
http://localhost:8080/springmvc_04_request_param/dataParam?date=2088/08/08&date1=2088-08-18&date2=2088/08/28 8:08:08
Json参数
json参数键名与形参对象属性名相同,定义Pojo类型形参即可接收参数,需要使用@RequestBody标识
@RestController
public class SimplePojo {
@RequestMapping("/jsonParam")
public String jsonParam(@RequestBody user user) {
System.out.println(user);
return "yes";
}
}
//user这和前面的复杂实体参数一样
通过@requestbody将json封装到user这个实体类之中
传递json数据
先导入坐标
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
<version>2.9.0</version>
</dependency>
开启自动转换Json数据的支持
@Configuration
@ComponentScan("com.itheima.controller")
//开启json数据类型自动转换
@EnableWebMvc
public class SpringMvcConfig {
}
json数组
//集合参数:json格式
//1.开启json数据格式的自动转换,在配置类中开启@EnableWebMvc
//2.使用@RequestBody注解将外部传递的json数组数据映射到形参的集合对象中作为数据
//它用来将请求体所包含的数据传递给请求参数,此注解一个处理器方法只能使用一次
@RequestMapping("/listParamForJson")
@ResponseBody
public String listParamForJson(@RequestBody List<String> likes){
System.out.println("list common(json)参数传递 list ==> "+likes);
return "{'module':'list common for json param'}";
}
json对象(POJO)
//POJO参数:json格式
//1.开启json数据格式的自动转换,在配置类中开启@EnableWebMvc
//2.使用@RequestBody注解将外部传递的json数据映射到形参的实体类对象中,要求属性名称一一对应
@RequestMapping("/pojoParamForJson")
@ResponseBody
public String pojoParamForJson(@RequestBody User user){
System.out.println("pojo(json)参数传递 user ==> "+user);
return "{'module':'pojo for json param'}";
}
Get请求的时候:
{
"name":"xixi",
"age":21,
"address":{
"provice":"taiyuan",
"city":"taiyuan"
}
}
json集合(POJO)
//集合参数:json格式
//1.开启json数据格式的自动转换,在配置类中开启@EnableWebMvc
//2.使用@RequestBody注解将外部传递的json数组数据映射到形参的保存实体类对象的集合对象中,要求属性名称一一对应
@RequestMapping("/listPojoParamForJson")
@ResponseBody
public String listPojoParamForJson(@RequestBody List<User> list){
System.out.println("list pojo(json)参数传递 list ==> "+list);
return "{'module':'list pojo for json param'}";
}
Get请求的时候:
[{"name":"xixi","age":12},
{"name":"haha","age":21}
]
注意
路径参数
通过请求url直接传递参数,使用{...}来标识该路径参数,需要使用@PathVariable获取路径参数
一个路径参数
@RestController
public class SimplePojo {
@RequestMapping("/path/{id}")
public String pathParam(@PathVariable Integer id) {
System.out.println(id);
return "yes";
}
}
postman测试的url为http://localhost:8080/path/1
多个路径参数
@RestController
public class SimplePojo {
@RequestMapping("/path/{id}/{name}")
public String pathParam(@PathVariable Integer id ,@PathVariable String name) {
System.out.println(id+":"+name);
return "yes";
}
}
postman测试的url为http://localhost:8080/path/1/cat
请求映射路径
问题的提出:在开发中请求的路径应该是不同的,但是如果有相同的路径就会报错,不知道到底应该调用哪一个----------通常通过设置模块名作为请求路径的前缀
@RequestMapping
他是方法注解和类注解
放在SpringMVC控制器方法定义上方
用于设置控制器方法请求路径,如果设置在类上设置当前控制器方法,请求访问路径前缀
@Controller
//设置模块名作为请求路径的前缀
@RequestMapping("/user")
public class UserController {
//请求路径映射
@RequestMapping("/save")
@ResponseBody
public String save(){
System.out.println("user save ...");
return "{'module':'user save'}";
}
//请求路径映射
@RequestMapping("/delete")
@ResponseBody
public String delete(){
System.out.println("user delete ...");
return "{'module':'user delete'}";
}
}
属性:value(默认):请求访问路径。或者访问路径前缀
请求参数
@RequestParam是形参注解,位于SpringMVC控制器方法形参定义前面,用于绑定请求参数与处理器方法形参之间的关系
参数:required:是否为必传参数 DefaultValue:参数默认值
响应
@ResponseBody
是方法注解和类注解
位于controller方法上/类上
作用是将方法返回值直接响应,如果返回值类型是 实体对象/集合,竟会转换为JSON格式响应
@RestController=@Controller+@ResponseBody
@RestController
public class ResponseController {
@RequestMapping("/hello")
public String hello(){
System.out.println("hello world");
return "hello world~";
}
@RequestMapping("/getAddr")
public Address getAddr(){
Address addr=new Address();
addr.setProvince("山西");
addr.setCity("太原");
return addr;
}
@RequestMapping("/listAddr")
public List<Address> ListAddr(){
List<Address> list=new ArrayList<>();
Address addr=new Address();
addr.setProvince("山西");
addr.setCity("太原");
Address addr2=new Address();
addr2.setProvince("山");
addr2.setCity("太");
list.add(addr);
list.add(addr2);
return list;
}
}
测试是在postman输入http://localhost:8080/listAddr即可,其他类似
每一个对外暴露的方法都称为一个功能接口(比如上面就有三个接口),路径就是他们的访问路径
面临的问题是他们的响应结果不同,最后解析结果较为麻烦,所以需要统一响应结果
统一响应结果
public class Result {
private Integer code;
private String msg;
private Object data;
public Result(){
}
public Result(Integer code,String msg,Object data){
this.code=code;
this.msg=msg;
this.data=data;
}
public Integer getCode() {
return code;
}
public void setCode(Integer code) {
this.code = code;
}
public String getMsg() {
return msg;
}
public void setMsg(String msg) {
this.msg = msg;
}
public Object getData() {
return data;
}
public void setData(Object data) {
this.data = data;
}
public static Result success(Object data){
return new Result(1,"success",data);
}
public static Result success(){
return new Result(1,"success",null);
}
public static Result error(String msg){
return new Result(0,msg,null);
}
@Override
public String toString() {
return "Result{" +
"code=" + code +
", msg='" + msg + '\'' +
", data=" + data +
'}';
}
}
@RestController
public class ResponseController {
@RequestMapping("/hello")
public Result hello(){
System.out.println("hello world");
//return new Result(1,"success","hello world");
return Result.success("hello world~");//需要给前端传送数据
}
@RequestMapping("/getAddr")
public Result getAddr(){
Address addr=new Address();
addr.setProvince("山西");
addr.setCity("太原");
return Result.success(addr);
}
@RequestMapping("/listAddr")
public Result ListAddr(){
List<Address> list=new ArrayList<>();
Address addr=new Address();
addr.setProvince("山西");
addr.setCity("太原");
Address addr2=new Address();
addr2.setProvince("山");
addr2.setCity("太");
list.add(addr);
list.add(addr2);
return Result.success(list);
}
}