Spring MVC同時使用多種試圖解析器的解決方案
系統
2434 0
Spring提供的試圖解析器大致分為兩類
一類是需要ViewResolver,如
? 解析JSP的InternalResourceViewResolver?
? 解析Velocity的VelocityViewResolver
? 解析freemarker的FreeMarkerViewResolver
另一類是直接使用View生成試圖對象,如
? 繼承AbstractExcelView的子類
? 繼承AbstractPdfView的子類
我們如果想為我們的系統配置多個試圖解析器,可以參考使用試圖解析器鏈這個功能
分兩種情況,如果第一類和第二類混合使用,可以使用如下的方法
??
<
bean?
id
="viewResolverOne"
?class
="org.springframework.web.servlet.view.BeanNameViewResovler"
>
??
<
property?
name
="order"
><
value
>
1
</
value
></
property
>
</
bean
>
<!--
-繼承AbstractExcelView或者其他抽象view->
<bean?name="listShows"?class="com.springinaction.view.ListShowsView">
<bean?id="viewResolverTwo"?class="org.springframework.web.servlet.view.InternalResourceViewResolver">
??<property?name="prefix">
????<value>/jsp/</value>
??</property>
??<property?name="suffix">
????<value>.jsp</value>
??</property>
??<property?name="viewClass">
????<value>org.springframework.web.servlet.view.JstlView</value>
??</property>
</bean>
? 這樣,當一個Controller訪問一個邏輯名時,spring mvc會自動先從order小的解析器尋找,如果找不到,再一次增大order進行尋找,這樣,就可以使用試圖解析器鏈
?
但是,如果我們需要兩個第一類的解析器共同使用,用上述方法是不行的,因為那三個解析器都繼承自UtlBasedViewResovler,這種情況下,如果發現資源不存在的情況,這種機制不會去通知下一個解析器
所以,就會出現,spring mvc總按照order最小的去解析,及時資源不存在(404錯誤)為了解決這個問
題,我們可以使用org.springframework.web.servlet.view.ResourceBundleViewResolver來解決
?
JSP頁面(用作輸入用),路徑/jsp
register.jsp
?
<%
...
@?page?language
=
"
java
"
?import
=
"
java.util.*
"
?pageEncoding
=
"
GB18030
"
%>
<%
...
@?taglib?prefix
=
"
spring
"
?uri
=
"
http://www.springframework.org/tags
"
?
%>
<%
...
@?taglib?uri
=
"
http://java.sun.com/jsp/jstl/core
"
?prefix
=
"
c
"
?
%>
<!
DOCTYPE?HTML?PUBLIC?"-//W3C//DTD?HTML?4.01?Transitional//EN"
>
<
html
>
??
<
head
>
????
???
?
??
</
head
>
??
??
??
<
body
>
??
???
<
form?
action
="<%=request.getContextPath()?%>/register.mvc"
?method
="post"
>
????
??????name:?
<
input?
type
="text"
?name
="name"
?value
="<c:out?value="
${status.value}"
/>
"/>(必須輸入)
??????
</
br
>
??
?????sex:??
<
input?
type
="text"
?name
="sex"
/>
(必須輸入,且為0或1)
br
>
???????????
<
input?
type
="submit"
?value
="submit"
/>
???
</
form
>
??
</
body
>
</
html
>
?
輸入結果顯示,使用Velocity 路徑/velocity
successV.vm
?
<
html
>
??
<
body
>
???????this is in velocity template
??
</
body
>
????
<
table
>
???
???????
<
tr
>
?????????
??????????
<
td
>
${student.name}
</
td
>
??????????
<
td
>
${student.sex}
</
td
>
???????
</
tr
>
??
?????
</
talbe
>
??
</
body
>
</
html
>
?
控制器:
?
package
?Action;
import
?model.Student;
import
?org.springframework.web.servlet.mvc.AbstractController;
import
?org.springframework.validation.BindException;
import
?org.springframework.web.servlet.ModelAndView;
import
?org.springframework.web.servlet.mvc.SimpleFormController;
public
?
class
?RegisterStudentController?
extends
?SimpleFormController?
...
{
????
public
?RegisterStudentController()
...
{
????????
this
.setCommandClass(Student.
class
);
????}
????
protected
?ModelAndView?onSubmit(Object?object,?BindException?arg1)?
throws
?Exception?
...
{
????????
return
?
new
?ModelAndView(getSuccessView(),
"
student
"
,stu);
????}
}
?
在classpath建立資源文件views_zh_CN.properties(這是spring的默認名,可以更改,但需要額外配置)
success.class=org.springframework.web.servlet.view.velocity.VelocityView
success.url=/velocity/successV.vm
表示當邏輯名是success的時候,使用這里定義的試圖解析器
web.xml
?
<?
xml?version="1.0"?encoding="UTF-8"
?>
<
web-app?
version
="2.4"
?
????xmlns
="http://java.sun.com/xml/ns/j2ee"
?
????xmlns:xsi
="http://www.w3.org/2001/XMLSchema-instance"
?
????xsi:schemaLocation
="http://java.sun.com/xml/ns/j2ee?
????http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd"
>
??
<
context-param
>
????
<
param-name
>
contextConfigLocation
</
param-name
>
????
<
param-value
>
/WEB-INF/train-servlet.xml
</
param-value
>
??
</
context-param
>
??
<
servlet
>
????
<
servlet-name
>
train
</
servlet-name
>
????
<
servlet-class
>
org.springframework.web.servlet.DispatcherServlet
</
servlet-class
>
????
<
load-on-startup
>
0
</
load-on-startup
>
??
</
servlet
>
??
<
servlet-mapping
>
?????
<
servlet-name
>
train
</
servlet-name
>
?????
<
url-pattern
>
*.mvc
</
url-pattern
>
??
</
servlet-mapping
>
???
<
listener
>
?????
<
listener-class
>
org.springframework.web.context.ContextLoaderListener
</
listener-class
>
???
</
listener
>
????
??
<
filter
>
????
<
filter-name
>
character
</
filter-name
>
????
<
filter-class
>
Action.CharacterFilter
</
filter-class
>
??
</
filter
>
??
<
filter-mapping
>
????
<
filter-name
>
character
</
filter-name
>
????
<
url-pattern
>
/*
</
url-pattern
>
??
</
filter-mapping
>
??
<
welcome-file-list
>
????
<
welcome-file
>
index.jsp
</
welcome-file
>
??
</
welcome-file-list
>
</
web-app
>
?
spring配置文件:
?
<
bean?
id
="RegisterStudentController"
?class
="Action.RegisterStudentController"
>
??
<
property?
name
="commandClass"
>
????
<
value
>
model.Student
</
value
>
??
</
property
>
??
<
property?
name
="formView"
>
??
<!--
-輸入頁面采用jsp解析器->
????<value>register</value>
??</property>
??<property?name="successView">??<!---顯示頁面使用Velocity解析器->
????<value>success</value>
??</property>
</bean>
<bean?id="simpleUrlMapping"?
class="org.springframework.web.servlet.handler.SimpleUrlHandlerMapping">
?<property?name="mappings">
???<props>
????<prop?key="/register.mvc">RegisterStudentController</prop>
???</props>
?</property>
</bean>
<!---jsp解析器->
<bean?id="viewResolver"?
class="org.springframework.web.servlet.view.InternalResourceViewResolver">
??<property?name="prefix">
????<value>/jsp/</value>
??</property>
??<property?name="suffix">
????<value>.jsp</value>
??</property>
??<property?name="viewClass">
????<value>org.springframework.web.servlet.view.JstlView</value>
??</property>
</bean>
<!---配置Velocity->
<bean?id="velocityConfigurer"?class="org.springframework.web.servlet.view.velocity.VelocityConfigurer">
??<property?name="resourceLoaderPath">
????<value>/</value>??
??</property>
</bean>
<!--配置ResourceBundle,使用配置文件為classpath下的views.properties,views_zh_CN.properties等
-->
<
bean?
id
="viewResouceResolver"
?class
="org.springframework.web.servlet.view.ResourceBundleViewResolver"
>
??
<
property?
name
="basename"
?value
="views"
/>
</
bean
>
?
運行頁面,可以看到,我們輸入的調用的是jsp頁面,顯示結果調用的是Velocity,如果采用第一種order的方式
spring mvc會找register.jsp和success.jsp或者register.vm或者success.vm,這樣總有一步是錯誤的
?
Spring MVC同時使用多種試圖解析器的解決方案
更多文章、技術交流、商務合作、聯系博主
微信掃碼或搜索:z360901061
微信掃一掃加我為好友
QQ號聯系: 360901061
您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點擊下面給點支持吧,站長非常感激您!手機微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點擊微信右上角掃一掃功能,選擇支付二維碼完成支付。
【本文對您有幫助就好】元