SpringMVC(全局异常处理.动态接收Ajax请求)

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);
    }
}

          

            

  • 9
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值