[spring] springMVC jsp和Freemarker 多视图解析器配置

二、Spring MVC视图解析器

视图解析器的工作流程大致是这样的:

  1. Controller的某个方法执行完成以后,返回一个视图(比如:listUser)
  2. 视图解析器要做的工作就是找到某个对象来完成视图的渲染,或者跳转到其他的逻辑视图。这里的渲染对象通常就是我们的jsp文件或者我们下面用的Freemarker(例如listUser.jsp或者listUser.ftl)。
  3. 渲染完成以后,将解析结果发送到客户端浏览器

下面介绍一下本文需要用到的解析器(更多解析器资料):

  • InternalResourceViewResolver:这是一个最常用的解析器。通常使用它指定渲染对象为jsp页面
  • FreeMarkerViewResolver:这就是Spring与Freemarker整合需要用到的解析器

三、配置多视图,支持freemarker

我们通常不希望所有的动态页面请求都使用Freemarker来渲染,那就需要配置多个视图解析器。

    <!--Freemarker配置-->
    <bean id="freeMarkerViewResolver" class="org.springframework.web.servlet.view.freemarker.FreeMarkerViewResolver">
        <property name="order" value="0" />
        <property name="viewClass" value="org.springframework.web.servlet.view.freemarker.FreeMarkerView" />
        <property name="suffix" value=".ftl"/>
        <property name="cache" value="false"/>
        <property name="contentType" value="text/html;charset=UTF-8"/>
        <property name="exposeSessionAttributes" value="true"/>
        <property name="exposeRequestAttributes" value="true"/>
        <property name="exposeSpringMacroHelpers" value="true"/>
    </bean>

   

    <bean id="xmlEscape" class="freemarker.template.utility.XmlEscape" />

    <bean class="org.springframework.web.servlet.view.freemarker.FreeMarkerConfigurer">
        <property name="defaultEncoding" value="UTF-8"/>
        <property name="templateLoaderPath" value="/WEB-INF/ftl/"/>
        <property name="freemarkerSettings" >
            <props>
                <prop key="template_update_delay">10</prop>
                <prop key="defaultEncoding">UTF-8</prop>
                <prop key="url_escaping_charset">UTF-8</prop>
                <prop key="locale">zh_CN</prop>
                <prop key="boolean_format">true,false</prop>
                <prop key="time_format">HH:mm:ss</prop>
                <prop key="datetime_format">yyyy-MM-dd HH:mm:ss</prop>
                <prop key="date_format">yyyy-MM-dd</prop>
                <prop key="number_format">#.##</prop>
                <prop key="whitespace_stripping">true</prop>
            </props>
                </property>
        <property name="freemarkerVariables">
                   <map>
                       <entry key="xml_escape" value-ref="xmlEscape"></entry>
                   </map>

        </property>
    </bean>
    <!--
           视图解析器链
          当定义多个视图解析器的时候,就会形成视图解析器链。当controller返回一个视图名称的时候,会在视图解析器链上按照排序顺序进行处理。
          每个视图解析器都实现了ordered接口,数值越小就越靠前,默认都是最大值,order属性时Integer类型
    注意:像InternalResourceViewResolver这种能解析所有的视图,即永远能返回一个非空View对象的ViewResolver一定要把它放在ViewResolver链的最后面
   -->

    <!--jsp视图配置-->
    <bean id="InternalResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver">
        <property name="order" value="1" />
        <property name="prefix" value="/WEB-INF/jsp/" />
        <property name="suffix" value=".jsp" />
        <property name="viewClass" value="org.springframework.web.servlet.view.InternalResourceView" />
    </bean>

创建controller:

@Controller
public class CommonController {

    private Logger logger = Logger.getLogger(this.getClass());

    @RequestMapping("/index")
    public String toIndex(){
        return "common/index";
    }

    @RequestMapping("/ftl")
    public String toFtl(Model model,ModelMap modelMap){
        model.addAttribute("title","Freemarker");
        model.addAttribute("name","我去");

        return "Hello";
    }

 

Hello.ftl:

<html>

<head>
    <title>Hello,${title}</title>

</head>

<body>

<h1>你好,${name}</h1>

</body>
</html>

项目结构:

 

整合过程中遇到的异常:

[spring] spring MVC 整合freemarker:java.lang.IllegalAccessError: tried to access method freemarker.ext.servlet.AllHttpScopesHashModel.

posted @ 2015-08-30 14:35  snow__wolf  阅读(463)  评论(0)    收藏  举报