SpringMVC系列之二、集成FreeMarker

SpringMVC系列之一、集成JSP
SpringMVC系列之二、集成FreeMarker
SpringMVC系列之三、集成Log4j

SpringMVC系列之一、集成JSP类似,改动的地方:

1. 在pom.xml文件中添加FreeMarker依赖:
  <properties>
    <freemarker.version>2.3.19</freemarker.version>
  </properties>
  <dependencies>
    <dependency>
        <groupId>org.freemarker</groupId>
        <artifactId>freemarker</artifactId>
        <version>${freemarker.version}</version>
    </dependency>
  </dependencies>


2. web.xml文件,SpringMVC配置文件改为mvc-ftl.xml:
    <init-param>
        <param-name>contextConfigLocation</param-name>
        <param-value>/WEB-INF/mvc-ftl.xml</param-value>
    </init-param>


mvc-ftl.xml,

①. 使用SpringMVC自带的FreeMarker视图解析器FreeMarkerViewResolver
②. 有且只有一个FreeMarkerConfig的bean定义,否则会抛异常。在SpringMVC中,FreeMarkerConfig的实现是FreeMarkerConfigurer
③. 和JSP在prefix属性中指定文件存放路径不同,FreeMarker在templateLoaderPaths属性中指定。

<!-- FreeMarker view resolver -->
<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="prefix" value="he" />
    <property name="cache" value="false"/>
    <property name="viewNames">
        <array>
            <value>*.ftl</value>
        </array>
    </property>
    <!--<property name="suffix" value=".ftl"/>-->
    <property name="order" value="0"/><!-- 优先级,数值越小优先级越高 -->
</bean>

<bean id="freemarkerConfig" class="org.springframework.web.servlet.view.freemarker.FreeMarkerConfigurer">
    <property name="templateLoaderPaths">
        <list>
            <value>/WEB-INF/ftl/</value><!-- 模板加载路径 -->
        </list>
    </property>
</bean>

<bean name="/ftl.htm" class="com.john.chapter5.web.controller.WithFtlController" />


3. WithFtlController类
public class WithFtlController implements Controller {
	@Override
	public ModelAndView handleRequest(HttpServletRequest request,
			HttpServletResponse response) throws Exception {
		ModelAndView mv = new ModelAndView("llo.ftl");
		mv.addObject("msg", "Hello Freemarker!");
		return mv;
	}
}


4. 在/WEB-INF/ftl目录下新建hello.ftl文件
<html>
<head>
<title>Freemarker</title>
</head>
<body>
${msg}
</body>
</html>


5. 运行/调试工程,请求http://localhost:8080/chapter5/ftl.htm,页面输出:
Hello Freemarker!

附:
在FreeMarkerViewResolver的buildView方法中,组装视图的URL:



protected AbstractUrlBasedView buildView(String viewName) throws Exception {
    AbstractUrlBasedView view = (AbstractUrlBasedView) BeanUtils.instantiateClass(getViewClass());
    view.setUrl(getPrefix() + viewName + getSuffix()); // he + llo.ftl + "" => hello.ftl
    String contentType = getContentType();
    if (contentType != null) {
        view.setContentType(contentType);
    }
    view.setRequestContextAttribute(getRequestContextAttribute());
    view.setAttributesMap(getAttributesMap());
    if (this.exposePathVariables != null) {
        view.setExposePathVariables(exposePathVariables);
    }
    return view;
}

猜你喜欢

转载自czj4451.iteye.com/blog/1958909