一、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")
@ResponseBody
public String add() {
return "user add ok";
}
@RequestMapping("/delete")
@ResponseBody
public String delete() {
return "user delete ok";
}
@RequestMapping("/select")
@ResponseBody
public 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")
@ResponseBody
public String add() {
return "order add ok";
}
@RequestMapping("/delete")
@ResponseBody
public String delete() {
return "order delete ok";
}
@RequestMapping("/select")
@ResponseBody
public 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)
@ResponseBody
public 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)
@ResponseBody
public String addMemberGet(Integer id, String name) {
System.out.println("id:" + id);
System.out.println("name:" + name);
return "get---ok";
}
}
- 运行项目后用postman访问:
后台打印:
3、springmvc 5种接受参数类型
3.1、普通参数
- url地址传参,地址参数名与形参变量名相同,定义形参即可接收参数;
- 如果发生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")
@ResponseBody
public String demo06(@RequestBody QizekjUserEntity qizekjUserEntity) {
return qizekjUserEntity.toString();
}
使用postman访问接口:
{
"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访问:
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"
]
- 以json对象的形式传递数据
[
{
"userName": "qizekj",
"age": "4"
},
{
"userName": "chenqun",
"age": "32"
}
]
三、SpringMVC 响应json数据
- 在接口上加上@ResponseBody注解,是表示根据该方法返回值,返回对应json数据。底层是根据返回值,序列化成json数据。
- @RestController注解,是标记该控制类所有接口都是返回json数据。
eg:
@RestController
public class QizekjRestController {}
@Controller
@ResponseBody
四、使用HttpServletRequest 获取参数
springmvc底层基于Servlet实现的。
获取httprequest/response三种方式:
- public String qizekj(HttpServletRequest request,HttpServletResponse response)
- HttpServletRequest request = ((ServletRequestAttributes)RequestContextHolder.getRequestAttributes()).getRequest();
- @Autowired
eg:
/**
* 获取到我们的 HttpServletRequest httpServletRequest
*
* @param id
* @param name
* @param httpServletRequest
* @return
*/
@RequestMapping(value = "/httprequestDemo01", method = RequestMethod.GET)
@ResponseBody
public 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 提前缓存好了ttpServletRequest
HttpServletRequest request = ((ServletRequestAttributes) RequestContextHolder.getRequestAttributes()).getRequest();
return "ok---get";
}
/**
* 获取到我们的 HttpServletRequest httpServletRequest
*
* @param id
* @param name
* @return
*/
@RequestMapping(value = "/httprequestDemo02", method = RequestMethod.GET)
@ResponseBody
public 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 提前缓存好了ttpServletRequest
HttpServletRequest 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
*/
}