目录
三、前后端分离:返回数据给前端(前后端一体,转发,重定向页面跳转)
一、springmvc 接收请求
类上、方法上
- @RequestMapping
- @GetMapping
- @PostMapping
package com.hl.springmvc02.web;
import jdk.nashorn.internal.objects.annotations.Getter;
import org.springframework.web.bind.annotation.*;
@RestController
@RequestMapping("/user")
public class UserController {
//get 请求默认访问方法
@GetMapping
public String welcome(){
System.out.println("welcome");
return "welcome!";
}
//post请求执行的默认方法
@PostMapping
public String welcome2(){
System.out.println("welcome2");
return "welcome2!";
}
/*
url: http://localhost:8080/user/save
@RequestMapping:默认情况下,接收任意类型请求
限制只能接收特定请求 method = RequestMethod.GET 只接收get请求
method = RequestMethod.GET|POST|PUT|DELETE
*/
@RequestMapping(value = {"/save1","/save2","/save"},
method = RequestMethod.GET)
public void save(){
System.out.println("save");
}
}
二、springmvc 接收前端数据
1、接收参数
方式一、原生 HttpServletRequest 接收数据
方式二:通过参数名称接收 要求 url后传递的参数名和方法的形参名保持一致
方式三、参数名称不一致时 @RequestParam(name = "username") 参数映射
1、限制是否允许为空 —— @RequestParam 默认不允许为空
@RequestParam(required = false)——————required = false 允许为空,required = true 不允许为空
2、是否给默认值 @RequestParam(defaultValue = "12345")
@RequestParam:此注解用来绑定 web 请求参数到方法参数上
方式四、通过对象接收数据 (当前端传递的参数名和对象的属性名保持一致时)
http://locahost:8080/product/save5?id=12&name=admin
方法五、restful风格接收(@PathVariable 地址栏传参)
http://localhost:8080/product/save6/1/admin
微服务中推荐的模式
package com.hl.springmvc02.web;
import com.hl.springmvc02.pojo.Product;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
import javax.servlet.http.HttpServletRequest;
@RestController
@RequestMapping("/product")
public class ProductController {
/*
接收数据
方式一、原生 HttpServletRequest 接收数据
*/
@RequestMapping("/save")
public String save(HttpServletRequest request){
//接收参数 返回值只能是字符串类型
String name = request.getParameter("name");
String id = request.getParameter("id");
//类型转换时,需要手动转换
if(id !=null && id!=""){
System.out.println(Integer.parseInt(id));
}
return "save!"+id+"---"+name;
}
/*
方式二:通过参数名称接收 要求 url后传递的参数名和方法的形参名保持一致
http://localhost:8080/product/save2?id=11&name=admin
尽可能使用包装类,而不是基本数据数据类型
*/
@RequestMapping("/save2")
public String save2(Integer id,String name){
return "save!"+id+"--"+name;
}
@RequestMapping("/save3")
public String save3(int id,String name){
return "save!"+id+"--"+name;
}
/*
方式三、参数名称不一致时 @RequestParam(name = "username") 参数映射
1、限制是否允许为空 @RequestParam 默认不允许为空
@RequestParam(required = false)
required = false 是否允许为空
2、是否给默认值 @RequestParam(defaultValue = "12345")
*/
@RequestMapping("/save4")
public String save4(@RequestParam(defaultValue = "12345",required = false)
Integer id,
@RequestParam(name = "username") String name){
return id+"---"+name;
}
/*
方式四、通过对象接收数据 (当前端传递的参数名和对象的属性名保持一致时)
http://locahost:8080/product/save5?id=12&name=admin
*/
@RequestMapping("save5")
public Product save5(Product product,String name1){
System.out.println(name1);
return product;
}
/*
方法五、restful风格接收(@PathVariable 地址栏传参)
http://localhost:8080/product/save6/1/admin
微服务中推荐的模式
*/
@RequestMapping("/save6/{id1}/{name}")
public Product save6(@PathVariable(name = "id1") Integer id,
@PathVariable(required = false) String name){
System.out.println(id+"---"+name);
return new Product(id,name);
}
/*
常见错误类型:
404:路径未找到 http://localhost:8080/product/save4
405: 方法不匹配 前端get ----> 服务端@PostMapping
@RequestMapping(method="")
400: 参数赋值错误
前端id=abc 服务端:Integer id
前端没有传递id null 服务端 int id null--->int 报错
前端id没有传值 服务端 @RequestParam(required=true) Integer id
500: 服务端错误
1、接收到请求了
2、接收到数据
3、方法体报错
*/
}
2、cookie数据
cookie传递数据
@CookieValue 从cookie中获取数据,根据key找到value
/*
cookie传递数据
@CookieValue 从cookie中获取数据,根据key找到value
*/
@RequestMapping("/cookie")
public String getCookie(@CookieValue(name = "username",required = false)
String username){
return username;
}
3、请求头中数据
@RequestHeader(name = "user-agent") String userAgent
获取浏览器请求头中特定key对应的value
@RestController
@RequestMapping("/order")
public class OrderController {
/*
@RequestHeader(name = "user-agent") String userAgent
获取浏览器请求头中特定key对应的value
*/
@RequestMapping("/header")
public String header(@RequestHeader(name = "User-Agent") String userAgent,
@RequestHeader(name = "token") String token){
return userAgent+"---"+token;
}
}
4、接收其他controller转发的数据
业务操作:调用service
package com.hl.springmvc02.web;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestAttribute;
import org.springframework.web.bind.annotation.RequestMapping;
import javax.servlet.http.HttpServletRequest;
@Controller
@RequestMapping("/s1")
public class DispatcherController {
@RequestMapping("/getMsg")
public String getMsg(HttpServletRequest request){
System.out.println("getMsg......");
//获取浏览器传递的参数
String msg = request.getParameter("msg");
//一次转发过程中携带数据(传递数据)
request.setAttribute("msg1","hello world!");
//转发到其他的controller方法
return "/s1/getData";
}
@RequestMapping("/getData")
public String getData(HttpServletRequest request,@RequestAttribute(required = false) String msg1){
System.out.println("getData......");
//获取request转发携带的数据
System.out.println(request.getAttribute("msg1"));
System.out.println("--注解获取--"+msg1);
//转发到页面
return "/index.html";
}
}
三、前后端分离:返回数据给前端(前后端一体,转发,重定向页面跳转)
@ResponseBody
@RestController
统一返回数据格式
声明一个结果集R类
package com.hl.springmvc02.pojo;
import lombok.Data;
/*
R ---> 结果集对象(响应对象)
统一封装 服务端返回给前端的数据
*/
@Data
public class R {
private Integer code;//状态码
private String msg;//描述信息
private Object data;//传递的数据
//成功的方法
public static R ok() {
return new R(200,"操作成功",null);
}
//成功的方法
public static R ok(Object data) {
return new R(200,"操作成功",data);
}
//成功的方法
public static R ok(String msg ,Object data) {
return new R(200,msg,data);
}
//失败的方法
public static R fail(String msg) {
return new R(201,msg,null);
}
public R(Integer code, String msg, Object data) {
this.code = code;
this.msg = msg;
this.data = data;
}
public R() {
}
}
package com.hl.springmvc02.web;
import com.hl.springmvc02.pojo.R;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
@RequestMapping("/response")
public class ResponseController {
@RequestMapping("/data")
public R data(){
//业务逻辑
return R.ok();
}
@RequestMapping("/data2")
public R data2(){
return R.ok("新增成功",null);
}
@RequestMapping("/data3")
public R data3(){
return R.fail("用户名已存在!");
}
}
四、springmvc 的内部执行流程
五、各种常见错误及解决方案
404:路径未找到 http://localhost:8080/product/save4
405: 方法不匹配 前端get ----> 服务端@PostMapping @RequestMapping(method="")
400: 参数赋值错误
前端id=abc 服务端:Integer id
前端没有传递id null 服务端 int id null--->int 报错
前端id没有传值 服务端 @RequestParam(required=true) Integer id
500: 服务端错误
1、接收到请求了
2、接收到数据
3、方法体报错
状态码 | 错误类型 | 常见原因 | 解决方案 |
---|---|---|---|
404 | 路径未找到 | 请求的URL路径错误,如:http://localhost:8080/product/save4 不存在 | 检查后端路由是否正确,确保请求路径与 @RequestMapping 匹配 |
405 | 方法不匹配 | 前端使用 GET 请求,但服务端要求 POST (如 @PostMapping 或 @RequestMapping(method = RequestMethod.POST) ) | 确保前后端请求方法一致 |
400 | 参数赋值错误 | 1. 前端传递 id=abc ,但服务端要求 Integer id 2. 前端未传 id ,但服务端 @RequestParam(required=true) 3. 前端传 null ,但服务端用 int (不能为 null ) | 确保参数类型匹配,使用 Integer 代替 int ,或设置 required=false |
500 | 服务端内部错误 | 1. 接收到请求但数据处理出错(如空指针、数据库异常等) 2. 方法体执行时报错(如类型转换异常、SQL错误等) | 检查服务端日志,排查代码逻辑或数据库问题 |
补充说明:
-
404:检查
@RequestMapping
路径是否正确,包括类和方法上的路径组合。 -
405:使用
@GetMapping
、@PostMapping
等明确指定方法,或检查前端请求方式。 -
400:确保参数类型匹配,必要时使用
@RequestParam(required = false)
或包装类(如Integer
)。 -
500:查看服务端异常堆栈,定位具体错误(如数据库连接、空指针等)。
总结
1、SpringMVC接收请求的方式
@RequestMapping ,@GetMapping,@PostMapping 区别
注解 | 匹配的HTTP方法 | 是否可指定方法 | 适用场景 | 示例写法 |
---|---|---|---|---|
@RequestMapping | 所有方法(默认) | ✅(可指定 method ) | 需要灵活匹配多种请求方式时 | @RequestMapping(value="/api", method=POST) |
@GetMapping | 仅 GET | ❌(固定GET) | 查询数据、页面跳转 | @GetMapping("/users") |
@PostMapping | 仅 POST | ❌(固定POST) | 提交表单、新增数据 | @PostMapping("/users") |
2、SpringMVC接收数据
1、接收参数
方式一、原生 HttpServletRequest 接收数据
方式二:通过参数名称接收 要求 url后传递的参数名和方法的形参名保持一致
方式三、参数名称不一致时 @RequestParam(name = "username") 参数映射
1、限制是否允许为空 —— @RequestParam 默认不允许为空
@RequestParam(required = false)——————required = false 允许为空,required = true 不允许为空
2、是否给默认值 @RequestParam(defaultValue = "12345")
@RequestParam:此注解用来绑定 web 请求参数到方法参数上
方式四、通过对象接收数据 (当前端传递的参数名和对象的属性名保持一致时)
http://locahost:8080/product/save5?id=12&name=admin
方法五、restful风格接收(@PathVariable 地址栏传参)
http://localhost:8080/product/save6/1/admin
微服务中推荐的模式
cookie传递数据
@CookieValue 从cookie中获取数据,根据key找到value
3、请求头中数据
@RequestHeader(name = "user-agent") String userAgent
获取浏览器请求头中特定key对应的value
4、接收其他controller转发的数据
业务操作:调用service
3、SpringMVC返回数据给前端 R
code | msg | data
code---状态码
msg---描述信息
data---数据
返回方式 | 适用场景 | 示例代码 |
---|---|---|
@ResponseBody | 混合架构(部分JSON,部分视图) | @ResponseBody public User getUser() |
@RestController | 纯API接口(全部返回JSON) | @RestController public class ApiController |
统一R类 | 标准化响应(code+msg+data) | return R.success(data) |
直接返回对象 | 简单场景(Spring自动转JSON) | return user; |
4、各种常见的错误及解决方案
状态码 | 错误类型 | 常见原因 | 解决方案 |
---|---|---|---|
404 | 路径未找到 | 请求的URL路径错误,如:http://localhost:8080/product/save4 不存在 | 检查后端路由是否正确,确保请求路径与 @RequestMapping 匹配 |
405 | 方法不匹配 | 前端使用 GET 请求,但服务端要求 POST (如 @PostMapping 或 @RequestMapping(method = RequestMethod.POST) ) | 确保前后端请求方法一致 |
400 | 参数赋值错误 | 1. 前端传递 id=abc ,但服务端要求 Integer id 2. 前端未传 id ,但服务端 @RequestParam(required=true) 3. 前端传 null ,但服务端用 int (不能为 null ) | 确保参数类型匹配,使用 Integer 代替 int ,或设置 required=false |
500 | 服务端内部错误 | 1. 接收到请求但数据处理出错(如空指针、数据库异常等) 2. 方法体执行时报错(如类型转换异常、SQL错误等) | 检查服务端日志,排查代码逻辑或数据库问题 |
补充说明:
-
404:检查
@RequestMapping
路径是否正确,包括类和方法上的路径组合。 -
405:使用
@GetMapping
、@PostMapping
等明确指定方法,或检查前端请求方式。 -
400:确保参数类型匹配,必要时使用
@RequestParam(required = false)
或包装类(如Integer
)。 -
500:查看服务端异常堆栈,定位具体错误(如数据库连接、空指针等)。