Spring MVC学习随笔-Ajax集成(JSON格式返回数据)、拦截器(MyInterceptor ...

打印 上一主题 下一主题

主题 868|帖子 868|积分 2604

学习视频:【编程不良人】继spring之后快速入门springmvc,面对SpringMVC不用慌
第七章、SpringMVC与Ajax集成


  • 引入相关依赖
    1. <dependency>
    2.   <groupId>com.fasterxml.jackson.core</groupId>
    3.   <artifactId>jackson-databind</artifactId>
    4.   <version>2.9.8</version>
    5. </dependency>
    复制代码
  • 开发控制器
    1. @Controller
    2. @RequestMapping("json")
    3. public class JsonController {
    4.     /**
    5.      * 使用阿里fastjson转换json
    6.      */
    7.     @RequestMapping("showAll")
    8.     public @ResponseBody List<User> findAll() {
    9.         //1.收集数据
    10.         //2.调用业务
    11.         List<User> users = new ArrayList<>();
    12.         users.add(new User(UUID.randomUUID().toString(), "小红", 23, new Date()));
    13.         users.add(new User(UUID.randomUUID().toString(), "小名", 29, new Date()));
    14.         users.add(new User(UUID.randomUUID().toString(), "小撒", 25, new Date()));
    15.         return users;
    16.     }
    17.     @RequestMapping("findAll")
    18.     public void findAll(HttpServletResponse response) throws IOException {
    19.         //1.收集数据
    20.         //2.调用业务
    21.         List<User> users = new ArrayList<>();
    22.         users.add(new User(UUID.randomUUID().toString(), "小陈", 23, new Date()));
    23.         users.add(new User(UUID.randomUUID().toString(), "小名", 29, new Date()));
    24.         users.add(new User(UUID.randomUUID().toString(), "小撒", 25, new Date()));
    25.         // fastjson
    26.         String s = JSONObject.toJSONStringWithDateFormat(users, "yyyy-MM-dd");
    27.         response.setContentType("application/json;charset=UTF-8");
    28.         response.getWriter().println(s);
    29.     }
    30. }
    复制代码
  • 日期格式修正
    1. @JsonFormat(pattern = "yyyy-MM-dd")
    2. private Date bir;
    复制代码

    可以正常响应
第八章、SpringMVC的拦截器



  • 拦截器 :Interceptor  拦截 中断
    类似于javaweb中的Filter,不过没有Filter那么强大
  • 作用
    Spring MVC的拦截器是一种用于在请求处理过程中进行预处理和后处理的机制。拦截器可以在请求到达控制器之前和之后执行一些操作,例如日志记录、权限验证、数据处理等。
  • 拦截器特点

    • 请求到达会经过拦截器,响应回来同样会经过拦截器
    • 拦截器只能Controller的请求,不能拦截jsp、静态资源相关请求
    • 拦截器可以中断请求轨迹

  • 开发拦截器

    • 类 实现implements HandlerInterceptor接口中的方法
    • 配置拦截器
      注册拦截器对象  bean id class=””
      配置拦截器拦截请求路径



  • 编码和测试结果
    拦截器接口的实现
    1. public class MyInterceptor implements HandlerInterceptor {
    2.     @Override
    3.     //**参数1:当前请求对象  参数2:当前请求响应对象 参数3:当前请求的控制器对应的方法对象**
    4.     public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
    5.         System.out.println("handler = " + ((HandlerMethod)handler).getMethod().getName() );
    6.         System.out.println("MyInterceptor.preHandle");
    7.         //强制用户登录
    8.         Object user = request.getSession().getAttribute("user");
    9. //        if (user == null) {
    10. //            // 重定向到登录页面
    11. //            response.sendRedirect(request.getContextPath() + "/login.jsp");
    12. //            return false;
    13. //        }
    14.         return HandlerInterceptor.super.preHandle(request, response, handler);
    15.     }
    16.     @Override
    17.     // 参数1、2、3同上 **参数4:当前控制器方法的返回值**
    18.     public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
    19.         System.out.println("modelAndView = " + modelAndView);
    20.         System.out.println("MyInterceptor.postHandle");
    21.         HandlerInterceptor.super.postHandle(request, response, handler, modelAndView);
    22.     }
    23.     @Override
    24.     // 参数1、2、3同上 **参数4:请求过程中出现异常时的异常对象**
    25.     public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
    26.         System.out.println("MyInterceptor.afterCompletion");
    27.         if (ex != null) {
    28.             System.out.println("ex.getMessage() = " + ex.getMessage());
    29.         }
    30.         HandlerInterceptor.super.afterCompletion(request, response, handler, ex);
    31.     }
    32. }
    复制代码
    dispatcher.xml 配置拦截器
    1. <bean id="myInterceptor" />
    2. <mvc:interceptors>
    3.    
    4.     <mvc:interceptor>
    5.         
    6.         <mvc:mapping path="/json/test"/>
    7.         
    8.         <mvc:exclude-mapping path="/json/showAll"/>
    9.         
    10.         <ref bean="myInterceptor"/>
    11.     </mvc:interceptor>
    12. </mvc:interceptors>
    复制代码
    进行测试
    1. @RequestMapping("test")
    2.     public String test() {
    3.         System.out.println("JsonController.test");
    4. //        throw new RuntimeException();
    5.         return "index";
    6.     }
    复制代码

    按预期执行顺序执行
    看到拦截器的执行顺序,我们会联想到Spring中的AOP,两者的底层逻辑都是通过动态代理实现的,虽然拦截器和AOP都可以用于在请求处理过程中添加额外的逻辑,但拦截器更专注于请求处理阶段的任务,而AOP更适用于在不同模块中实现横切关注点的功能。
关于动态代理和AOP底层可以看之前学习的:Spring5学习随笔-AOP底层实现(JDK、CGlib)、实现切面(@Aspect)
Spring5学习随笔-AOP系列Spring动态代理
第九章、SpringMVC中的全局异常处理


  • SpringMVC作为一个控制主要作用

    • 处理请求 接收请求数据  调用业务对象
    • 请求响应 跳转对应视图展示数据


  • 现有控制器开发存在问题?

    • 在处理用户请求出现运行时异常直接响应给用户的是一个错误节目,对于用户的使用体验不友好。


      没有使用全局异常处理时

  • 全局异常处理机制
    作用:用来解决整合系统中任意一个控制器抛出异常时的统一处理入口


  • 编码
    开发控制类
    1. public class GlobalExceptionResolver implements HandlerExceptionResolver {
    2.     /**
    3.      * 用来处理发生异常时的方法
    4.      *
    5.      * @param request  当前请求对象
    6.      * @param response 当前请求对应的响应对象
    7.      * @param handler  当前请求的方法对象
    8.      * @param ex       当前出现异常时的异常对象
    9.      * @return 出现异常时展示视图和数据
    10.      */
    11.     @Override
    12.     public ModelAndView resolveException(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) {
    13.         System.out.println("进入全局异常处理器,获取的异常信息为:" + ex.getMessage());
    14.         ModelAndView modelAndView = new ModelAndView();
    15.         // 基于不同业务异常跳转到不同页面
    16.         modelAndView.setViewName("redirect:/error.jsp"); // return "error" -> error.jsp
    17.         // modelAndView中的model默认放到request作用域,如果使用redirect跳转,model中数据会自动拼接到跳转url
    18.         modelAndView.addObject("msg", ex.getMessage());
    19.         return modelAndView;
    20.     }
    21. }
    复制代码
    dispatcher.xml 配置全局异常处理类
    1. [/code]
    2. [*]基于不同业务异常跳转不同页面
    3. [code]// 基于不同业务异常跳转到不同页面
    4. if (ex instanceof NotFoundException) {
    5.     modelAndView.setViewName("notFound");
    6. } else if (ex instanceof GeneralException) {
    7.     modelAndView.setViewName("generalException");
    8. }
    复制代码

异常处理器的工作流程

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复

使用道具 举报

0 个回复

正序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

前进之路

金牌会员
这个人很懒什么都没写!

标签云

快速回复 返回顶部 返回列表