Spring MVC整合FreeMarker
什么是Freemarker?
FreeMarker是一个用Java语言编写的模板引擎,它基于模板来生成文本输出。FreeMarker与Web容器无关,即在Web运行时,它并不知道Servlet或HTTP。它不仅可以用作表现层的实现技术,而且还可以用于生成XML,JSP或Java 等。
目前企业中:主要用Freemarker做静态页面或是页面展示
一.工程结构

二.web.xml
1 <?xml version="1.0" encoding="UTF-8"?> 2 <web-app version="2.4" xmlns="http://java.sun.com/xml/ns/j2ee" 3 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 4 xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee 5 http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd"> 6 7 <display-name>SpringMVC</display-name> 8 9 <context-param> 10 <param-name>contextConfigLocation</param-name> 11 <param-value>/WEB-INF/springMVC-servlet.xml</param-value> 12 </context-param> 13 14 <listener> 15 <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class> 16 </listener> 17 18 <filter> 19 <filter-name>encodingFilter</filter-name> 20 <filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class> 21 <init-param> 22 <param-name>encoding</param-name> 23 <param-value>UTF-8</param-value> 24 </init-param> 25 <init-param> 26 <param-name>forceEncoding</param-name> 27 <param-value>true</param-value> 28 </init-param> 29 </filter> 30 <filter-mapping> 31 <filter-name>encodingFilter</filter-name> 32 <url-pattern>/*</url-pattern> 33 </filter-mapping> 34 35 <servlet> 36 <servlet-name>springMVC</servlet-name> 37 <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class> 38 <load-on-startup>1</load-on-startup> 39 </servlet> 40 <servlet-mapping> 41 <servlet-name>springMVC</servlet-name> 42 <url-pattern>/</url-pattern> 43 </servlet-mapping> 44 </web-app>
三.springMVC-servlet.xml
1 <?xml version="1.0" encoding="UTF-8"?> 2 <beans xmlns="http://www.springframework.org/schema/beans" 3 xmlns:context="http://www.springframework.org/schema/context" xmlns:p="http://www.springframework.org/schema/p" 4 xmlns:mvc="http://www.springframework.org/schema/mvc" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 5 xsi:schemaLocation="http://www.springframework.org/schema/beans 6 http://www.springframework.org/schema/beans/spring-beans-3.0.xsd 7 http://www.springframework.org/schema/context 8 http://www.springframework.org/schema/context/spring-context-3.0.xsd 9 http://www.springframework.org/schema/mvc 10 http://www.springframework.org/schema/mvc/spring-mvc-3.0.xsd 11 "> 12 <!-- 自动扫描包 --> 13 <context:component-scan base-package="com.bijian.study.controller"></context:component-scan> 14 15 <!-- 默认注解映射支持 --> 16 <mvc:annotation-driven></mvc:annotation-driven> 17 18 <!--JSP视图解析器--> 19 <bean id="viewResolverJsp" class="org.springframework.web.servlet.view.InternalResourceViewResolver"> 20 <property name="prefix" value="/WEB-INF/views/"/> 21 <property name="suffix" value=".jsp"/> 22 <property name="viewClass" value="org.springframework.web.servlet.view.InternalResourceView"/> 23 <property name="order" value="1"/> 24 </bean> 25 26 <!-- 配置freeMarker视图解析器 --> 27 <bean id="viewResolverFtl" class="org.springframework.web.servlet.view.freemarker.FreeMarkerViewResolver"> 28 <property name="viewClass" value="org.springframework.web.servlet.view.freemarker.FreeMarkerView"/> 29 <property name="contentType" value="text/html; charset=UTF-8"/> 30 <property name="exposeRequestAttributes" value="true" /> 31 <property name="exposeSessionAttributes" value="true" /> 32 <property name="exposeSpringMacroHelpers" value="true" /> 33 <property name="cache" value="true" /> 34 <property name="suffix" value=".ftl" /> 35 <property name="order" value="0"/> 36 </bean> 37 38 <!-- 配置freeMarker的模板路径 --> 39 <bean id="freemarkerConfig" class="org.springframework.web.servlet.view.freemarker.FreeMarkerConfigurer"> 40 <property name="templateLoaderPath" value="/WEB-INF/ftl/"/> 41 <property name="freemarkerVariables"> 42 <map> 43 <entry key="xml_escape" value-ref="fmXmlEscape" /> 44 </map> 45 </property> 46 <property name="defaultEncoding" value="UTF-8"/> 47 <property name="freemarkerSettings"> 48 <props> 49 <prop key="template_update_delay">3600</prop> 50 <prop key="locale">zh_CN</prop> 51 <prop key="datetime_format">yyyy-MM-dd HH:mm:ss</prop> 52 <prop key="date_format">yyyy-MM-dd</prop> 53 <prop key="number_format">#.##</prop> 54 </props> 55 </property> 56 </bean> 57 58 <bean id="fmXmlEscape" class="freemarker.template.utility.XmlEscape"/> 59 </beans>
在JSP和Freemarker的配置项中都有一个order property,上面例子是把freemarker的order设置为0,jsp为1,意思是找view时,先找ftl文件,再找jsp文件做为视图。这样Freemarker视图解析器就能与JSP视图解析器并存。
四.FreeMarkerController.java
1 package com.bijian.study.controller;
2
3 import java.util.ArrayList;
4 import java.util.HashMap;
5 import java.util.List;
6 import java.util.Map;
7
8 import javax.servlet.http.HttpServletRequest;
9 import javax.servlet.http.HttpServletResponse;
10
11 import org.springframework.stereotype.Controller;
12 import org.springframework.web.bind.annotation.RequestMapping;
13 import org.springframework.web.servlet.ModelAndView;
14
15 import com.alibaba.fastjson.JSON;
16 import com.bijian.study.utils.JsonUtil;
17 import com.bijian.study.vo.User;
18
19 @Controller
20 public class FreeMarkerController {
21
22 @RequestMapping("/get/usersInfo")
23 public ModelAndView Add(HttpServletRequest request, HttpServletResponse response) {
24
25 User user = new User();
26 user.setUsername("zhangsan");
27 user.setPassword("1234");
28
29 User user2 = new User();
30 user2.setUsername("lisi");
31 user2.setPassword("123");
32
33 List<User> users = new ArrayList<User>();
34 users.add(user);
35 users.add(user2);
36 return new ModelAndView("usersInfo", "users", users);
37 }
38
39 @RequestMapping("/get/allUsers")
40 public ModelAndView test(HttpServletRequest request, HttpServletResponse response) {
41
42 List<User> users = new ArrayList<User>();
43 User u1 = new User();
44 u1.setUsername("王五");
45 u1.setPassword("123");
46 users.add(u1);
47
48 User u2 = new User();
49 u2.setUsername("张三");
50 u2.setPassword("2345");
51 users.add(u2);
52
53 User u3 = new User();
54 u3.setPassword("fgh");
55 u3.setUsername("李四");
56 users.add(u3);
57
58 Map<String, Object> rootMap = new HashMap<String, Object>();
59 rootMap.put("userList", users);
60 Map<String, String> product = new HashMap<String, String>();
61 rootMap.put("lastProduct", product);
62 product.put("url", "http://www.baidu.com");
63 product.put("name", "green hose");
64
65 String result = JSON.toJSONString(rootMap);
66
67 Map<String, Object> resultMap = new HashMap<String, Object>();
68 resultMap = JsonUtil.getMapFromJson(result);
69
70 return new ModelAndView("allUsers", "resultMap", resultMap);
71 }
72 }
五.JsonUtil.java
1 package com.bijian.study.utils;
2
3 import java.util.Map;
4
5 import com.alibaba.fastjson.JSON;
6
7 public class JsonUtil {
8
9 public static Map<String, Object> getMapFromJson(String jsonString) {
10 if (checkStringIsEmpty(jsonString)) {
11 return null;
12 }
13 return JSON.parseObject(jsonString);
14 }
15
16 /**
17 * 检查字符串是否为空
18 * @param str
19 * @return
20 */
21 private static boolean checkStringIsEmpty(String str) {
22 if (str == null || str.trim().equals("") || str.equalsIgnoreCase("null")) {
23 return true;
24 }
25 return false;
26 }
27 }
六.User.java
1 ackage com.bijian.study.vo;
2
3 public class User {
4
5 private String username;
6 private String password;
7
8 public String getUsername() {
9 return username;
10 }
11
12 public void setUsername(String username) {
13 this.username = username;
14 }
15
16 public String getPassword() {
17 return password;
18 }
19
20 public void setPassword(String password) {
21 this.password = password;
22 }
23 }
七.usersInfo.ftl
1 <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
2 <html>
3 <head>
4 <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
5 <title>usersInfo</title>
6 </head>
7 <body>
8 <#list users as user>
9 <div>
10 username : ${user.username},
11 password : ${user.password}
12 </div>
13 </#list>
14 </body>
15 </html>
八.allUsers.ftl
1 <html>
2 <head>
3 <title>allUsers</title>
4 </head>
5 <body>
6 <#list resultMap.userList as user>
7 Welcome ${user.username}! id:${user.password}<br/>
8 </#list>
9 <p>Our latest product:
10 <a href="${resultMap.lastProduct.url}">${resultMap.lastProduct.name} </a>!
11 </body>
12 </html>
九.运行效果


再输入http://localhost:8088/SpringMVC/greeting?name=zhangshan,JSP视图解析器运行依然正常。

至此,就结束完成整合了!
如需转载,请注明文章出处和来源网址:http://www.divcss5.com/html/h57144.shtml








