MyException - 我的异常网
当前位置:我的异常网» VC/MFC » SpringMVC学习札记(五)-视图解析器小结

SpringMVC学习札记(五)-视图解析器小结

www.MyException.Cn  网友分享于:2015-08-26  浏览:14次
SpringMVC学习笔记(五)---视图解析器小结

用多个解析器解析视图

 

如果在web应用程序中有许多视图,只选择一种视图解析策略通常是不够的。InternalResourceViewResolver通常可以解析大多数的内部JSP视图,但是还有其他的视图类型必须通过ResourceBundleViewResolver进行解析。在这种情况下,就必须结合两种策略来进行视图解析。

 

<?xml version="1.0" encoding="UTF-8" ?>
<beans xmlns="http://www.springframework.org/schema/beans"
	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xmlns:p="http://www.springframework.org/schema/p"
	xmlns:context="http://www.springframework.org/schema/context"
	xmlns:mvc="http://www.springframework.org/schema/mvc"
	xsi:schemaLocation="    
           http://www.springframework.org/schema/beans    
           http://www.springframework.org/schema/beans/spring-beans-3.0.xsd    
           http://www.springframework.org/schema/context    
           http://www.springframework.org/schema/context/spring-context-3.0.xsd   
           http://www.springframework.org/schema/mvc    
           http://www.springframework.org/schema/mvc/spring-mvc-3.0.xsd">
	
	<!-- 初始化bean,指定初始页面和成功后的页面 -->
	<bean id="registrationController"
		class="com.wy.controller.RegistrationController">
		<property name="commandClass" value="com.wy.pojo.User"/>
		<property name="formView"    value="login" />
		<property name="successView" value="viewSuccessRedirect" />
	</bean>
	
	<!-- 映射处理器 -->
	<bean id="simpleUrlMapping"
		class="org.springframework.web.servlet.handler.SimpleUrlHandlerMapping">
		<property name="mappings">
			<props>
				<prop key="/register.do">registrationController</prop>
			</props>
		</property>
    </bean>
    
	<!-- 视图解析器 -->
	<bean id="viewResolver"
		class="org.springframework.web.servlet.view.InternalResourceViewResolver">
		<property name="prefix" value="/WEB-INF/page/" />
		<property name="suffix" value=".jsp" />
		<property name="order" value="1" />  
	</bean>
    
	<bean id="resourceBundleViewResolver"
	    class="org.springframework.web.servlet.view.ResourceBundleViewResolver">
	    <property name="basename" value="views" />
	    <property name="defaultParentView" value="views" />
	    <property name="order" value="0" /> 
    </bean> 
	
	<bean name="/parameterizableViewController.do" class="org.springframework.web.servlet.mvc.ParameterizableViewController">  
        <property name="viewName" value="viewSuccessRedirect" />  
    </bean>
</beans>

 

 

 

当同时选择不止一种策略时,重要的是要指定解析优先级。为此,可以设置视图解析器Bean的order属性。order值越小,表示优先级越高。请注意,应该给InternalResourceViewResolver分配最低的优先级别,因为无论它是否存在,始终都会用它来解析视图。因此,如果其他解析器的优先级别比较低,就没有机会解析视图了。

现在views.properties应该只包含不能通过InternalResourceViewResolver解析的视图(如:重定向视图)。

 

#重定向视图,解决SimpleFormController提交表单后,重复提交表单 
viewSuccessRedirect.(class) = org.springframework.web.servlet.view.RedirectView
viewSuccessRedirect.url = index.jsp

  

Spring MVC之将异常映射到视图

 

 

当出现未知的异常时, 应用服务器通常会将这个可恶的异常栈显示给用户。用户与这个栈轨迹毫无干系,他会抱怨你的应用程序对用户不友好。此外,这么做琮有潜在的安全风险,因为可能将内部的方法调用层次结构公开给用户。

在Spring MVC应用程序中,可以在web应用程序上下文中注册一个或者多个解析器Bean,来解析未被捕捉的异常。这些Bean必须实现HandlerExceptionResolver接口,这样DispatcherServlet才能自动侦测它们。Spring MVC提供了一个简单的异常解析器,让你可以将每种异常分类映射到视图上。

 

为了解析未被捕捉的异常,可以通过实现HandlerExceptionResolver接口,来编写定制的异常解析器。通常情况下,你会想要将不同的异常分类映射到不同的错误页面。Spring MVC提供了异常解析器SimpleMappingExceptionResolver,可以在web应用程序上下文中配置异常映射。例如,可以在court-servlet.xml(前面blog中的例子)中注册下面的异常解析器。

 

<bean class="org.springframework.web.servlet.handler.SimpleMappingExceptionResolver">
	<property name="exceptionMappings">
		<props>
			<prop key="com.apress.springrecipes.court.service.
				ReservationNotAvailableException">
				reservationNotAvailable
			</prop>
			<prop key="java.lang.Exception">error</prop>
		</props>
	</property>
</bean>

 

在这个异常解析器中,为ReservationNotAvailableException定义了逻辑视图名称 reservationNotAvailable。如果Web应用程序上下文中配置了InternalResourceViewResolver,一旦无法提供预订,就会出现reservationNotAvailable.jsp页面。

为任何未知的异常定义默认的错误页面,这是一种好的做法。你应该将这个页面映射到java.lang.Exception键,作为映射的最后一项,如果之前的项都不匹配,就会显示这个页面。 

 

 

视图解析器策略和视图解析器

 

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"  
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:p="http://www.springframework.org/schema/p"  
    xmlns:context="http://www.springframework.org/schema/context"  
    xmlns:mvc="http://www.springframework.org/schema/mvc"  
    xsi:schemaLocation="    
           http://www.springframework.org/schema/beans    
           http://www.springframework.org/schema/beans/spring-beans-3.0.xsd    
           http://www.springframework.org/schema/context    
           http://www.springframework.org/schema/context/spring-context-3.0.xsd   
           http://www.springframework.org/schema/mvc    
           http://www.springframework.org/schema/mvc/spring-mvc-3.0.xsd">  
	
	<!-- 配置静态资源,直接映射到对应的文件夹,不被DispatcherServlet处理,3.04新增功能,需要重新设置spring-mvc-3.0.xsd  
    <mvc:resources mapping="/img/**" location="/img/"/>  
    <mvc:resources mapping="/js/**" location="/js/"/>  
    <mvc:resources mapping="/css/**" location="/css/"/>
    -->
     <!-- 定义bean -->
     <bean id="abstractController" class="com.wy.controller.SimpleAbstractController" />
     <bean name="abstrController"  class="com.wy.controller.SimpleAbstractController" />
     <bean name="/beanNameAbstractController.do"    class="com.wy.controller.SimpleAbstractController" /><!--BeanNameViewResolver;是name而不是id -->
     <bean name="/beanNameImplementsController.do"  class="com.wy.controller.SimpleImplementsController" />
     
     <!-- 映射处理器 -->
     <bean id="simpleUrlHandlerMapping" class="org.springframework.web.servlet.handler.SimpleUrlHandlerMapping">
         <property name="mappings">
             <props>
                  <prop key="abstr.do">abstractController</prop>
                  <prop key="abstrBeanName.do">abstrController</prop>
                  <prop key="bnac.do">/beanNameAbstractController.do</prop>
                  <prop key="bnic.do">/beanNameImplementsController.do</prop>
             </props>
         </property>
     </bean>
      
     <!-- 视图解析器策略 -->
     <!-- 视图解析器 
     <bean id="urlBasedViewResolver" class="org.springframework.web.servlet.view.UrlBasedViewResolver">
         <property name="viewClass" value="org.springframework.web.servlet.view.JstlView" />
         <property name="prefix" value="/WEB-INF/page/" />
         <property name="suffix" value=".jsp" />
     </bean>
     
     <bean id="internalResourceViewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver">
          <property name="viewClass" value="org.springframework.web.servlet.view.InternalResourceView" />
          <property name="prefix" value="/WEB-INF/page/" />
          <property name="suffix" value=".jsp" />
     </bean>
     -->
	 <!-- InternalPathMethodNameResolver 默认MethodNameResolver解析器,从请求路径中获取文件名作为方法名
	 <bean id="viewResolver"
		class="org.springframework.web.servlet.mvc.multiaction.InternalPathMethodNameResolver">
		<property name="prefix" value="/WEB-INF/page/" />
		<property name="suffix" value=".jsp" />
	 </bean>
     -->
     <!-- InternalPathMethodNameResolver 默认MethodNameResolver解析器,从请求路径中获取文件名作为方法名
	 <bean id="viewResolver"
		class="org.springframework.web.servlet.mvc.multiaction.InternalPathMethodNameResolver">
		<property name="prefix" value="/WEB-INF/page/" />
		<property name="suffix" value=".jsp" />
	 </bean>
     -->
     <bean id="beanNameViewResover" class="org.springframework.web.servlet.view.BeanNameViewResolver"/>
     <!-- 当ModelAndView返回的view名称为"hello"时,会去寻找"id"属性为hello的ViewBean -->
     <bean id="hello" class="org.springframework.web.servlet.view.JstlView">
          <property name="url" value="/WEB-INF/page/hello.jsp"/>
     </bean>
     <bean id="list" class="org.springframework.web.servlet.view.JstlView">
          <property name="url" value="/WEB-INF/page/list.jsp"/>
     </bean>
     
     <bean name="/parameterizableViewController.do" class="org.springframework.web.servlet.mvc.ParameterizableViewController">  
        <property name="viewName" value="viewSuccessRedirect" />  
    </bean>
    
    <!-- 
       ResourceBundleViewResolver通过basename所指定的ResourceBundle解析视图名。
                  对每个待解析的视图,ResourceBundle里的[视图名].class所对应的值就是实现该视图的类。
                  同样,[视图名].url所对应的值是该视图所对应的URL。
                  可以指定一个parent view,其它的视图都可以从parent view扩展。
                  用这种方法,可以声明一个默认的视图。
     -->
     <bean id="resourceBundleViewResolver"
	    class="org.springframework.web.servlet.view.ResourceBundleViewResolver">
	    <property name="basename" value="views" /><!-- views是classPath下的views.properties -->
	    <property name="defaultParentView" value="views" />
	    <property name="order" value="0" /> 
    </bean>
    
</beans>

 

 

文章评论

科技史上最臭名昭著的13大罪犯
科技史上最臭名昭著的13大罪犯
程序猿的崛起——Growth Hacker
程序猿的崛起——Growth Hacker
Web开发人员为什么越来越懒了?
Web开发人员为什么越来越懒了?
程序员的鄙视链
程序员的鄙视链
团队中“技术大拿”并非越多越好
团队中“技术大拿”并非越多越好
10个调试和排错的小建议
10个调试和排错的小建议
为啥Android手机总会越用越慢?
为啥Android手机总会越用越慢?
老程序员的下场
老程序员的下场
Java 与 .NET 的平台发展之争
Java 与 .NET 的平台发展之争
那些性感的让人尖叫的程序员
那些性感的让人尖叫的程序员
亲爱的项目经理,我恨你
亲爱的项目经理,我恨你
程序员最害怕的5件事 你中招了吗?
程序员最害怕的5件事 你中招了吗?
一个程序员的时间管理
一个程序员的时间管理
程序员都该阅读的书
程序员都该阅读的书
程序员必看的十大电影
程序员必看的十大电影
当下全球最炙手可热的八位少年创业者
当下全球最炙手可热的八位少年创业者
看13位CEO、创始人和高管如何提高工作效率
看13位CEO、创始人和高管如何提高工作效率
程序员应该关注的一些事儿
程序员应该关注的一些事儿
如何成为一名黑客
如何成为一名黑客
 程序员的样子
程序员的样子
我的丈夫是个程序员
我的丈夫是个程序员
Web开发者需具备的8个好习惯
Web开发者需具备的8个好习惯
程序员的一天:一寸光阴一寸金
程序员的一天:一寸光阴一寸金
每天工作4小时的程序员
每天工作4小时的程序员
我跳槽是因为他们的显示器更大
我跳槽是因为他们的显示器更大
那些争议最大的编程观点
那些争议最大的编程观点
做程序猿的老婆应该注意的一些事情
做程序猿的老婆应该注意的一些事情
老美怎么看待阿里赴美上市
老美怎么看待阿里赴美上市
程序员周末都喜欢做什么?
程序员周末都喜欢做什么?
初级 vs 高级开发者 哪个性价比更高?
初级 vs 高级开发者 哪个性价比更高?
鲜为人知的编程真相
鲜为人知的编程真相
要嫁就嫁程序猿—钱多话少死的早
要嫁就嫁程序猿—钱多话少死的早
漫画:程序员的工作
漫画:程序员的工作
如何区分一个程序员是“老手“还是“新手“?
如何区分一个程序员是“老手“还是“新手“?
60个开发者不容错过的免费资源库
60个开发者不容错过的免费资源库
什么才是优秀的用户界面设计
什么才是优秀的用户界面设计
旅行,写作,编程
旅行,写作,编程
十大编程算法助程序员走上高手之路
十大编程算法助程序员走上高手之路
“肮脏的”IT工作排行榜
“肮脏的”IT工作排行榜
“懒”出效率是程序员的美德
“懒”出效率是程序员的美德
我是如何打败拖延症的
我是如何打败拖延症的
代码女神横空出世
代码女神横空出世
编程语言是女人
编程语言是女人
中美印日四国程序员比较
中美印日四国程序员比较
总结2014中国互联网十大段子
总结2014中国互联网十大段子
聊聊HTTPS和SSL/TLS协议
聊聊HTTPS和SSL/TLS协议
2013年美国开发者薪资调查报告
2013年美国开发者薪资调查报告
不懂技术不要对懂技术的人说这很容易实现
不懂技术不要对懂技术的人说这很容易实现
写给自己也写给你 自己到底该何去何从
写给自己也写给你 自己到底该何去何从
软件开发程序错误异常ExceptionCopyright © 2009-2015 MyException 版权所有