> 文章列表 > JavaWeb开发(四)4.2——Spring MVC 的请求与响应、restful

JavaWeb开发(四)4.2——Spring MVC 的请求与响应、restful

JavaWeb开发(四)4.2——Spring MVC 的请求与响应、restful

一、SpringMVC 请求与响应

1、@RequestMapping 注解

  • @RequestMapping 注解是一个用来处理请求地址映射的注解,可用于映射一个请求或一个方法,可以用在类或方法上。
  • 如果加载在方法上就是具体访问路径,如果加载在类上就是访问的前缀。
  • springmvc 定义url路径是不允许重复。

eg:

package com.qizekj.controller;import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;/* @author chenqun* @date 2023/3/18 19:12*/
@Controller
@RequestMapping("/user")
public class UserController {/* /add UserController.add  OrderController.add?* 如果我们将@RequestMapping注解加在我们的类上面 是访问该接口前缀* 如果加在方法上就是我们具体的访问路径* /user/add* @return*/@RequestMapping("/add")@ResponseBodypublic String add() {return "user add ok";}@RequestMapping("/delete")@ResponseBodypublic String delete() {return "user delete ok";}@RequestMapping("/select")@ResponseBodypublic String select() {return "user select ok";}
}
package com.qizekj.controller;import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;/* @author chenqun* @date 2023/3/18 19:13*/
@Controller
@RequestMapping("/order")
public class OrderController {@RequestMapping("/add")@ResponseBodypublic String add() {return "order add ok";}@RequestMapping("/delete")@ResponseBodypublic String delete() {return "order delete ok";}@RequestMapping("/select")@ResponseBodypublic String select() {return "order select ok";}
}

2、接收Get/Post请求参数

  • 和Controller层方法的形参同名,那么可以直接通过参数名接收值。
  • 创建controller

eg:

package com.qizekj.controller;import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.ResponseBody;/* @author chenqun* @date 2023/3/18 19:26*/
@Controller
public class MemberController {/* RequestMapping 默认的情况下 RequestMapping支持所有请求方式 例如 get、post 、delete* method = RequestMethod.POST 设定该接口支持的类型 post @return*/@RequestMapping(value = "/addMember", method = RequestMethod.POST)@ResponseBodypublic String addMemberPost(Integer id, String name) {System.out.println("id:" + id);System.out.println("name:" + name);return "post---ok";}/* addMember* <p>* RequestMapping 默认的情况下 RequestMapping支持所有请求方式 例如 get、post 、delete* method = RequestMethod.POST 设定该接口支持的类型 post @return*/@RequestMapping(value = "/addMember", method = RequestMethod.GET)@ResponseBodypublic String addMemberGet(Integer id, String name) {System.out.println("id:" + id);System.out.println("name:" + name);return "get---ok";}
}
  • 运行项目后用postman访问:
    JavaWeb开发(四)4.2——Spring MVC 的请求与响应、restful
    JavaWeb开发(四)4.2——Spring MVC 的请求与响应、restful
    后台打印:
    JavaWeb开发(四)4.2——Spring MVC 的请求与响应、restful

3、springmvc 5种接受参数类型

3.1、普通参数

  1. url地址传参,地址参数名与形参变量名相同,定义形参即可接收参数;
  2. 如果发生url地址传参,地址参数名与形参变量名不同,使用@RequestParam绑定参数关系;

参数:
required:是否为必传参数;
defaultValue:参数默认值。

//springmvc5种接受参数类型
//1.1、普通参数
@RequestMapping("/demo01")
@ResponseBody
public String demo01(String name, Integer age) {return "name:" + name + ",age:" + age;
}//1.2、普通参数2
/* 当访问时的传递参数名称name与方法形参名称qizekjName不一致时,可以用@RequestParam注解进项绑定* 1.@RequestParam("name")地址栏 传递参数名称name 方法形参名称qizekjName* 2.required:是否必须传递该参数,默认是为true,也就是需要传递该参数;required = false,不需要必须传递该参数*/
@RequestMapping("/demo02")
@ResponseBody
public String demo02(@RequestParam(name = "name", required = false) String qizekjName,@RequestParam(name = "age", required = false) Integer qizekjAge) {return "name:" + qizekjName + ",age:" + qizekjAge;
}

3.2、对象参数/嵌套对象参数

  • 请求参数名与形参对象属性名相同,定义对象类型形参即可接收参数。
  • 嵌套对象参数:请求参数名与形参对象属性名相同,按照对象层次结构关系即可接收嵌套对象属性参数。
/* 2、接收对象类型参数* 地址栏中传递的参数名称与对象中成员属性名称保持一致即可* @param qizekjUser* @return*/
@RequestMapping("/demo03")
@ResponseBody
public String demo03(QizekjUserEntity qizekjUser) throws UnsupportedEncodingException {return "name:" + qizekjUser.getUserName() + ",age:" + qizekjUser.getAge() + ",addres:" +qizekjUser.getQizekjUserInfo().getAddres();
}
package com.qizekj.entity;/* @author chenqun* @date 2023/3/18 19:37*/
public class QizekjUserEntity {/* ?userName=qizekj&age=4*/private String userName;private Integer age;/* ?qizekjUserInfo.addres=AnHuiHeFei*/private QizekjUserInfoEntity qizekjUserInfo;public String getUserName() {return userName;}public void setUserName(String userName) {this.userName = userName;}public Integer getAge() {return age;}public void setAge(Integer age) {this.age = age;}public QizekjUserInfoEntity getQizekjUserInfo() {return qizekjUserInfo;}public void setQizekjUserInfo(QizekjUserInfoEntity qizekjUserInfo) {this.qizekjUserInfo = qizekjUserInfo;}
}
package com.qizekj.entity;/* @author chenqun* @date 2023/3/18 19:39*/
public class QizekjUserInfoEntity {private String addres;public String getAddres() {return addres;}public void setAddres(String addres) {this.addres = addres;}
}

3.3、数组参数

请求参数名与形参属性名相同且请求参数为多个,定义数组类型形参即可接收参数。

http://localhost:8081/demo04?arrays=qizekj&arrays=chenqun

/* 3、接收数组类型参数* demo04?arrays=qizekj&arrays=chenqun* 请求参数名与形参属性名相同且请求参数为多个,定义数组类型形参即可接收参数* @param arrays* @return*/
@RequestMapping("/demo04")
@ResponseBody
public String demo04(String[] arrays) {return Arrays.toString(arrays);
}

3.4、集合参数

请求参数名与形参集合对象名相同且请求参数为多个,@RequestParam绑定参数关系。

http://localhost:85/demo05?arrays=1&arrays=2

@RequestParam :同名请求参数可以使用@RequestParam注解映射到对应名称的集合对象中作为数据

eg:

/* 4、接收集合普通类型参数* 请求参数名与形参属性名相同且请求参数为多个,定义数组类型形参即可接收参数* @param arrays* @return*/
@RequestMapping("/demo05")
@ResponseBody
public String demo05(@RequestParam List<String> arrays) {return Arrays.toString(arrays.toArray());
}

二、SpringMVC 接收json数据

1、开启接收json数据

package com.qizekj.config;import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.EnableWebMvc;/* @author chenqun* @date 2023/3/18 13:07*/
@Configuration
@ComponentScan("com.qizekj.controller")
@EnableWebMvc
public class SpringMVCConfig {/* 1.@Configuration  定义SpringMVCConfig.xml配置文件* 2.需要将我们的控制类注入到ioc容器 @ComponentScan("com.qizekj.springmvc")* @ComponentScan("com.qizekj.springmvc")将该包下所有的类 注入到IOC容器种* 3.在springmvc原理 所有请求过来先达到DispatcherServlet 分发具体控制类 方法执行*/
}

2、添加maven依赖

<!--@RequestBody 接收json数据-->
<dependency><groupId>com.fasterxml.jackson.core</groupId><artifactId>jackson-databind</artifactId><version>2.9.0</version>
</dependency>

3、以实体类方式接收

  • 接收参数加上@RequestBody QizekjUserEntity qizekjUserEntity 标记,接收json数据
  • 自动根据json数据反序列化成对象qizekjUserEntity 。
/* 5、接收json数据(以实体类方式)* {* "userName":"qizhekj",* "age":/4* }* @return*/@RequestMapping("/demo06")@ResponseBodypublic String demo06(@RequestBody QizekjUserEntity qizekjUserEntity) {return qizekjUserEntity.toString();}

使用postman访问接口:

JavaWeb开发(四)4.2——Spring MVC 的请求与响应、restful

{"userName":"qizekj","age":4,"qizekjUserInfo":{"addres":"HeFei"}
}

4、以Map方式接收

  • json数据,key为Map的key,value为Map的value。
  • 注意json数据的value与Map集合的value类型需保持一致,否则报错。
/* 6、接收json数据(以Map方式接收)* @param paramMap* @return*/
@RequestMapping("/demo07")
@ResponseBody
public String demo07(@RequestBody Map<String, Object> paramMap) {return paramMap.toString();
}

用postman访问:
JavaWeb开发(四)4.2——Spring MVC 的请求与响应、restful

5、以List方式接收

/* 7、接收json数据(以List集合方式接收),以json数组的形式传递数据* @param list* @return*/
@RequestMapping("/demo8")
@ResponseBody
public String demo8(@RequestBody List<String> list) {return list.toArray().toString();
}/* 8、接收json数据(以List集合方式接收),以json对象的形式传递数据* @param list* @return*/
@RequestMapping("/demo9")
@ResponseBody
public String demo9(@RequestBody List<QizekjUserEntity> list) {return list.toArray().toString();
}
  • 以json数组的形式传递数据
["qizekj","4"
]

JavaWeb开发(四)4.2——Spring MVC 的请求与响应、restful

  • 以json对象的形式传递数据
[{"userName": "qizekj","age": "4"},{"userName": "chenqun","age": "32"}
]

JavaWeb开发(四)4.2——Spring MVC 的请求与响应、restful

三、SpringMVC 响应json数据

  1. 在接口上加上@ResponseBody注解,是表示根据该方法返回值,返回对应json数据。底层是根据返回值,序列化成json数据。
  2. @RestController注解,是标记该控制类所有接口都是返回json数据。
    eg:
@RestController
public class QizekjRestController {}

@Controller
@ResponseBody

四、使用HttpServletRequest 获取参数

springmvc底层基于Servlet实现的。

获取httprequest/response三种方式:

  1. public String qizekj(HttpServletRequest request,HttpServletResponse response)
  2. HttpServletRequest request = ((ServletRequestAttributes)RequestContextHolder.getRequestAttributes()).getRequest();
  3. @Autowired

eg:

 /* 获取到我们的 HttpServletRequest httpServletRequest @param id* @param name* @param httpServletRequest* @return*/@RequestMapping(value = "/httprequestDemo01", method = RequestMethod.GET)@ResponseBodypublic String httprequestDemo01(Integer id, String name, HttpServletRequest httpServletRequest) {System.out.println("id:" + id);System.out.println("name:" + name);String reqId = httpServletRequest.getParameter("id");String reqName = httpServletRequest.getParameter("name");System.out.println("reqId:" + reqId);System.out.println("reqName:" + reqName);/* 2.HttpServletRequest request = ((ServletRequestAttributes)RequestContextHolder.getRequestAttributes()).getRequest();*/// 从ThreadLocal获取HttpServletRequest  springmvc 底层基于Servlet 提前缓存好了ttpServletRequestHttpServletRequest request = ((ServletRequestAttributes) RequestContextHolder.getRequestAttributes()).getRequest();return "ok---get";}/* 获取到我们的 HttpServletRequest httpServletRequest @param id* @param name* @return*/@RequestMapping(value = "/httprequestDemo02", method = RequestMethod.GET)@ResponseBodypublic String httprequestDemo02(Integer id, String name) {System.out.println("id:" + id);System.out.println("name:" + name);/* 2.HttpServletRequest request = ((ServletRequestAttributes)RequestContextHolder.getRequestAttributes()).getRequest();*/// 从ThreadLocal获取HttpServletRequest  springmvc 底层基于Servlet 提前缓存好了ttpServletRequestHttpServletRequest request = ((ServletRequestAttributes) RequestContextHolder.getRequestAttributes()).getRequest();String reqId = request.getParameter("id");String reqName = request.getParameter("name");System.out.println("reqId:" + reqId);System.out.println("reqName:" + reqName);return "ok---get";}

五、springmvc restful简单介绍

1、什么是restful

Restful就是一个资源定位及资源操作的风格。不是标准也不是协议,只是一种风格规范。基于这个风格设计的软件可以更简洁,更有层次。

资源操作:使用POST、DELETE、PUT、GET,使用不同方法对资源进行操作。

传统方式操作资源:通过不同的参数来实现不同的效果,post 和 get。
http://127.0.0.1/qizekj/getUser?id=1 查询,GET,查询用户id为1信息
http://127.0.0.1/qizekj/saveUser 新增,POST
http://127.0.0.1/qizekj/updateUser 更新,POST
http://127.0.0.1/qizekj/deleteUser?id=1 删除,GET ,删除用户id为1信息
(查询、删除)一般用GET,写操作(新增、修改)一般用POST

使用RESTful操作资源:可以通过不同的请求方式来实现不同的效果。
例如:请求地址一样,但是实现的效果不一样。例如
发送请求GET执行查询、 发送POST 执行新增、发送PUT执行更新、发送DELETE 执行删除
http://127.0.0.1/user/1 查询,GET
http://127.0.0.1/user 新增数据,POST
http://127.0.0.1/user 更新,PUT
http://127.0.0.1/user/1 删除,DELETE

根据发送不同的类型(GET 、POST 、PUT、DELETE等),判断访问不同的接口。

2、restful案例演示

在@RequestMapping的value中使用URI template({变量名}),然后在@RequestMapping注解方法的需要绑定的参数前,使用@PathVariable指定变量名(如果变量名和参数名一致也可以不指定),从而将URL中的值绑定到参数上。

@RequestMapping组合注解
@GetMapping
@PostMapping
@PutMapping
@DeleteMapping
@PatchMapping

package com.qizekj.controller;import com.qizekj.entity.QizekjUserEntity;
import org.springframework.web.bind.annotation.*;/* @author chenqun* @date 2023/3/18 22:13*/
@RestController
public class QizekjRestfulController {//Restful api 请求地址都是一样 根据不同请求方法判断/* 1、提供根据id查询接口 ---请求方法类型为get,指定请求类型为get* /user/{id}  /user/1*/
//  @RequestMapping(value = "/user/{id}", method = RequestMethod.GET)@GetMapping(value = "/user/{id}")public QizekjUserEntity getUser(@PathVariable("id") Integer id) {System.out.println("[getUser] id:" + id);return new QizekjUserEntity("qizekj" + id, 22);}/*2、根据id删除数据 发送请求类型 delete* @param id* @return*/
//  @RequestMapping(value = "/user/{id}", method = RequestMethod.DELETE)@DeleteMapping(value = "/user/{id}")public String deleteUser(@PathVariable("id") Integer id) {System.out.println("[deleteUser] id:" + id);return "ok:id" + id;}/* 3、新增添加数据 Post类型 传递 json数据* @return*/
//  @RequestMapping(value = "/user", method = RequestMethod.POST)@PostMapping(value = "/user")public String addUser(@RequestBody QizekjUserEntity qizekjUserEntity) {System.out.println("[addUser] qizekjUserEntity:" + qizekjUserEntity);return "ok";}/* 4、修改数据 put类型 传递 json数据* @return*/
//  @RequestMapping(value = "/user", method = {RequestMethod.PUT})@PutMapping(value = "/user")public String updateUser(@RequestBody QizekjUserEntity qizekjUserEntity) {System.out.println("[updateUser] qizekjUserEntity:" + qizekjUserEntity);return "ok";}/*  @RequestMapping 没有指定请求方法 则 包含所有请求类型 get、put、post等 指定请求方法类型 method = RequestMethod.PUT*/
}