`

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>

 

 

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics