之前也大概研究了下,不过当时没有结果,
这次整理框架刚好又遇上这个问题,需要整合之前两个框架的页面,
一个页面是jsp的,一个页面是freemarker写的,刚好也用到了sitemesh,
本着重复利用,不再重复造轮子的思想(其实是有点懒不想重写而已>.<)
没办法就好好处理了下,整理过程中发现网上各种不切实际的文章扰人耳目,索性就自己整理一篇吧.这也是写这些文字的一点意义所在了.
单视图解析
以xml配置方式为例.
jsp解析
<bean id="viewResolver"
class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<property name="prefix" value="/web/"/>
<property name="suffix" value=".jsp"/>
</bean>
freemarker解析
web.xml
<!-- ftl解析 -->
<servlet-mapping>
<servlet-name>default</servlet-name>
<url-pattern>*.ftl</url-pattern>
</servlet-mapping>
application.xml
<bean id="viewResolverFtl" class="org.springframework.web.servlet.view.freemarker.FreeMarkerViewResolver">
<property name="viewClass" value="org.springframework.web.servlet.view.freemarker.FreeMarkerView"/>
<property name="contentType" value="text/html; charset=UTF-8"/>
<property name="exposeRequestAttributes" value="true" />
<property name="exposeSessionAttributes" value="true" />
<property name="exposeSpringMacroHelpers" value="true" />
<property name="allowSessionOverride" value="true" />
<property name="allowRequestOverride" value="true" />
<property name="cache" value="true" />
<property name="suffix" value=".ftl" />
</bean>
这都是比较基础的了,没啥好说的。
多视图整合解析
其实也比较简单,
1.把上面两种解析都用上,
2.修改解析配置加上一个关键的 viewNames属性
<property name="viewNames" value="*.ftl" />
<property name="viewNames" value="*.jsp" />
3.修改解析配置去掉原来的suffix属性(这个是网上很多都漏掉的一点)
4.修改相关controller,添加返回页面后缀,例:返回xxx/xxx.jsp 或者xxx/xxx.ftl
5.给所有的解析增加一个排序
如果不去掉则会出现无法解析其中一种的问题.
综合如下:
<bean id="viewResolver"
class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<property name="prefix" value="/web/"/>
<property name="order" value="0"/>
<property name="viewNames" value="*.jsp" />
<!-- <property name="suffix" value=".jsp"/> -->
</bean>
<bean id="viewResolverFtl" class="org.springframework.web.servlet.view.freemarker.FreeMarkerViewResolver">
<property name="viewClass" value="org.springframework.web.servlet.view.freemarker.FreeMarkerView"/>
<property name="contentType" value="text/html; charset=UTF-8"/>
<property name="exposeRequestAttributes" value="true" />
<property name="exposeSessionAttributes" value="true" />
<property name="exposeSpringMacroHelpers" value="true" />
<property name="allowSessionOverride" value="true" />
<property name="allowRequestOverride" value="true" />
<property name="cache" value="true" />
<property name="viewNames" value="*.ftl" />
<!-- <property name="suffix" value=".ftl" /> -->
<property name="order" value="1"/>
</bean>
controller如下:
@RequestMapping(value = "/preview/{style}")
public String preview(HttpServletRequest request, @PathVariable("style") String style) {
return "index/"+style+"/preview.jsp";
}
@RequestMapping("/index")
public String index(Map<String, Object> map) {
return "/user/account/account_info.ftl";
}
spring跳转
其实到上面基本上就完结了。
但是项目里面有几处 这样的 重定向 返回的 redirect:xxxxx。
@RequestMapping(value = "/")
public String index(HttpServletRequest request) {
return "redirect:/uindex/preview/1";
}
当只配置上面两种解析的时候,会出现无法解析.
javax.servlet.ServletException: Could not resolve view with name 'redirect:/uindex/preview/1' in servlet with name 'springMvc' at org.springframework.web.servlet.DispatcherServlet.render(DispatcherServlet.java:1251) at org.springframework.web.servlet.DispatcherServlet.processDispatchResult(DispatcherServlet.java:1037)
我们跟踪源码发现:
这里会对所有的视图解析轮询一个个试,
因为前面两个解析分别只能处理 .ftl,.jsp的文件,这个跳转的就没法解析。
所以这里需要再补上一个普通的解析来处理跳转.
<bean id="viewResolver2"
class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<property name="prefix" value="/web/"/>
<property name="order" value="2"/>
<property name="suffix" value=".jsp"/>
</bean>
这样就ok了!
本文基于CC BY-NC-ND 4.0 许可协议发布,作者:野生的喵喵。 固定链接: 【Spring mvc + sitemesh 解析jsp及freemarker ftl多视图配置】 转载请注明
相关文章: