docs/Spring全家桶/SpringMVC/SpringMVC中的视图解析器.md
2018-07-26 15:39
Spring MVC ʵһ۵ģSpring MVCпĴ뷵һͼ֣ʽأ緵һString``View``ModelAndViewʽأԼķأSpringеͼһͼʶͼȾSpringзdzõͼ±г˴֣ҲһЩӡ
21.3 ͼ
| ͼ | |
|---|---|
AbstractCachingViewResolver | һͼ࣬ṩ˻ͼĹܡͨͼܹʹ֮ǰҪ̳ͼԻûͼ |
XmlViewResolver | ͼӿViewResolverһʵ֣һXMLʽļXMLļSpring XMLbeanͬDTDĬϵļ/WEB-INF/views.xml |
ResourceBundleViewResolver | ͼӿViewResolverһʵ֣bundle·ָResourceBundleеbeanΪáһbundleclasspath·µһļСĬϵļΪviews.properties |
UrlBasedViewResolver | ViewResolverӿڵһʵֱ֡ʹURLͼ֮ⲻҪκʽӳͼͼԴֱӶӦģôֱӽķʽͺܷ㣬Ҫָӳ䡣 |
InternalResourceViewResolver | UrlBasedViewResolverһõࡣ֧ڲԴͼ˵ServletJSPԼJstlView``TilesViewࡣYou can specify the view class for all views generated by this resolver by using setViewClass(..)ϸڣUrlBasedViewResolverjavaĵ |
VelocityViewResolver / FreeMarkerViewResolver | UrlBasedViewResolverµʵ֧࣬VelocityͼVelocityViewVelocityģ壩FreeMarkerͼFreeMarkerViewԼǶӦࡣ |
ContentNegotiatingViewResolver | ͼӿViewResolverһʵ֣ļAcceptͷһͼϸSpring MVC ЭͼһСڡ |
ǿԾٸӣʹõJSPͼôǿʹһURLͼUrlBasedViewResolverͼὫURLһͼתַͼȾ
<bean id="viewResolver" class="org.springframework.web.servlet.view.UrlBasedViewResolver">
<property name="viewClass" value="org.springframework.web.servlet.view.JstlView"/>
<property name="prefix" value="/WEB-INF/jsp/"/>
<property name="suffix" value=".jsp"/>
</bean>
һtestͼôͼὫתRequestDispatcherὫ/WEB-INF/jsp/test.jspͼȥȾ
ҪӦʹöֲͬͼʹResourceBundleViewResolver
<bean id="viewResolver"
class="org.springframework.web.servlet.view.ResourceBundleViewResolver">
<property name="basename" value="views"/>
<property name="defaultParentView" value="parentView"/>
</bean>
ResourceBundleViewResolverbundle·õResourceBundleÿͼԣͼ[viewname].(class)Եֵָͼurl[viewname].urlԵֵָһڽϸͼҵӡ㻹Կͼлͼpropertiesļͼ̳Сһļ̳ͨмΪڶͼָһĬϵͼࡣ
</section>
AbstractCachingViewResolverܹѾͼʵرջҲǿԵģֻҪcacheΪfalseɡ⣬ʵҪʱˢijͼVelocityģʱʹ`removeFromCache(String viewName, Locale loc)``
2018-07-26 14:11
Spring֧ͬʱʹöͼˣһ±磬ض¸дһͼȡͨѶͼõӦ(application context)еķʽǡҪָǵĴôorderԼɡסorderԵֵԽͼеλþԽ
ĴУͼаһInternalResourceViewResolverԶڽһXmlViewResolverָExcelͼInternalResourceViewResolver֧Excelͼ
<bean id="jspViewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<property name="viewClass" value="org.springframework.web.servlet.view.JstlView"/>
<property name="prefix" value="/WEB-INF/jsp/"/>
<property name="suffix" value=".jsp"/>
</bean>
<bean id="excelViewResolver" class="org.springframework.web.servlet.view.XmlViewResolver">
<property name="order" value="1"/>
<property name="location" value="/WEB-INF/views.xml"/>
</bean>
<!-- in views.xml -->
<beans>
<bean name="report" class="org.springframework.example.ReportExcelView"/>
</beans>
һͼܷһͼôSpringͼʱĽSpringǣֱһͼΪֹͼܷһͼSpring׳һServletException
ͼĽӿˣһͼ__nullֵģʾҵκκʵͼеͼôҲڲò˵ijȷʵӦͼǷڡ磬InternalResourceViewResolverڲʹRequestDispatcherҽɹǼһJSPͼǷڵΨһܷ̽ΨһһΡͬVelocityViewResolverͲͼҲijضͼJavaĵǷreportڵͼˣInternalResourceViewResolverڽܵ½ȫִУΪInternalResourceViewResolverԶ һͼ
2018-07-26 14:12
ǰͨ᷵һͼȻͼһͼȥȾһЩServletJSPͼJSPȣͨInternalResourceViewResolver``InternalResourceViewЭɵģͨServletAPIRequestDispatcher.forward(..)``RequestDispatcher.include(..)һڲתforwardãincludeͼVelocityXSLTȣͼֱӱдӦеġ
ʱҪͼȾ֮ǰȰһHTTPضͻؿͻˡ磬һɹؽܵPOSTݣӦίһһγɹıύʱϣһضֳ£ֻǼʹڲתôζһҲܿPOSTЯݣܵһЩDZڵ⣬ܻݻȡ⣬һȾͼǰضǣֹûύݡʱʹضȷ͵һPOSTյһضӦȻֱӱضһͬURLʹضӦЯURLһGETˣĽǶȿǰҳ沢POSTĽһGETĽͷֹûˢµԭύ˶ͬݡʱˢ»GETһνҳǰͬPOSTٷһ顣
ǿضһַǣڿдһSpringضͼRedirectViewʵʹDispatcherServletʹһͼƣΪѾһضͼDispatcherServletˣṹһͼȾRedirectView``HttpServletResponse.sendRedirect()һHTTPضӦͻ
RedirectViewͼʵɿڲģǸƼⲿضURLȻע뵽дڿ档Ϳͼһļáʵο ضǰredirect:һСڡ
ģеĬ϶ῼΪURIģӵضURLСʣµԣǻͻ͵ļϻ飬ǽԶӵURLIJѯȥmodelרΪضģôл͵ӵѯпǸĽǣڰעĿУmodelܰרΪȾ;ԣһбֵֶȣΪ˱Ҳ¶URLУ@RequestMappingһRedirectAttributes͵ķָרŹضͼRedirectViewȡõԡضɹôRedirectAttributesеݾͻᱻʹãʹģmodelеݡ
RequestMappingHandlerAdapterṩһ"ignoreDefaultModelOnRedirect"־ĬModelеԶӦñڿضСӦһRedirectAttributesIJǾûвݵضͼRedirectViewСMVCռMVC Java÷ʽУΪάļԣ־ԱΪfalseӦһµĿôƼֵótrue
ע⣬ǰURIеģضURLʱԶӦÿɼҪʽModel``RedirectAttributesԡ뿴ӣ
@RequestMapping(path = "/files/{path}", method = RequestMethod.POST)
public String upload(...) {
// ...
return "redirect:files/{path}";
}
һضĿ괫ݵķͨ _ԣFlash Attributes_ضԲͬflashǴ洢HTTP sessionеģ˲URLУݣο 21.6 ʹһڡ
ʹRedirectViewضܹúܺãҪһRedirectViewɿ˽ضôһķе㲻ͬϻ̫ǿʵӦȥӦαȾIn general it should operate only in terms of view names that have been injected into it.
һرͼǰredirect:صͼкredirect:ǰôUrlBasedViewResolverࣩͻܵźţʶҪضȻͼʣµIJֻᱻضURL
ַʽͨһضͼRedirectViewﵽЧһģһͿֻרעڴͼˡͼʽredirect:/myapp/some/resourceض·ServletΪ·вңͼʽredirect:http://myhost.com/some/arbitrary/pathôضURLʹõľǾ·
עǣע@ResponseStatusôעõ״ֵ̬ḲRedirectViewõӦ״ֵ̬
ջᱻUrlBasedViewResolverͼʹһǰforward:ᵼһInternalResourceViewͼĴջRequestDispatcher.forward()ΪͼʣµIJһURLˣǰʹInternalResourceViewResolver``InternalResourceViewʱûرãJSP˵ҪʹõͼҪǿưһԴתServlet/JSPдʱǰܾͺãߣҲͬʱͼ
redirect:ǰһеͼʹforward:ǰᷢκ쳣עȻֻδӦ⡣