SpringMVC自定义视图完成步骤 和 视图解析的源码剖析

这篇具有很好参考价值的文章主要介绍了SpringMVC自定义视图完成步骤 和 视图解析的源码剖析。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

自定义视图完成步骤:

7.2.1自定义视图完成步骤

1. 自定义视图**:** 创建一个 View bean, bean 需要继承自 AbstractView, 并实现

renderMergedOutputModel 方法**.**

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

3. 自定义视图的视图处理器,使用 BeanNameViewResolver**, 这个视图处理器也需要配置**

ioc 容器

4. BeanNameViewResolver 的调用优先级需要设置一下,设置 order Integer.MAX_VAL

小的值**.** 以确保其在 InternalResourceViewResolver 之前被调用

 /**
  * 老师解读
  * 1. MyView继承了AbstractView, 就可以作为一个视图使用
  * 2. @Component(value = "myView"),该视图会注入到容器中, 名字/id是 myView
  */
 @Component(value = "hspView")
 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("进入到自己的视图..");
 ​
         //老师解读
         //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);
 ​
     }
 }
 <!--
     老师解读
     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>

使用

 @RequestMapping(value = "/buy")
 public String buy() {
     System.out.println("------buy()-----");
     return "hspView";//填写自定义视图id
 }

源码剖析:

视图解析过程
1.先到DispatcherServlet中央控制器, 根据视图解析的 优先级 执行对应的 视图解析器
 @Nullable
 protected View resolveViewName(String viewName, @Nullable Map<String, Object> model,
       Locale locale, HttpServletRequest request) throws Exception {
 ​
    if (this.viewResolvers != null) {
       for (ViewResolver viewResolver : this.viewResolvers) {//viewResolvers存放了两个视图解析器(1)InternalResourceViewResolver默认视图解析器   (2)BeanNameViewResolver自定义视图解析器
          View view = viewResolver.resolveViewName(viewName, locale);
          if (view != null) {//如果返回的视图为空,那么会继续遍历所有的视图解析器;
              //注意:如果 默认视图解析器 优先级在前,那么不管怎样,它都不会再执行 自定义视图解析器 
              //原因:默认视图解析器 一定会返回视图,因为它是通过传入的视图名build一个视图
             return view;
          }
       }
    }
    return null;
 }
2.若默认视图解析器在前,那么用 视图解析器 解析
 @Override
 protected AbstractUrlBasedView buildView(String viewName) throws Exception {
    InternalResourceView view = (InternalResourceView) super.buildView(viewName);//根据viewName创建视图
    if (this.alwaysInclude != null) {
       view.setAlwaysInclude(this.alwaysInclude);
    }
    view.setPreventDispatchLoop(true);
    return view;
 }

注意:如果 默认视图解析器 优先级在前,那么不管怎样,它都不会再执行 自定义视图解析器 (因为:默认视图解析器 一定会返回视图,因为它是通过传入的视图名build一个视图)

3.若自定义视图解析器在前
 public View resolveViewName(String viewName, Locale locale) throws BeansException {
    ApplicationContext context = obtainApplicationContext();//context实质上就类似于ioc容器
    if (!context.containsBean(viewName)) {//判断context(ioc)中是否有id为viewName的bean
       // Allow for ViewResolver chaining...
       return null;
    }
    if (!context.isTypeMatch(viewName, View.class)) {//判断context(ioc)中是否有id为viewName并实现View接口的bean
       if (logger.isDebugEnabled()) {
          logger.debug("Found bean named '" + viewName + "' but it does not implement View");
       }
       // Since we're looking into the general ApplicationContext here,
       // let's accept this as a non-match and allow for chaining as well...
       return null;
    }
    return context.getBean(viewName, View.class);
 }

1.拿到context对象,实质上类似于ioc容器

2.//判断context(ioc)中是否有id为viewName的bean, 没有就返回null; 有就接着往下走

3.//判断context(ioc)中是否有id为viewName并实现View接口的bean 有就返回该视图 ,如果不存在传入的viewName对应的自定义视图,那么就返回null,接着走其他视图解析器文章来源地址https://www.toymoban.com/news/detail-702031.html

视图渲染和响应
1. 拿到view对象后, SpringMVC 调用自定义视图的 renderMergedOutputModel 方法渲染视图

到了这里,关于SpringMVC自定义视图完成步骤 和 视图解析的源码剖析的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • JVM源码剖析之Java对象创建过程

    关于 \\\"Java的对象创建\\\" 这个话题分布在各种论坛、各种帖子,文章的水平参差不齐。并且大部分仅仅是总结 \\\"面试宝典\\\" 的流程,小部分就是copy其他帖子,极少能看到拿源码作为论证。所以特意写下这篇文章。 版本信息如下: 首先把总结图放在这。接下来分析源码~  用一个

    2024年02月12日
    浏览(37)
  • 36.SpringMVC视图

    SpringMVC中的视图是View接口,视图的作用渲染数据,将模型Model中的数据展示给用户 SpringMVC视图的种类很多,默认有 转发视图( InternalResourceView ) 和 重定向视图( RedirectView ) 配置视图: 当工程 引入jstl的依赖 ,转发视图会 自动转换为JstlView 若使用的视图技术为Thymeleaf,在Spri

    2024年02月12日
    浏览(18)
  • 6、SpringMVC之视图

    注意:本文环境搭建请参考5.2节 视图的作用是渲染数据,将模型Model中的数据展示给用户; SpringMVC视图的种类很多,默认有转发视图和重定向视图; SpringMVC中的视图是View接口; 当工程引入jstl的依赖,转发视图会自动转换为JstlView; 若使用的视图技术为Thymeleaf,在SpringMVC的

    2024年02月08日
    浏览(25)
  • SpringMVC视图

    视图的作用是渲染数据,将模型Model中的数据展示给客户,SpringMVC中视图的种类有很多,默认有转发视图(InternalResourceView)和重定向视图(RedirectView)。 当工程引入jstl的依赖,转发视图会自动跳转jstlView,若使用的视图为Thymeleaf,在SpringMVC的配置文件中配置了Thymeleaf的视图解析器,

    2024年02月14日
    浏览(27)
  • SpringMVC的视图

    SpringMVC中的视图是View接口,视图的作用渲染数据,将模型Model中的数据展示给用户SpringMVC视图的种类很多,默认有转发视图和重定向视图 当工程引入jstl的依赖,转发视图会自动转换为JstlView 若使用的视图技术为Thymeleaf,在SpringMVC的配置文件中配置了Thymeleaf的视图解析器,由

    2024年02月08日
    浏览(45)
  • SpringMVC Day 06 : 转发视图

    在SpringMVC框架中,视图解析器可以将逻辑视图名称转换为实际的视图对象。除了直接渲染视图,你还可以通过SpringMVC提供的转发和重定向机制来跳转到另一个视图。在本篇博客中,我们将学习SpringMVC中的转发视图技术,以及如何使用它来构建更高效的Web应用程序。 1、新建项

    2024年02月07日
    浏览(28)
  • SpringMVC组件原理剖析

    主要剖析DispatcherServlet(前端控制器 )初始化的过程,还有DispatcherServlet执行主流程 DispatcherServlet初始化做了两件事情 获得了一个 SpringMVC 的 ApplicationContext容器 注册了 SpringMVC的 九大组件 前端控制器DispatcherServlet是SpringMVC的入口,也是SpringMVC的大脑,主流程的工作都是在此完

    2024年02月08日
    浏览(26)
  • Spring Boot源码解读与原理剖析:深入探索Java开发的奥秘!

    关注+点赞+评论,评论区回复“Spring Boot源码解读与原理剖析:深入探索Java开发的奥秘!” 每篇最多 评论3条 !!采用抽奖助手自动拉取评论区有效评论送书两本, 开奖时间:9月11号 承载着作者的厚望,掘金爆火小册同名读物 《Spring Boot源码解读与原理剖析》 正式出书!

    2024年02月10日
    浏览(38)
  • SpringMVC的架构有什么优势?——视图与模型(二)

    「作者主页」 :雪碧有白泡泡 「个人网站」 :雪碧的个人网站 「推荐专栏」 : ★ java一站式服务 ★ ★ React从入门到精通 ★ ★ 前端炫酷代码分享 ★ ★ 从0到英雄,vue成神之路★ ★ uniapp-从构建到提升 ★ ★ 从0到英雄,vue成神之路 ★ ★ 解决算法,一个专栏就够了 ★ ★

    2024年02月13日
    浏览(41)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包