Back to Javatutorial

Spring MVC ʹViewResolverӿڽͼ

docs/Spring全家桶/SpringMVC/SpringMVC中的视图解析器.md

1.0.06.6 KB
Original Source

Spring MVC ʹViewResolverӿڽͼ

2018-07-26 15:39

Spring MVC ʵһ۵ģSpring MVCпĴ뷵һ߼ͼ֣ʽأ緵һString``View``ModelAndViewʽأԼķأSpringеͼһͼʶͼȾSpringзdzõͼ±г˴󲿷֣ҲһЩӡ

<section>

21.3 ͼ

ͼ
AbstractCachingViewResolverһͼ࣬ṩ˻ͼĹܡͨͼܹʹ֮ǰҪ׼̳ͼԻûͼ
XmlViewResolverͼӿViewResolverһʵ֣һXMLʽļXMLļSpring XMLbeanͬDTDĬϵļ/WEB-INF/views.xml
ResourceBundleViewResolverͼӿViewResolverһʵ֣bundle·ָResourceBundleеbeanΪáһbundleclasspath·µһļСĬϵļΪviews.properties
UrlBasedViewResolverViewResolverӿڵһʵֱ֡ʹURL߼ͼ֮ⲻҪκʽӳ߼ͼͼԴֱӶӦģôֱӽķʽͺܷ㣬Ҫָӳ䡣
InternalResourceViewResolverUrlBasedViewResolverһõࡣ֧ڲԴͼ˵ServletJSPԼJstlView``TilesViewࡣYou can specify the view class for all views generated by this resolver by using setViewClass(..)ϸڣUrlBasedViewResolverjavaĵ
VelocityViewResolver / FreeMarkerViewResolverUrlBasedViewResolverµʵ֧࣬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ļͼ̳Сһļ̳ͨмΪڶͼָһĬϵͼࡣ

AbstractCachingViewResolverܹѾͼʵرջҲǿԵģֻҪcacheΪfalseɡ⣬ʵҪʱˢijͼ޸Velocityģʱʹ`removeFromCache(String viewName, Locale loc)``

</section>

Spring MVC ͼ

2018-07-26 14:11

Spring֧ͬʱʹöͼˣһ±磬ض¸дһͼȡͨѶͼõӦ(application context)еķʽǡҪָǵĴôorderԼɡסorderԵֵԽ󣬸ͼеλþԽ

<section>

ĴУͼаһ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Զ һͼ

</section>

Spring MVC ͼض

2018-07-26 14:12

ǰͨ᷵һ߼ͼȻͼһͼȥȾһЩServletJSPͼJSPȣͨInternalResourceViewResolver``InternalResourceViewЭɵģͨServletAPIRequestDispatcher.forward(..)``RequestDispatcher.include(..)һڲתforwardãincludeͼVelocityXSLTȣͼֱӱдӦеġ

<section>

ʱҪͼȾ֮ǰȰһHTTPضͻؿͻˡ磬һɹؽܵPOSTݣӦίһһγɹıύʱϣһضֳ£ֻǼ򵥵ʹڲתôζһҲܿPOSTЯݣܵһЩDZڵ⣬ܻݻȡ⣬һȾͼǰضǣֹûύݡʱʹضȷ͵һPOST󱻴յһضӦȻֱӱضһͬURLʹضӦЯURLһGETˣĽǶȿǰҳ沢POSTĽһGETĽͷֹûˢµԭύ˶ͬݡʱˢ»GETһνҳǰͬPOSTٷһ顣

ضͼ RedirectView

ǿضһַǣڿдһ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 ʹһڡ

ضǰ׺redirect:

ʹ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õӦ״ֵ̬

ضǰ׺forward:

ջᱻUrlBasedViewResolverͼʹһǰ׺forward:ᵼһInternalResourceViewͼĴջRequestDispatcher.forward()߻ΪͼʣµIJһURLˣǰ׺ʹInternalResourceViewResolver``InternalResourceViewʱûرãJSP˵ҪʹõͼҪǿưһԴתServlet/JSPдʱǰ׺ܾͺãߣҲͬʱͼ

redirect:ǰ׺һеͼʹforward:ǰ׺ᷢκ쳣עȻֻδӦ⡣

</section>