SpringMVC自定义视图解析器

/**

* 使用View接口完成请求转发|重定向

* 解释:

* SpringMVC的官方,提供了一个叫做View的接口,告诉开发人员

* DispatcherServlet底层会调用View接口的实例化对象中的逻辑方法

* 来完成对应的请求转发和重定向。

* 使用:

* 1. 单元方法的返回值为View接口类型

* 2.真实return的为View接口的实例化对象(视图解析器)。

* 官方提供的实现了View接口的视图解析器:

* InternalResourceView:请求转发

* RedirectView:重定向

* @return

*/

java 复制代码
 @RequestMapping("demoView")
   public View demoView(HttpServletRequest request){
       //处理请求
        System.out.println("MyController.demoView:View接口实例化对象完成请求转发|重定向");
       //响应结果
            //请求转发
                //return  new InternalResourceView("/req.jsp");
            //重定向
                return new RedirectView(request.getContextPath()+"/redirect.jsp");
   }
复制代码
/**
 * SpringMVC视图解析器升级:ModelAndView
 *  问题:
 *      在原有的View接口的视图解析器中需要自己在单元方法中根据响应方式
 *      来创建对应的视图解析器对象返回给DispatcherServlet使用,过于麻烦。
 *  解决:
 *      从根据响应方式的不同创建不同的视图解析器对象,变为只创建一个
 *      视图解析器对象,该对象内部自动根据参数来实现请求转发或者重定向。
 *  实现:
 *      ModelAndView
 *   注意:
 *      升级后也就意味着DispatcherServlet使用ModelAndView来接收
 *      单元方法的返回值,为了兼容早期版本,让ModelAndView可以接收
 *      View接口的实例化对象。
 *  特点:
 *    ModelAndView对象是Model和View对象的结合体。既可以作为视图解析器使用
 *    又可以作为数据流转的载体使用。
 */
java 复制代码
@RequestMapping("md")
public ModelAndView demoModelAndView(){
    //处理请求
    System.out.println("MyController.demoModelAndView:ModelAndView视图解析器");
    //响应结果
        //创建ModelAndView对象
        ModelAndView modelAndView=new ModelAndView();
        modelAndView.addObject("str","我是流转的数据");
        //请求转发
            //modelAndView.setViewName("forward:/mdReq.jsp");
       //重定向
            modelAndView.setViewName("redirect:/mdRedirect.jsp");
        return modelAndView;
}
复制代码
/**
 * SpringMVC视图解析器再次升级:
 *  问题:
 *      在使用了ModelAndView对象后,已经很爽了。但是在单元方法中
 *      我们还需要创建ModelAndView对象并将请求转发或者重定向的
 *      路径存储进入,返回给DispatcherServlet使用,而我们真正
 *      想写的是资源路径以及响应方式
 *  解决:
 *      我们在单元方法中直接返回字符串资源路径及其响应方式关键字。
 *      由DispatcherServlet底层帮我们创建ModelAndView来接收
 *      单元方法的返回值。
 *  注意:
 *      虽然我们在单元方法中直接返回的字符串数据,但是DispatcherServlet
 *      并不是直接使用字符串数据而是仍然调用ModelAndView视图解析器完成请求转发或者重定向。
 */
java 复制代码
@RequestMapping("demoString")
public String demoString(){
    //处理请求
    System.out.println("目前的请求转发或者重定向的方式");
    //响应结果
        //请求转发
            //return "forward:/req.jsp";
        //重定向
            return "redirect:/redirect.jsp";
}

自定义视图解析器

准备步骤

先将lib中的web.xml删掉,重新创建一个,接着创建springmvc.xml文件在src中。

使用:

1.在springmvc.xml文件中进行配置

2.在单元房法中按照指定的格式返回资源路径

在springmvc.xml中

前提:只在请求转发中有效。

当我们return后面没有加forword:,则默认会用ModelandView,反之,会用自定义的视图解析器。

WEB-INF中的jsp页面需要通过,在单元方法中跳转,即

用自定义视图解析器的前提:

取决于请求转发的路径是否为WEB-INF下的,是的话则不需要加forword:。

使用restful声明公共单元方法请求转发WEB-INF下的资源

用来解决controller中,只能请求转发一个资源路径的问题。

方法:根据请求,请求转发WEB-INF下的资源的单元方法是肯定要声明的。我们可以声明一个公共的单元方法,该单元方法不参与请求的逻辑处理,只负责根据请求转发WEB-INF下的资源。

代码

当我们在浏览器页面中,输入我们想要的jsp页面,然而我们的controller中没有return该页面中的值,就会自动去找我们的公共单元方法。

WEB-INF下的静态资源放行配置

红框中是直接去项目的根路径中找,如果我们把js放到WEB-INF中,不放在根路径(Web目录)中,就会出现报错,此时我们需要通过资源放行配置。

相关推荐
折哥的程序人生 · 物流技术专研6 小时前
第4篇:Lambda 简化策略模式(Java 8+)
java·设计模式·策略模式·函数式编程·lambda·代码简化·扩充系列
researcher-Jiang7 小时前
高性能计算之OpenMP——超算习堂学习1
android·java·学习
西门吹-禅8 小时前
java springboot N+1问题
java·开发语言·spring boot
DLYSB_8 小时前
生命通道:如何用 HIS 医疗系统直连网络声光终端,打造“零延误”的危急值响应网关?
java·网络·数据库·报警灯
skywalk81639 小时前
设计并实现段言的 C FFI 绑定机制 @Trae
c语言·开发语言·python·编程
weixin_BYSJ19879 小时前
SpringBoot + MySQL 乒乓球运动员信息管理系统项目实战--附源码04954
java·javascript·spring boot·python·django·flask·php
AI小码9 小时前
LLM 应用的缓存工程:当每次 API 调用都在燃烧成本
java·人工智能·spring·计算机·llm·编程·api
Hui Baby10 小时前
Spring Security
java·后端·spring
IT笔记10 小时前
【Rust】Rust Match 模式匹配详解
java·开发语言·rust
2zcode10 小时前
免费开源项目文档:基于MATLAB卷积神经网络的口罩佩戴检测系统
开发语言·matlab·cnn