1.全局异常处理
1 异常处理器 基于AOP
用户发起请求,
SpringMVC接受请求,
SpringMVC加载静态资源问题说明
请求过去了,但没有处理
规则说明:静态资源进入SpringMVC框架之后,没有找到要怎样处理静态资源的方法,所以他们就不解决,也就不显示
解决方法:SpringMVC基于Servlet处理器机制,放行静态资源,交给Servlet处理
<!-- 5.放行静态资源-->
<mvc:default-servlet-handler/>
2.异常处理器操作
说明: 使用AOP解决 环绕通知
try-catch的位置: 首选Controller层, 因为Dao和Service层抛出后,最终层还是在Controller层处理
基于注解 全局异常处理
@ControllerAdvice 拦截Controllre层异常
@ExceptionHandler({RunTimeException.class})拦截什么类型的异常
Result包装类
@Data
@NoArgsConstructor
@AllArgsConstructor
public class Result {
private Integer code;
private String msg;
private Object data;
public static Result fail(){
return new Result(201,"业务调用失败",null);
}
public static Result success(){
return new Result(200,"业务调用成功",null);
}
public static Result success(Object obj){
return new Result(200,"业务调用正确",obj);
}
}
@ControllerAdvice springmvc基于aop拦截Controller中的异常信息
@ExceptionHandler 拦截什么异常
@ExceptionHandler(RuntimeException.class)前后端调用时,异常的JSON串返回
//springmvc基于aop拦截Controller中的异常信息
@ControllerAdvice
public class ExceptionAOP {
// //拦截什么异常
// @ExceptionHandler({RuntimeException.class})
// public String exception(){
// System.out.println("全局异常处理机制工作");
// return "error";
//
// }
//前后端调用时,异常的JSON串返回
@ExceptionHandler(RuntimeException.class)
public Result exception(){
return Result.fail();
}
2.SpringMVC动态接收Ajax请求
1.搭建前端脚手架工程
创建项目
引入axios
创建Axios请求对象
delete和get请求格式一致
put和post请求格式一致
发起Ajax请求
2.搭建后端服务器
引入jar包 jackson
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
<version>2.12.1</version>
</dependency>
解决跨域问题
核心注解: @CrossOrigin
3. 接收Ajax请求
原始接收请求实在是太麻烦 ,后面有用注解简化
/**
* 思考:
* 1. 前端JS发起请求
* 2. 后端服务器java代码实现请求
* 3. 前后端交互使用JSON串
* 4. 获取用户对象进行返回
*/
@RequestMapping("/getMsg")
public void getMsg(int id,String name,HttpServletResponse response) throws IOException {
System.out.println("获取客户端数据:"+id+":"+name);
ObjectMapper objectMapper = new ObjectMapper();
User user = new User("admin","123456");
String json = objectMapper.writeValueAsString(user);
response.getWriter().write(json);
}
4.前端返回值
@RequestBody
主要接收Ajax post请求
作用:将请求体里面的JSON串转化为java对象
注解写在参数当中
注意事项:json串中的属性名称,必须与对象中的属性名称一致
//如何获取请求体中的数据 JSON串 > java对象
@PostMapping("/login")
public User login(@RequestBody User user) throws IOException {
System.out.println(user);
user.setUsername("success!!!!");
return user;
}
@ResponseBody
将方法的返回值自动转化为JSON串
如果该注解标识在类上, 表示当前类中的所有方法 都按照JSON返回.
/**
* SpringMVC 为了简化Ajax调用方式
* 1.@RequestBody 将请求体中的json串 转化为Java对象
* 2.@ResposeBody 将Java对象转化为JSON串返回
*/
@RequestMapping("/getMsg2")
//@ResponseBody
public User getMsg2(int id,String name) throws IOException {
System.out.println("获取参数:"+id+":"+name);
return new User("zhangsan","123456");
}
5.统一数据返回值的说明
1.RestController 是ResponseBody和Controller注解的结合注解
当前类中的所有的方法按照JSON串返回
//@ResponseBody //当前类中的所有方法 都按照JSON串返回
@RestController
前后端调用时,异常的json串返回
2.RestControllerAdvice是@ResponseBody和@ExceptionHandler的结合注解
全局异常处理机制中的
//springmvc基于aop拦截Controller中的异常信息
@ControllerAdvice
public class ExceptionAOP {
// //拦截什么异常
// @ExceptionHandler({RuntimeException.class})
// public String exception(){
// System.out.println("全局异常处理机制工作");
// return "error";
//
// }
//前后端调用时,异常的JSON串返回
@ExceptionHandler(RuntimeException.class)
public Result exception(){
return Result.fail();
}
package com.atguigu.controller;
import com.atguigu.pojo.User;
import com.atguigu.vo.Result;
import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.ObjectMapper;
import org.springframework.stereotype.Controller;
import org.springframework.util.StringUtils;
import org.springframework.web.bind.annotation.*;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.BufferedReader;
import java.io.IOException;
//@Controller
@RequestMapping("/ajax")
//当前的所有的请求支持跨域访问!!!
//@CrossOrigin(value = "指定发起请求的网址是谁!!!")
@CrossOrigin
//@ResponseBody //当前类中的所有方法 都按照JSON串返回
@RestController
public class AjaxController {
/**
* 思考:
* 1. 前端JS发起请求
* 2. 后端服务器java代码实现请求
* 3. 前后端交互使用JSON串
* 4. 获取用户对象进行返回
*/
@RequestMapping("/getMsg")
public void getMsg(int id,String name,HttpServletResponse response) throws IOException {
System.out.println("获取客户端数据:"+id+":"+name);
ObjectMapper objectMapper = new ObjectMapper();
User user = new User("admin","123456");
String json = objectMapper.writeValueAsString(user);
response.getWriter().write(json);
}
/**
* SpringMVC 为了简化Ajax调用方式
* 1.@RequestBody 将请求体中的json串 转化为Java对象
* 2.@ResposeBody 将Java对象转化为JSON串返回
*/
@RequestMapping("/getMsg2")
//@ResponseBody
public User getMsg2(int id,String name) throws IOException {
System.out.println("获取参数:"+id+":"+name);
return new User("zhangsan","123456");
}
//如何获取请求体中的数据 JSON串 > java对象
@PostMapping("/login")
public User login(@RequestBody User user) throws IOException {
System.out.println(user);
user.setUsername("success!!!!");
return user;
}
/**
* BufferedReader reader = request.getReader();
* String data = null;
* StringBuffer sbf = new StringBuffer();
* while (StringUtils.hasLength(data=reader.readLine())){
* sbf.append(data);
* }
* String json = sbf.toString();
* ObjectMapper objectMapper = new ObjectMapper();
* objectMapper.readValue(json,XXXX.class);
*/
@GetMapping("/getResult")
public Result getResult(){
User user = new User("zhangsan","123456");
int a = 1/0;
return Result.success(user);
}
}