`
Josh_Persistence
  • 浏览: 1645756 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类

Spring3.X @MVC - (七)Spring中强大的内容协商视图解析器

阅读更多

前言:

一、总共有10节,也就是10篇博客来讲述Spring的MVC,几乎涵盖了所有Spring MVC中的内容。

 

二、我创建的例子是一个球场预订系统,例子我已经测试调试通过,是一个Maven的project,包含一个Parent project:wsheng-spring-base和一个子Module:wsheng-spring-mvc.

 

三、在Eclipse中直接import maven的project即可,会同时引入上诉两个project的。

 

四、如果你没有耐心,可以不必往下学习,因为网上有很多例子,但是都是讲的Spring MVC很少的面,而且你可以快速的上手,但如果你想真正了解Spring MVC中的很多细节,就可以慢慢的去看博客(从第一节到第十节),如果有什么问题,欢迎信息告诉我。

 

五、学习的方法是你可以先将源码导入到eclipse中,然后根据博客上的内容,对照源码,慢慢消化,这是个漫长的过程,但是会帮助你了解很多Spring MVC的细节。

===================================================================================

 

 

在Spring3.X @MVC - (六)按照返回的名称解析视图 - Spring MVC中强大的视图解析器的基础上

http://josh-persistence.iteye.com/blog/1884194 

进一步的讨论和学习Spring中最为强大的视图解析器: Spring的视图和内容协商机制。

 

1. 问题:

如果在在控制器中只是返回一个没有扩展名的URL,如welcome,希望设计一个策略:根据具体的请求返回对应的视图:welcome.html或者是welcome.pdf。

 

2.解决方案:

当web应用接受一个请求时,请求包含一系列的属性,让Sping MVC能够确定返回给请求方的正确的内容和类型。主要的两个属性包括:

1) 请求中的URL的扩展名。

2) HTTP Accept头标。

例如,如果一个url的形式为/welcome.xml的请求,Spring MVC的控制器能够检查扩展名并且将其委派给代表XML视图的一个逻辑视图。

         但是如果请求的形式不再是/welcome.xml,而是welcome。这个请求应该委派给一个XML还是一个HTML视图呢?还是一个PDF视图呢?此时通过URL无从知晓。这种情况下的解决方案

         A:使用默认的视图:如welcome.html

         B:检查请求的HTTP Accept头标来决定哪种视图更加合适。

然而在Spring MVC的控制器中检查HTTP Accept头标可能是个棘手的问题,所以在Sping MVC中专门通过ContentNegotiatingViewResolver解析器支持头标的检查,使视图委派可以根据URL文件扩展名或者HTTP Accept头标值指出。

 

3. 工作原理:

Sping MVC内容协商解析器基于ContentNegotiationVIewResolver类。下面先介绍下其怎样和其它解析器集成的。

<!-- View resolvers --> 

    <!-- View exception resolver -->

 

    <bean

        class="org.springframework.web.servlet.handler.SimpleMappingExceptionResolver">

        <property name="exceptionMappings">

            <props>

                <prop

                    key="com.wsheng.spring.service.ReservationNotAvailableException">

                    reservationNotAvailable

                </prop>

                <prop

                    key="com.wsheng.spring.web.ReservationWebException">

                    reservationWebException

                </prop>

<!-- Define catch all class or property defaultErrorView -->

<!-- <prop key="java.lang.Exception">error</prop>-->

            </props>

        </property>

       <property name="defaultErrorView" value="error"/>

 

    </bean> 

 

<!--     Views mapped in views.properties (PDF, XLS classes, and others)  -->

    <bean id="contentNegotiatingResolver"

              class="org.springframework.web.servlet.view.ContentNegotiatingViewResolver">

        <property name="order"

                  value="#{T(org.springframework.core.Ordered).HIGHEST_PRECEDENCE}" />

         <property name="mediaTypes">

            <map>

                  <entry key="html" value="text/html"/>

                  <entry key="pdf" value="application/pdf"/>

                  <entry key="xsl" value="application/vnd.ms-excel"/>

                  <entry key="xml" value="application/xml"/>

                  <entry key="json" value="application/json"/>

            </map>

        </property>

     </bean>

 

    <bean id="resourceBundleResolver"

        class="org.springframework.web.servlet.view.ResourceBundleViewResolver">

        <property name="basename" value="views" />

        <property name="order" value="#{contentNegotiatingResolver.order+1}" />

    </bean>

 

    <bean id="secondaryResourceBundleResolver"

        class="org.springframework.web.servlet.view.ResourceBundleViewResolver">

        <property name="basename" value="secondaryviews" />

        <property name="order" value="#{resourceBundleResolver.order+1}" />

    </bean>

 

    <!-- Views mapped in JSPs under /WEB-INF/jsp --> 

 

    <bean id="internalResourceResolver"

        class="org.springframework.web.servlet.view.InternalResourceViewResolver">

        <property name="prefix" value="/WEB-INF/jsp/" />

        <property name="suffix" value=".jsp" />

    <property name="order" value="#{secondaryResourceBundleResolver.order+1}" />

 

    </bean>

 

1) 你可能发现了,这个程序清单中的解析器声明和前面的看到的不太相同,因为这里面使用Spring的EL表达式SpEL来指定视图解析器的优先顺序。在这个例子中,ContentNegotiatingViewResolver解析器得到了最高的优先权,它的order根据SpEL申明

#{T(org.springframework.core.Ordered).HIGHEST_PRECEDENCE赋值。后续的解析器Bean使用相似的SpEL声明决定order值----#{bean_name.order+1}.这使你可以使用相对的解析器order权重,代替硬编码值。

       

2) 观察ContentNegotiatingViewResolver解析器的配置,这个配置设置该解析器为所有解析器中的最高优先级别,这种设置其实是有必要的,也就是说,基本上来说,内容协商解析器的优先级应该是最高的。那么为什么内容协商解析器ContentNegotiatinViewResolver要具有最高的优先级呢?原因是该解析器其实不会解析视图,而是将它们委派给其他的视图解析器。看一个例子:

         我们假定Sping MVC的控制器接受/reserverationSummary.xml的请求,一旦处理器方法结束,它将控制器发送给名为reservation的逻辑视图。根据前面学的内容可知,当控制器处理结束后,将控制器发送给reservation的逻辑视图后,Spring MVC的解析器开始起作用,因为内容协商处理器的优先级最高,所以开始作用的就是ContentNegotiationViewResolver解析器。

        ContentNegotiatingViewResolver解析器首先根据如下原则确定请求的媒体类型

A)检查请求扩展名:根据ContentNegotiationViewResolver bean的MediaType段中指定的默认媒体类型(例如text/html)检查请求路径的扩展名(例如.html, .xml或.pdf)

B)进一步确定请求扩展名: 如果请求路径具有扩展名,但是在ContentNegotiatingViewResolver bean默认的mediaTypes段中找不到,就试图使用属于Java Activation Framework的FileTypeMap确定扩展名的媒体类型。

C)如果没有扩展名:如果请求路径中没有扩展名,使用请求的HTTP Accept头标。

      根据上面的A)B) C)的阐述,对于/reservationSummary.xml上的请求,A)中可看出媒体类型为application/xml。但是,对于类似/reservationSummary这样的URL请求,媒体类型在C)之前还没有被确定。其实,HTTP Accept头标中包含类似Accept:text/html或者Accept:application/pdf这样的值,假如请求的URL中不存在扩展名,这些值帮助解析器确定请求者预期的媒体类型。

      此时,ContentNegotiatingViewResolver解析器得到一个媒体类型application/xml和reservation的逻辑视图。根据这两个重要的信息,再其他解析器上进行一次循环(根据解析器的顺序),根据检测到的媒体类型(此处为application.xml)确定哪个视图与逻辑名称最为匹配。

       这个过程可以允许你拥有多个同名的逻辑视图,每个视图支持一种不同的媒体类型(例如HTML,PDF,XLS),然后由ContentNegotiatingViewResolver来解析最佳匹配。

       这就是ContentNegotiatingViewResolver的好处,它会使控制器的设计进一步简化了,因为再也没有必要用硬编码为某个媒体类型创建特定的逻辑视图(例如pdfReservation, xlsReservation, htmlReservation),而代之以单一的视图(reservation),让ContentNegotiatingViewResolver解析器确定最佳匹配。要么匹配reservation.pdf, reservation.html,reservation.xls,reservation.json,reserveration.jsp等。

即可以省掉很多代码:

model.addAttribute("reservations",reservations);

// Check request extension

/**

if(request.getServletPath().endsWith(".pdf")) { 

   // PDF extension

   // Return view pdfSummary. Via resolver the view

   // is mapped to the class PdfReservationSummary

   // as defined in views.properties

   return "pdfSummary";

} else if(request.getServletPath().endsWith(".xls")) { 

   // Excel extension

   // Return view xlsSummary. Via resolver the view

   // is mapped to the class ExcelReservationSummary

   // as defined in views.properties

   return "excelSummary";

} else { 

   // Any other extension return the file system view reservationSummary

   // Via resolver it will be mapped to /WEB-INF/jsp/reservationSummary.jsp

   return "reservationSummary";

   }*/

return "reservationSummary"; // 只需要这句代码就可。

 

       这个处理过程中,可能的处理过程如下:

A)如果确定媒体类型为application/pdf。如果具有最高优先级的解析器包含有逻辑视图reservation的映射,但是不支持application/pdf类型。那么也就不存在匹配,会继续在剩余的解析器上进心查询匹配。

B)如果确定媒体类型为application/pdf。如果具有最高优先级的解析器包含有逻辑视图reservation的映射,并且这个视图支持application/pdf类型,则匹配该解析器。

C)如果媒体类型确定为text/html,而此时如果有4个名为reservation的逻辑视图,但是如果此时映射到两个具有最高优先级的解析器的视图都不支持text/html。那么就会和剩下的包含reservation视图映射且支持text/html的解析器匹配。

 

        总结:

1) 这个视图搜索过程会在应用中配置的所有解析器上进行。如果你不希望在ContentNegotiatingViewResolver解析器之外进行配置,也可以在ContentNegotiatingViewResolver bean内配置默认视图和解析器。

 

2)很明显使用视图内容协商处理器(ContentNegotiatingViewResolver)后,可以不用每个逻辑视图(a.html, b.pdf, c.xls)以及为同名的逻辑视图(a: a.html, a.pdf, a.xls, a.json)等找一个最佳的匹配。极大的简化了Spring的视图解析器的配置。

 

 

1
2
分享到:
评论

相关推荐

    基于java的的个人博客网站的设计与实现设计与实现.docx

    基于java的的个人博客网站的设计与实现设计与实现.docx

    基于java的技术大健康综合咨询问诊平台的设计与实现.docx

    基于java的技术大健康综合咨询问诊平台的设计与实现.docx

    java-ssm+vue小型企业办公自动化系统实现源码(项目源码-说明文档)

    系统可以提供信息显示和相应服务,其管理员管理部门经理,管理总经理,管理员工和员工留言以及员工工资,管理内部邮件,管理审批流程,管理离职申请。部门经理给员工发放工资,审核并回复员工留言,管理员工工资,审核员工的离职申请信息,查询和下载内部邮件以及审批流程。总经理查询下载内部邮件和审批流程,审核员工离职申请,查询员工工资,查询员工和部门经理。员工发布留言,发布内部邮件,发布离职申请,查询通知公告和审批流程,查看员工本人工资。 项目关键技术 开发工具:IDEA 、Eclipse 编程语言: Java 数据库: MySQL5.7+ 后端技术:ssm 前端技术:Vue 关键技术:springboot、SSM、vue、MYSQL、MAVEN 数据库工具:Navicat、SQLyog

    基于java的网上办公自动化系统设计与实现.docx

    基于java的网上办公自动化系统设计与实现.docx

    2019优益C x 易烊千玺微博营销案结案报告.pptx

    2019优益C x 易烊千玺微博营销案结案报告.pptx

    led-tcp-maste资源

    led-tcp-maste资源

    金士顿U盘微博营销活动策划方案.ppt

    金士顿U盘微博营销活动策划方案.ppt

    chipup芯昇XS2180-PoE芯片说明,详细版

    chipup芯昇XS2180-PoE芯片说明,详细版

    #_ssm_105_mysql_学生比赛指导管理系统_.zip

    均包含代码,文章,部分项目包含ppt

    基于java的中小企业人力资源管理系统的设计与实现.docx

    基于java的中小企业人力资源管理系统的设计与实现.docx

    C语言入门教程.zip

    【c语言入门】 静态库、动态链接库、include、makefile、io、文件操作函数、管道原理及应用、简单的数据结构

    基于java的在线学习系统设计与实现系统设计与实现.docx

    基于java的在线学习系统设计与实现系统设计与实现.docx

    蓝桥杯第十四届程序C组试题B自行整理(包括答案)

    主要对蓝桥杯第十四届程序C组试题B进行代码编写

    ASP.NET+SQL通用作业批改系统设计(源代码+论文).zip

    1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md或论文文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。 5、资源来自互联网采集,如有侵权,私聊博主删除。 6、可私信博主看论文后选择购买源代码。 1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md或论文文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。 5、资源来自互联网采集,如有侵权,私聊博主删除。 6、可私信博主看论文后选择购买源代码。 1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md或论文文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。 5、资源来自互联网采集,如有侵权,私聊博主删除。 6、可私信博主看论文后选择购买源代码。

    智能制造建模与仿真技术及其发展趋势

    本文详细介绍了智能制造领域里的建模与仿真技术的概念和特点,包括它们的基本定义、最新特点,如集成化、模块化、层次化、跨学科化、计算高速化以及人工智能化的趋势,并阐述了其关键技术,还提供了多个典型案例分析。另外,探讨了未来建模仿真技术在智能制造背景下的发展走向,特别是在实时仿真、云端建模与仿真和下一代数字模型方面的前景。 适用人群:智能制造相关的行业从业者、研究学者或者具有一定工程基础的学生。 使用场景及目标:适用于希望深入理解建模和仿真如何应用于智能生产的专业人士,并希望通过该领域的技术进步提升自己的业务水平和科研创新能力。 阅读推荐:此资源非常适合那些渴望获得有关智能制造中各种建模与仿真应用场景的知识的人群。它提供了从理论知识到实际工业项目的实例分析,涵盖了广泛的视角。

    EfficientFormer实战:使用EfficientFormerV2实现图像分类任务

    EfficientFormerV2是一种通过重新思考ViT设计选择和引入细粒度联合搜索策略而开发出的新型移动视觉骨干网络。它结合了卷积和变换器的优势,通过一系列高效的设计改进和搜索方法,实现了在移动设备上既轻又快且保持高性能的目标。这一成果为在资源受限的硬件上有效部署视觉变换器模型提供了新的思路 原文链接:https://blog.csdn.net/hhhhhhhhhhwwwwwwwwww/article/details/142367223

    一套通过人脸识别遗传病的机器学习系统.zip(毕设&课设&实训&大作业&竞赛&项目)

    项目工程资源经过严格测试可直接运行成功且功能正常的情况才上传,可轻松复刻,拿到资料包后可轻松复现出一样的项目,本人系统开发经验充足(全领域),有任何使用问题欢迎随时与我联系,我会及时为您解惑,提供帮助。 【资源内容】:包含完整源码+工程文件+说明(如有)等。答辩评审平均分达到96分,放心下载使用!可轻松复现,设计报告也可借鉴此项目,该资源内项目代码都经过测试运行成功,功能ok的情况下才上传的。 【提供帮助】:有任何使用问题欢迎随时与我联系,我会及时解答解惑,提供帮助 【附带帮助】:若还需要相关开发工具、学习资料等,我会提供帮助,提供资料,鼓励学习进步 【项目价值】:可用在相关项目设计中,皆可应用在项目、毕业设计、课程设计、期末/期中/大作业、工程实训、大创等学科竞赛比赛、初期项目立项、学习/练手等方面,可借鉴此优质项目实现复刻,设计报告也可借鉴此项目,也可基于此项目来扩展开发出更多功能 下载后请首先打开README文件(如有),项目工程可直接复现复刻,如果基础还行,也可在此程序基础上进行修改,以实现其它功能。供开源学习/技术交流/学习参考,勿用于商业用途。质量优质,放心下载使用

    基于java的基于分类算法的学业警示预测系统设计与实现.docx

    基于java的基于分类算法的学业警示预测系统设计与实现.docx

    基于TensorRT实现轻量级语义分割的C++程序源码+文档说明+模型.zip

    基于TensorRT实现轻量级语义分割的C++程序源码+文档说明+模型.zip基于TensorRT实现轻量级语义分割的C++程序源码+文档说明+模型.zip基于TensorRT实现轻量级语义分割的C++程序源码+文档说明+模型.zip 个人大四的毕业设计、课程设计、作业、经导师指导并认可通过的高分设计项目,评审平均分达96.5分。主要针对计算机相关专业的正在做毕设的学生和需要项目实战练习的学习者,也可作为课程设计、期末大作业。 [资源说明] 不懂运行,下载完可以私聊问,可远程教学 该资源内项目源码是个人的毕设或者课设、作业,代码都测试ok,都是运行成功后才上传资源,答辩评审平均分达到96.5分,放心下载使用! 1、该资源内项目代码都经过测试运行成功,功能ok的情况下才上传的,请放心下载使用! 2、本项目适合计算机相关专业(如计科、人工智能、通信工程、自动化、电子信息等)的在校学生、老师或者企业员工下载学习,也适合小白学习进阶,当然也可作为毕设项目、课程设计、作业、项目初期立项演示等。 3、如果基础还行,也可在此代码基础上进行修改,以实现其他功能,也可用于毕设、课设、作业等。 下载后请首先打开README.md文件(如有),供学习参考。

    大数据之机器学习推荐系统.zip(毕设&课设&实训&大作业&竞赛&项目)

    项目工程资源经过严格测试可直接运行成功且功能正常的情况才上传,可轻松复刻,拿到资料包后可轻松复现出一样的项目,本人系统开发经验充足(全领域),有任何使用问题欢迎随时与我联系,我会及时为您解惑,提供帮助。 【资源内容】:包含完整源码+工程文件+说明(如有)等。答辩评审平均分达到96分,放心下载使用!可轻松复现,设计报告也可借鉴此项目,该资源内项目代码都经过测试运行成功,功能ok的情况下才上传的。 【提供帮助】:有任何使用问题欢迎随时与我联系,我会及时解答解惑,提供帮助 【附带帮助】:若还需要相关开发工具、学习资料等,我会提供帮助,提供资料,鼓励学习进步 【项目价值】:可用在相关项目设计中,皆可应用在项目、毕业设计、课程设计、期末/期中/大作业、工程实训、大创等学科竞赛比赛、初期项目立项、学习/练手等方面,可借鉴此优质项目实现复刻,设计报告也可借鉴此项目,也可基于此项目来扩展开发出更多功能 下载后请首先打开README文件(如有),项目工程可直接复现复刻,如果基础还行,也可在此程序基础上进行修改,以实现其它功能。供开源学习/技术交流/学习参考,勿用于商业用途。质量优质,放心下载使用

Global site tag (gtag.js) - Google Analytics