SpringMVC超详细讲解视图和视图解析器

目录
  • SpringMVC-视图和视图解析器
    • 1.基本介绍
    • 2.自定义视图
      • 1.为什么要自定义视图
      • 2.自定义视图实例-代码实现
    • 3.自定义视图工作流程小结
      • 自定义视图-小结
      • 自定义视图-工作流程
    • 4.目标方法直接指定转发或重定向
      • 1.使用实例
      • 2.指定请求转发流程-Debug源码
      • 3.指定重定向流程-Debug源码

SpringMVC-视图和视图解析器

1.基本介绍

在 springMVC 中的目标方法最终返回都是一个视图(有各种视图).

返回的视图都会由一个视图解析器来处理 (视图解析器有很多种)

2.自定义视图

1.为什么要自定义视图

在默认情况下,我们都是返回默认的视图, 然后这个返回的视图交由 SpringMVC 的 InternalResourceViewResolver 视图处理器来处理的

<bean id="internalResourceViewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver">
    <property name="prefix" value="/WEB-INF/pages/"/>
    <property name="suffix" value=".jsp"/>
</bean>

在实际开发中,我们有时需要自定义视图,这样可以满足更多更复杂的需求

2.自定义视图实例-代码实现

1.配置 springDispatcherServlet-servlet.xml , 增加自定义视图解析器

<!--
    1. 配置自定义视图解析器BeanNameViewResolver
    2. BeanNameViewResolver可以去解析我们自定义的视图
    3. 配置 属性 order, 表示视图解析器执行的顺序, 值越小, 优先级越高
    4. 属性 order 的默认值是最低优先级 ,值为 Integer.MAX_VALUE
       int LOWEST_PRECEDENCE = 2147483647
-->
<bean class="org.springframework.web.servlet.view.BeanNameViewResolver">
    <property name="order" value="99"/>
</bean>

2.创建自定义视图类

@Component(value = "view")
public class MyView extends AbstractView {
    @Override
    protected void renderMergedOutputModel(Map<String, Object> model,
                                           HttpServletRequest request,
                                           HttpServletResponse response) throws Exception {
        //完成视图渲染
        //并且可以确定我们要跳转的页面 [请求转发] /WEB-INF/pages/my_view.jsp
        System.out.println("进入到自己的视图..");
   		Object o = model.get("name");
        //llp
        System.out.println(o);
        //1. 下面就是进行请求转发到 /WEB-INF/pages/my_view.jsp
        //2. /WEB-INF/pages/my_view.jsp 会被springmvc解析
        //   /springmvc/WEB-INF/pages/my_view.jsp
        request.getRequestDispatcher("/WEB-INF/pages/my_view.jsp").forward(request, response);
    }
}

3.创建goodsHandler测试

@Controller
@RequestMapping("goods")
public class GoodsHandler {
    @RequestMapping(value = "/buy")
    public String byGoods(Map<String,Object> map){
        map.put("name","llp");
        return "view";
    }
}

4.创建my_view.jsp

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>my_view页面</title>
</head>
<h1>进入到my_view页面</h1>
<p>是从自定义视图来的..</p>
<body>
</body>
</html>

5.测试效果

3.自定义视图工作流程小结

自定义视图-小结

自定义视图: 创建一个 View 的 bean, 该 bean 需要继承自 AbstractView, 并实现 renderMergedOutputModel 方法.

并把自定义 View 加入到 IOC 容器中

自定义视图的视图处理器,使用 BeanNameViewResolver, 这个视图处理器也需要配置 到 ioc 容器

BeanNameViewResolver 的调用优先级需要设置一下,设置 order 比 Integer.MAX_VAL 小的值. 以确保其在 InternalResourceViewResolver 之前被调用

自定义视图-工作流程

1. SpringMVC 调用目标方法, 返回自定义 View 在 IOC 容器中的 id 
1. SpringMVC 调用 BeanNameViewResolver 解析视图: 从 IOC 容器中获取 返回 id 值对应的 bean, 即自定义的 View 的对象
1. SpringMVC 调用自定义视图的 renderMergedOutputModel 方法渲染视图 
1.  说明: 如果在 SpringMVC 调用目标方法, 返回自定义 View 在 IOC 容器中的 id, 不存在, 则仍然按照默认的视图处理器机制处理
1. 如果将默认视图解析器设置的优先级比自定义视图高,默认视图解析器不管页面是否存在都会直接返回,不会在走自定义视图解析器。

自定义 View在IOC容器中的 id存在时,自定义视图解析器执行流程:

自定义 View在IOC容器中的 id不存在时,自定义视图解析器执行流程

通用会先执行BeanNameViewResolver,可以看到此时,容器中不包含id=”view”的bean

回到DispatcherServlet我们可以看到 List viewResolvers列表包含两个视图解析器,一个时自定义的视图还有一个是默认的视图解析器。如果返回的自定义视图为空,会继续遍历最终初始化默认视图解析器从而按照默认视图解析器的处理机制继续执行,不管/WEB-INF/pages/view.jsp 是否存在程序都会返回

4.目标方法直接指定转发或重定向

1.使用实例

目标方法中指定转发或者重定向

默认返回的方式是请求转发,然后用视图处理器进行处理,比如在目标方法中这样写:

@Controller
public class LoginServlet {
    @RequestMapping(value = "/login")
    public String login(){
        System.out.println("login....");
        return "login_ok";
    }
}

也可以在目标方法直接指定重定向或转发的 url 地址

如果指定重定向,不能定向到 /WEB-INF 目录中

应用实例-代码实现

修改 GoodsHandler.java, 增加方法 order()

/**
 * 演示直接指定要请求转发的或者是重定向的页面
 * @return
 */
@RequestMapping(value = "/order")
public String order() {
    System.out.println("=======order()=====");
    //请求转发到 /WEB-INF/pages/my_view.jsp
    //下面的 /WEB-INF/pages/my_view.jsp 被解析成 /springmvc/WEB-INF/pages/my_view.jsp
    //return "forward:/WEB-INF/pages/my_view.jsp";
    //return "forward:/aaa/bbb/ok.jsp";
    //直接指定要重定向的页面
    //1. 对于重定向来说,不能重定向到 /WEB-INF/ 目录下
    //2. redirect 关键字,表示进行重定向
    //3. /login.jsp 在服务器解析 /springmvc/login.jsp
    return "redirect:/login.jsp";
    // /WEB-INF/pages/my_view.jsp 被解析 /springmvc/WEB-INF/pages/my_view.jsp
    //return "redirect:/WEB-INF/pages/my_view.jsp";
}

2.修改view.jsp

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>自定义视图测试</title>
</head>
<body>
<h1>自定义视图测试</h1>
<a href="goods/buy" rel="external nofollow" >点击到自定义视图-</a><br/>
<a href="goods/order" rel="external nofollow" >测试在目标方法中指定请求转发或者重定向的页面-</a><br/>
</body>
</html>

2.指定请求转发流程-Debug源码

1.SpirngMVC默认情况下

/**
 * 演示直接指定要请求转发的或者是重定向的页面
 * @return
 */
@RequestMapping(value = "/order")
public String order() {
    System.out.println("=======order()=====");
      return  "my_view.jsp";
}

可以看到默认转发是走的InternalResourceView默认视图解析器,beanName=my_view.jsp 对应的实例则是InternalResourceView

最终执行到InternalResourceView的renderMergedOutputModel方法中dispatcherPath=/WEB-INF/pages/my_view.jsp.jsp进行请求转发

2.指定forward关键字

/**
 * 演示直接指定要请求转发的或者是重定向的页面
 * @return
 */
@RequestMapping(value = "/order")
public String order() {
    System.out.println("=======order()=====");
    return "forward:/WEB-INF/pages/my_view.jsp";
}

在DispatcherServlet中我们可以看到,当我们指定了forward关键字时,viewResolver还是默认的InternalResourceView,和不指定forward关键字不同的地方子在于,指定了关键字后beanName变成了forward: 而url则是我们后面指定的路径,因此我们在使用forward关键字进行请求转发时,SpringMVC底层会根据程序员在后面指定的路径进行请求转发,如果设置的路径不存在则会抛出404NOTFOUND异常

3.指定重定向流程-Debug源码

/**
 * 演示直接指定要请求转发的或者是重定向的页面
 * @return
 */
@RequestMapping(value = "/order")
public String order() {
    System.out.println("=======order()=====");
    return "redirect:/login.jsp";
}

在前面我们配置了自定义视图和默认视图解析器,可以看到这里走的是默认的视图解析器。redirect: 被作为beanName, RedirectView则是对应的bean实例

从里可以看出在SpringMvc中,重定向"redirect:/login.jsp" ,斜杠被浏览器解析成ip:port,而在服务端springmvc底层RedirectView会解析成“/springmvc/login.jsp”

RedirectView

@Override
protected void renderMergedOutputModel(Map<String, Object> model, HttpServletRequest request,
      HttpServletResponse response) throws IOException {
   String targetUrl = createTargetUrl(model, request);
   targetUrl = updateTargetUrl(targetUrl, model, request, response);
   // Save flash attributes
   RequestContextUtils.saveOutputFlashMap(targetUrl, request, response);
   // Redirect 重定向
   sendRedirect(request, response, targetUrl, this.http10Compatible);
}

到此这篇关于SpringMVC超详细讲解视图和视图解析器的文章就介绍到这了,更多相关SpringMVC视图内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • 使用springmvc配置视图解析器和重定向方式

    目录 springmvc配置视图解析器和重定向 为什么需要配置视图解析器 配置步骤 解决配置视图解析器带来的问题 重定向 配置多个视图解析器 springmvc controller springmvc配置视图解析器和重定向 为什么需要配置视图解析器 看图 配置步骤 第一步:需要在springmvc.xml配置 <!-- 配置SpringMVC的视图解析器: 配置前缀和后缀 --> <bean class="org.springframework.web.servlet.vie

  • SpringMVC视图转发重定向区别及控制器示例详解

    目录 SpringMVC视图 一.ThymeleafView 二.转发视图 三.重定向视图 四.转发和重定向区别 五.视图控制器 view-controller SpringMVC视图 SpringMVC 中的视图是 View 接口,视图的作用是渲染数据,将模型 Model 中的数据展示给用户. 视图的种类很多,默认有:转发视图和重定向视图. 若使用的视图技术为 Thymeleaf,在 SpringMVC 的配置文件中配置了 Thymeleaf 的视图解析器,由此视图解析器解析之后所得到的是 T

  • springMVC中的view视图详细解析

    目录 1.ThymleafView 2.转发视图 3.重定向视图 4.视图控制器view-controller Spring MVC中的视图是view接口,视图的作用是渲染数据,将模型model中的数据展示给用户. springMVC视图的种类很多,默认有转发视图和重定向视图. 当工程引入jstl的依赖,转发视图会自动转换为jstlView,若使用的视图技术为Thymleaf,在springMVC的配置文件中配置了Thymleaf的视图解析器,由此视图解析器解析之后所得到的是ThymleafVi

  • SpringMVC响应视图和结果视图详解

    目录 1.返回字符串,Model传输数据 2.void(不经常使用) 3.返回ModelAndView完成跳转页面和传输数据 4.forward转发 5.redirect重定向 1.返回字符串,Model传输数据 /** * 返回String * @param model * @return */ @RequestMapping("/testString") public String testString(Model model){ System.out.println("

  • SpringMVC通过模型视图ModelAndView渲染视图的实现

    SpringMVC通过模型视图ModelAndView渲染视图大致流程 代码样例 1.准备工作 A.因为文中用到jsp,所以需要引入jsp标准标签库standard.jar和jstl.jar 官方下载地址:http://archive.apache.org/dist/jakarta/taglibs/standard/binaries/ 本地下载地址:lib_jb51.rar B.添加Tomcat依赖如下: <dependency> <groupId>org.springframew

  • SpringMvc响应数据及结果视图实现代码

    响应数据和结果视图 返回值分类 controller 方法返回字符串可以指定逻辑视图名,通过视图解析器解析为物理视图地址. //指定逻辑视图名,经过视图解析器解析为 jsp 物理路径:/WEB-INF/pages/success.jsp @RequestMapping("/testReturnString") public String testReturnString() { System.out.println("AccountController 的 testRetur

  • 使用springmvc临时不使用视图解析器的自动添加前后缀

    目录 springmvc临时不使用视图解析器的自动添加前后缀 解决方法 springmvc视图解析器的前缀和后缀 使用方法 springmvc临时不使用视图解析器的自动添加前后缀 <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver"> <!-- 配置jsp路径的前缀 --> <property name="prefix" value

  • springmvc视图解析流程代码实例

    这篇文章主要介绍了springmvc视图解析流程代码实例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 在springmvc.xml配置文件中配置了将逻辑视图转换成物理视图: <!-- 配置视图解析器:如何把handler返回值解析为实际的物理视图 --> <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver"&g

  • 浅谈SpringMVC之视图解析器(ViewResolver)

    SpringMVC中的视图解析器的主要作用就是将逻辑视图转换成用户可以看到的物理视图. 当用户对SpringMVC应用程序发起请求时,这些请求都会被SpringMVC的DispatcherServlet处理,通过处理器找到最为合适的HandlerMapping定义的请求映射中最为合适的映射,然后通过HandlerMapping找到相对应的Handler,然后再通过相对应的HandlerAdapter处理该Handler.返回结果是一个ModelAndView对象,当该ModelAndView对象

  • SpringMVC超详细讲解视图和视图解析器

    目录 SpringMVC-视图和视图解析器 1.基本介绍 2.自定义视图 1.为什么要自定义视图 2.自定义视图实例-代码实现 3.自定义视图工作流程小结 自定义视图-小结 自定义视图-工作流程 4.目标方法直接指定转发或重定向 1.使用实例 2.指定请求转发流程-Debug源码 3.指定重定向流程-Debug源码 SpringMVC-视图和视图解析器 1.基本介绍 在 springMVC 中的目标方法最终返回都是一个视图(有各种视图). 返回的视图都会由一个视图解析器来处理 (视图解析器有很多

  • Java SpringMVC数据响应超详细讲解

    目录 1)页面跳转   2)回写数据 3)配置注解驱动 4)知识要点 1)页面跳转   直接返回字符串:此种方式会将返回的字符串与视图解析器的前后缀拼接后跳转.  返回带有前缀的字符串: 转发: forward:/WEB-INF/views/index.jsp 重定向: redirect:/index.jsp 通过ModelAndView对象返回 @RequestMapping("/quick2") public ModelAndView quickMethod2(){ ModelAn

  • Java 超详细讲解SpringMVC拦截器

    目录 拦截器(interceptor)的作用 拦截器和过滤器区别 拦截器快速入门 多拦截器操作 拦截器方法说明 本章小结 拦截器(interceptor)的作用 Spring MVC 的 拦截器 类似于 Servlet 开发中的过滤器 Filter,用于对处理器进行 预处理 和 后处理 . 将拦截器按一定的顺序联结成一条链,这条链称为 拦截器链(Interceptor Chain) .在访问被拦截的方 法或字段时,拦截器链中的拦截器就会按其之前定义的顺序被调用.拦截器也是AOP思想的具体实现.

  • Java超详细讲解SpringMVC如何获取请求数据

    目录 1.获得请求参数 1)基本类型参数:​​​​​​​   2)POJO类型参数: 3)数组类型参数   4)集合类型参数   2.请求乱码问题 3.参数绑注解@RequestParam​​​​​​​ 4.获得Restful风格的参数 5.自定义类型转换器 6.获得请求头 7.文件上传 8.小结 1.获得请求参数 客户端请求参数的格式是:name=value&name=value- - 服务器端要获得请求的参数,有时还需要进行数据的封装,SpringMVC可以接收如下类型的参数: 1)基本类型

  • C++函数模板与重载解析超详细讲解

    目录 1.快速上手 2.重载的模板 3.模板的局限性 4.显式具体化函数 5.实例化和具体化 6.重载解析 6.1 概览 6.2 完全匹配中的三六九等 6.3 总结 7.模板的发展 1.快速上手 函数模板是通用的函数描述,也就是说,它们使用泛型来定义函数. #include<iostream> using namespace std; template <typename T> void Swap(T &a,T &b);//模板原型 struct apple{ st

  • SpringBoot超详细讲解自动配置原理

    目录 SpringBoot自动配置原理 SpringBoot特点 1.依赖管理 A.父项目做依赖管理 B.开发导入starter场景启动器 C.可以修改默认版本号 2.自动配置 A.自动配好Tomcat B.自动配好SpringMVC C.默认的包结构 D.各种配置拥有默认值 E.按需要加载所有自动配置项 SpringBoot自动配置原理 了解SpringBoot自动配置原理 1.SpringBoot特点 2.容器功能 3.自动配置原理入门 4.开发技巧 SpringBoot特点 1.依赖管理

  • Java超详细讲解WebMvcConfigurer拦截器

    目录 addInterceptors拦截器 addViewControllers页面跳转 addResourceHandlers静态资源 configureViewResolvers视图解析器 addCorsMappings跨域 configureMessageConverters信息转换器 WebMvcConfigurer接口常用的方法: /* 拦截器配置 */ void addInterceptors(InterceptorRegistry var1); /* 视图跳转控制器 */ void

  • Java 超详细讲解Spring MVC异常处理机制

    目录 异常处理机制流程图 异常处理的两种方式 简单异常处理器SimpleMappingExceptionResolver 自定义异常处理步骤 本章小结 异常处理机制流程图 系统中异常包括两类: 预期异常 通过捕获异常从而获取异常信息. 运行时异常RuntimeException 主要通过规范代码开发.测试等手段减少运行时异常的发生. 系统的Dao.Service.Controller出现都通过throws Exception向上抛出,最后SpringMVC前端控制器交由异常处理器进行异常处理,如

  • SpringBoot超详细讲解Thymeleaf模板引擎

    Jsp是最早的模板技术,用来处理视图层的,用来做数据显示的模板 B S结构: B:浏览器:用来显示数据,发送请求,没有处理能力 发送一个请求,访问a.jsp,a.jsp在服务器端变成Servlet,在将输出的数据返回给浏览器,浏览器就可以看到结果数据,jsp最终翻译过来也是个html页面 模板技术你就可以把它们当成字符串的替换,比如说:这里{data}这里有一个字符串,你把它换成固定值其他值,但是这个替换有一些附加的功能,通过模板技术处理视图层的内容 第一个例子: pom.xml:Thymele

  • Spring Boot超详细讲解请求处理流程机制

    目录 1. 背景 2. Spring Boot 的请求处理流程设计 3. Servlet服务模式请求流程分析 3.1 ServletWebServerApplicationContext分析 3.2 Servlet服务模式之请求流程具体分析 4. Reactive服务模式请求流程分析 4.1 ReactiveWebServerApplicationContext分析 4.2 webflux服务模式之请求流程具体分析 5. 总结 1. 背景 之前我们对Spring Boot做了研究讲解,我们知道怎

随机推荐