【Java.Spring.MVC】解析视图

Spring使用view resolvers来将model渲染到浏览器。Spring支持JSP, Velocity, XSLT等视图技术。

Spring处理视图的两个重要的接口是:

  • ViewResolver - 在view name和实际的view之间进行映射
  • View - 视图基础接口,它的各种实现类是无状态的,因此是线程安全的

View

AbstractView抽象类

View接口的基础实现类。

AbstractUrlBasedView抽象类

继承自AbstractView抽象类。

InternalResourceView类

继承自AbstractUrlBasedView抽象类,表示JSP视图。

JstlView类

JSTL视图,继承自InternalResourceView

AbstractTemplateView抽象类

继承自AbstractUrlBasedView抽象类。

这个类是某些模板引擎视图类的父类,比如FreemarkerView, VelocityView

FreeMarkerView类

继承自AbstractTemplateView抽象类

RedirectView类

继承自AbstractUrlBasedView,并实现SmartView接口。

该视图的renderMergedOutputModel方法主要就是通过response.sendRedirect进行重定向。


使用ViewResolver接口解析视图

Spring MVC controller的处理方法通常会返回一个视图名称(String, View, ModelAndView)。View通常表现为一个逻辑视图名称,并使用view resolver进行解析。

Spring提供了一组自带的view resolver:

  • AbstractCachingViewResolver -  带有缓存功能的抽象view resolver
  • XmlViewResolver - 实现了ViewResolver接口,接受一个XML格式的配置文件,默认的配置文件是/WEB-INF/views.xml
  • ResourceBundleViewResolver - 实现了ViewResolver接口,并使用ResourceBundle中的bean定义。在properties文件中定义bundle,默认的文件名为views.properties
  • UrlBasedViewResolver - ViewResolver接口的简单实现,不需要显示的指定,就可以定义逻辑视图名和URL之间的解析。
  • InternalResourceViewResolver - UrlBasedViewResolver的子类,支持InternalResourceView及其子类如JstlView和TilesView. 使用方法setViewClass()指定resolver所生成的所有view所对应的class。
  • VelocityViewResolver/FreeMarkerViewResolver - UrlBasedViewResolver的子类,支持VelocityView, FreeMarkerView及其(自定义)子类
  • ContentNegotiatingViewResolver - 实现ViewResolver接口,基于request file name或者Accept header解析视图


View / ViewResolver参考

http://www.cnblogs.com/fangjian0423/p/springMVC-view-viewResolver.html


ViewResolvers链

Spring支持多个view resolvers. 可以将多个resolvers串起来,通过在application context中添加多个resolver;如果需要的话,通过设定order属性来指定顺序。order 属性的值越大,则其在resolver链中的优先级越低。

例如:

<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>

该view resolvers链由两个resolvers组成:InternalResourceViewResolver默认是最后的resolver,XmlViewResolver用来指定Excel Views。InternalResourceViewResolver不支持Excel Views。

如果一个特定的view resolver没有返回视图,Spring会在context中查找其他的view resolvers。如果其他的view resolvers存在,Spring会继续检测直到view被解析。如果没有view resolver能返回一个view,则Spring返回一个ServletException异常


重定向视图


RedirectView

一种在controller中重定向的方法是染回一个Spring RedirectView的实例。在这种情况下,DispatcherServlet不会使用视图解析机制. 因为已经给定了重定向的view的名字,DispatcherServlet简单的通知view去处理。

RedirectView发出一个HttpServletResponse.sendRedirect()调用,该调用返回一个HTTP redirect给浏览器。默认所有的model属性都会被当作重定向URL的URI模板变量,其余的属性自动被附加到查询参数中。


当前请求中的URI template variables对于重定向URL是自动可用的,不需要通过Model或RedirectAttribute进行显式的转换。例如:

@RequestMapping(value = "/files/{path}", method = RequestMethod.POST)
public String upload(...) {
    // ...
    return "redirect:files/{path}";
}

redirect:prefix

通常,controller不应该关心response如何被处理,它应该以视图名称的形式被处理。

redirect:prefix可以实现这一功能。如果一个返回的视图名称包含前缀: redirect: ,那么UrlBasedViewResolver及其子类将会将其视为一个redirect。view name的剩余部分会被当作redirect URL.

这与controller直接返回RedirectView的效果是一样的,但是controller仅仅需要通过返回视图名即可。

一个逻辑视图名称例如:redirect:/myapp/some/resource将会相对于当前Servlet Context重定向;形如:redirect:http://myhost.com/some/arbitrary/path将会重定向到一个绝对的URL。


forward:prefix

也可以在视图名称前使用一个forward:前缀,它会被UrlBasedViewResolver及其子类解析。这将会基于视图名称的其余部分创建一个InternalResourceView.


重定向视图使用参考

http://www.tuicool.com/articles/FZ3Uv2q



  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值