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