SpeingMVC框架(三)

目录

五、响应数据与结果视图

1、返回值分类

2、springmvc的请求转发和重定向

六、异常处理

1、处理思路

2、自定义异常处理器

七、springmvc中的拦截器

1、拦截器概述

2、自定义拦截器步骤


五、响应数据与结果视图

1、返回值分类

返回String:Controller方法返回字符串可以指定逻辑视图的名称,根据视图解析器为物理视图的地址。

返回值是void:如果控制器的方法返回值编写成void,执行程序报404的异常,默认查找JSP页面没有找到。默认会跳转到@RequestMapping(value="/initUpdate") initUpdate的页面。可以使用请求转发或者重定向跳转到指定的页面

返回值是ModelAndView对象:ModelAndView对象是Spring提供的一个对象,可以用来调整具体的JSP视图

2、springmvc的请求转发和重定向

forward请求转发

java 复制代码
@RequestMapping("/save4.do")
    public String save4(){
        System.out.println("执行了...");
        return "forward:/pages/suc.jsp";
    }

redirect重定向

java 复制代码
 @RequestMapping("/save5.do")
    public String save5(){
        System.out.println("执行了...");
        return "redirect:/pages/suc.jsp";
    }

六、异常处理

1、处理思路

Controller调用service,service调用dao,异常都是向上抛出的,最终有DispatcherServlet找异常处理器进行异常的处理。

2、自定义异常处理器

java 复制代码
public class SysExceptionResolver implements HandlerExceptionResolver {
​
    /**
     * 程序出现了异常,调用异常处理器中的方法
     * @param o
     * @param e
     * @return
     */
    @Override
    public ModelAndView resolveException(HttpServletRequest request, HttpServletResponse response, Object o, Exception e) {
        // 在控制台打印异常的信息
        e.printStackTrace();
        // 做强转
        SysException exception = null;
        // 判断
        if(e instanceof SysException){
            exception = (SysException)e;
        }else{
            exception = new SysException("系统正在维护,请联系管理员");
        }
​
        // 存入异常提示信息
        ModelAndView mv = new ModelAndView();
        mv.addObject("errorMsg",e.getMessage());
        // 设置跳转的页面
        mv.setViewName("error");
        return mv;
    }
​
}
​

七、springmvc中的拦截器

  1. 底层实现:过滤器是基于函数回调的,而拦截器是基于Java的反射机制(动态代理)实现的。

1、拦截器概述

  1. SpringMVC框架中的拦截器用于对处理器进行预处理和后处理的技术。
  2. 可以定义拦截器链,连接器链就是将拦截器按着一定的顺序结成一条链,在访问被拦截的方法时,拦截器链中的拦截器会按着定义的顺序执行。
  3. 拦截器和过滤器的功能比较类似,有区别
    1. 过滤器是Servlet规范的一部分,任何框架都可以使用过滤器技术。
    2. 拦截器是SpringMVC框架独有的。
    3. 过滤器配置了/*,可以拦截任何资源。
    4. 拦截器只会对控制器中的方法进行拦截。
  4. 拦截器也是AOP思想的一种实现方式
  5. 想要自定义拦截器,需要实现HandlerInterceptor接口。

2、自定义拦截器步骤

创建类,创建拦截器类 实现HandlerInterceptor接口,重写需要的方法,修改配置信息在springmvc.xml中配置拦截器类
拦截器类

java 复制代码
public class MyInterceptor2 implements HandlerInterceptor{
​
    /**
     * 拦截controller中方法。放行了,执行controller中方法。
     * return true 方向
     * return false 拦截
     * @param request
     * @param response
     * @param handler
     * @return
     * @throws Exception
     */
    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        System.out.println("拦截器preHandle方法执行了...");
        // 手动跳转页面
        // request.getRequestDispatcher("/index.jsp").forward(request,response);
        // 拦截,不放行
        //return false;
        // 放行
        return true;
    }
​
}
​

配置信息

XML 复制代码
<!--配置拦截器们-->
    <mvc:interceptors>
        <!--配置拦截器-->
        <mvc:interceptor>
            <!--该拦截器拦截哪些资源-->
            <mvc:mapping path="/dept/**"/>
            <!--哪些资源不想拦截
            <mvc:exclude-mapping path="" />
            -->
            <!--拦截器对象-->
            <bean class="com.qcbyjy.demo4.MyInterceptor2" />
        </mvc:interceptor>
    </mvc:interceptors>

3、HandlerInterceptor接口中的方法

  1. preHandle方法是controller方法执行前拦截的方法
    1. 可以使用request或者response跳转到指定的页面
    2. return true放行,执行下一个拦截器,如果没有拦截器,执行controller中的方法。
    3. return false不放行,不会执行controller中的方法。
  2. postHandle是controller方法执行后执行的方法,在JSP视图执行前。
    1. 可以使用request或者response跳转到指定的页面
    2. 如果指定了跳转的页面,那么controller方法跳转的页面将不会显示。
  3. postHandle方法是在JSP执行后执行
  4. request或者response不能再跳转页面了
    4、配置多个拦截器
XML 复制代码
<!--配置拦截器们-->
    <mvc:interceptors>
        <!--配置拦截器-->
        <mvc:interceptor>
            <!--该拦截器拦截哪些资源-->
            <mvc:mapping path="/dept/**"/>
            <!--哪些资源不想拦截
            <mvc:exclude-mapping path="" />
            -->
            <!--拦截器对象-->
            <bean class="com.qcbyjy.demo4.MyInterceptor2" />
        </mvc:interceptor>
​
        <!--配置拦截器-->
        <mvc:interceptor>
            <mvc:mapping path="/**"/>
            <bean class="com.qcbyjy.demo4.MyInterceptor3" />
        </mvc:interceptor>
    </mvc:interceptors>
相关推荐
程序猿小D1 分钟前
[附源码+数据库+毕业论文]基于Spring+MyBatis+MySQL+Maven+jsp实现的电影小说网站管理系统,推荐!
java·数据库·mysql·spring·毕业设计·ssm框架·电影小说网站
真的想上岸啊13 分钟前
学习C++、QT---18(C++ 记事本项目的stylesheet)
开发语言·c++·学习
明天好,会的20 分钟前
跨平台ZeroMQ:在Rust中使用zmq库的完整指南
开发语言·后端·rust
丁劲犇1 小时前
用 Turbo Vision 2 为 Qt 6 控制台应用创建 TUI 字符 MainFrame
开发语言·c++·qt·tui·字符界面·curse
旷世奇才李先生1 小时前
Next.js 安装使用教程
开发语言·javascript·ecmascript
木头没有瓜1 小时前
idea离线安装插件
java·ide·intellij-idea
llwszx1 小时前
Spring中DelayQueue深度解析:从原理到实战(附结构图解析)
java·后端·spring·delayqueue·延迟任务
述雾学java2 小时前
Spring Cloud Feign 整合 Sentinel 实现服务降级与熔断保护
java·spring cloud·sentinel
保持学习ing2 小时前
苍穹外卖day3--公共字段填充+新增菜品
java·阿里云·实战·springboot·前后端·外卖项目·阿里云文件存储
charlie1145141912 小时前
深入理解Qt的SetWindowsFlags函数
开发语言·c++·qt·原理分析