Spring mvc + sitemesh 解析jsp及freemarker ftl多视图配置
 2018-11-13 06:53:05   245   0   

本文最后更新于天前,文中介绍内容及环境可能已不适用.请谨慎参考.

之前也大概研究了下,不过当时没有结果,

这次整理框架刚好又遇上这个问题,需要整合之前两个框架的页面,

一个页面是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了!


 2018-11-15 17:08:35 
 1

  本文基于CC BY-NC-ND 4.0 许可协议发布,作者:野生的喵喵 固定链接: 【Spring mvc + sitemesh 解析jsp及freemarker ftl多视图配置】 转载请注明



发表新的评论
{{s_uid}}   , 欢迎回来.
您的称呼(*必填):
您的邮箱地址(*必填,您的邮箱地址不会公开,仅作为有回复后的消息通知手段):
您的站点地址(选填):
留言:

∑( ° △ °|||)︴

(๑•̀ㅂ•́)و✧
<( ̄) ̄)>
[]~( ̄▽ ̄)~*
( ̄ˇ ̄)
[]~( ̄▽ ̄)~*
( ̄ˇ ̄)
╮( ̄▽ ̄)╭
( ̄ε(# ̄)
(⊙ˍ⊙)
( ̄▽ ̄)~*
∑( ° △ °|||)︴

文章分类

可能喜欢 

KxのBook@Copyright 2017- All Rights Reserved
Designed and themed by 野生的喵喵   1622158   44923