文章目录
- 1. 简介
- 2. SpringMVC 整合 Freemarker
- 2.1 配置pom.xml
- 2.2 配置web.xml
- 2.3 配置springmvc_freemarker.xml
- 2.4 创建实体类User
- 2.4 创建UserController
- 2.4 创建userinfo.ftl模版文件
- 2.6 运行web程序
- 2.7 源码和文档
- 3. Freemarker语法简介
- 3.1 标签
- 3.2 常用标签
- 3.2.1 list遍历
- 3.2.1 if else
- 3.2.1 插入页面
- 3.3 空值处理策略
- 3.4 数据
- 3.5 宏(自定义标签)
- 3.5.1 定义宏 - 两个参数
- 3.5.2 定义宏 - 带默认值的参数
- 3.5.3 定义宏 - 嵌套结构
1. 简介
FreeMarker
是一款模板引擎: 即一种基于模板和要改变的数据, 并用来生成输出文本(HTML网页、电子邮件、配置文件、源代码等)的通用工具。 它不是面向最终用户的,而是一个Java类库,是一款程序员可以嵌入他们所开发产品的组件。FreeMarker
是免费的,基于Apache许可证2.0版本发布。其模板编写为FreeMarker Template Language(FTL
),属于简单、专用的语言。需要准备数据在真实编程语言中来显示,比如数据库查询和业务运算, 之后模板显示已经准备好的数据。在模板中,主要用于如何展现数据, 而在模板之外注意于要展示什么数据 [1] 。
2. SpringMVC 整合 Freemarker
2.1 配置pom.xml
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.springmvc</groupId>
<artifactId>springmvc-freemarker</artifactId>
<version>0.0.1-SNAPSHOT</version>
<packaging>war</packaging>
<properties>
<spring.version>4.3.17.RELEASE</spring.version>
<servlet.version>3.1.0</servlet.version>
<freemarker.version>2.3.23</freemarker.version>
</properties>
<dependencies>
<!-- Spring Begin -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context-support</artifactId>
<version>${spring.version}</version>
</dependency>
<!-- Spring End -->
<!-- Servlet Begin -->
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>javax.servlet-api</artifactId>
<version>${servlet.version}</version>
</dependency>
<!-- Servlet End -->
<!-- freemarker Begin -->
<dependency>
<groupId>org.freemarker</groupId>
<artifactId>freemarker</artifactId>
<version>${freemarker.version}</version>
</dependency>
<!-- freemarker End -->
</dependencies>
</project>
2.2 配置web.xml
这里主要是springmvc的配置,不清楚的可以去看我的另两篇文章
《走向单体地狱(八):Spring MVC》《Spring MVC 的 xml 配置详解》
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns="http://java.sun.com/xml/ns/javaee"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"
id="WebApp_ID" version="3.0">
<servlet>
<servlet-name>springDispatcherServlet</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:springmvc_freemarker.xml</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>springDispatcherServlet</servlet-name>
<url-pattern>/*</url-pattern>
</servlet-mapping>
</web-app>
2.3 配置springmvc_freemarker.xml
在SpringMVC
中整合Freemarker
的具体配置
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:context="http://www.springframework.org/schema/context"
xmlns:mvc="http://www.springframework.org/schema/mvc"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.1.xsd
http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc-4.1.xsd">
<!-- 包扫描 -->
<context:component-scan base-package="com.springmvc.freemarker"/>
<!-- 开启spring注解支持 -->
<mvc:annotation-driven/>
<!-- 定义BeanNameViewResolver 可以用来提供自定义view输出,如pdf等,但是一般用类似千牛的DNS静态服务来代替
此处与freemarker无关,仅仅是介绍freemarker在多视图解析器下order的顺序
-->
<bean class="org.springframework.web.servlet.view.BeanNameViewResolver">
<property name="order" value="1" />
</bean>
<!-- 注册freemarker配置类 -->
<bean id="freeMarkerConfigurer" class="org.springframework.web.servlet.view.freemarker.FreeMarkerConfigurer">
<!-- ftl模版文件路径 -->
<property name="templateLoaderPath" value="/WEB-INF/view/"></property>
<!-- 页面编码 -->
<property name="defaultEncoding" value="utf-8" />
<property name="freemarkerSettings">
<props>
<!-- 模版缓存刷新时间,不写单位默认为秒 -->
<prop key="template_update_delay">0</prop>
<!-- 时区 和 时间格式化 -->
<prop key="locale">zh_CN</prop>
<prop key="datetime_format">yyyy-MM-dd</prop>
<prop key="date_format">yyyy-MM-dd</prop>
<!-- 数字使用.来分隔 -->
<prop key="number_format">#.##</prop>
</props>
</property>
</bean>
<!-- 注册freemarker视图解析器 -->
<bean id="freeMarkerViewResolver"
class="org.springframework.web.servlet.view.freemarker.FreeMarkerViewResolver">
<!-- 视图解析顺序,排在其他视图解析器之后 数字越大优先级越低 -->
<property name="order" value="2" />
<!-- 开启模版缓存 -->
<property name="cache" value="true" />
<!-- 上面已经配了,这里就不用配啦 -->
<property name="prefix" value="" />
<!-- 配置文件后缀 -->
<property name="suffix" value=".ftl" />
<property name="contentType" value="text/html;charset=UTF-8" />
<!-- 是否允许session属性覆盖模型数据,默认false -->
<property name="allowSessionOverride" value="false" />
<!-- 是否允许request属性覆盖模型数据,默认false -->
<property name="allowRequestOverride" value="false" />
<!-- 开启spring提供的宏帮助(macro) -->
<property name="exposeSpringMacroHelpers" value="true" />
<!-- 添加request attributes属性到ModelAndView中 -->
<property name="exposeRequestAttributes" value="true" />
<!-- 添加session attributes属性到ModelAndView中 -->
<property name="exposeSessionAttributes" value="true" />
</bean>
</beans>
2.4 创建实体类User
创建com.springmvc.freemarker
包,新建entity
包然后创建User
实体类
public class User implements Serializable {
private static final long serialVersionUID = 1L;
private String name;
private Integer age;
public User() {
super();
}
public User(String name, Integer age) {
super();
this.name = name;
this.age = age;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Integer getAge() {
return age;
}
public void setAge(Integer age) {
this.age = age;
}
}
2.4 创建UserController
在com.springmvc.freemarker
包下新建Controller
包创建UserController
@Controller
@RequestMapping(value = "/user")
public class UserController {
@RequestMapping(value = "/info")
public String testFreemarker(HttpServletRequest request, ModelMap modelMap) throws Exception {
User user = new User("may", 21);
List<String> list = new ArrayList<String>();
list.add("Jack1");
list.add("Jack2");
list.add("Jack3");
modelMap.addAttribute("list", list);
modelMap.addAttribute("user", user);
request.setAttribute("haha","哈哈");
return "userinfo";
}
}
2.4 创建userinfo.ftl模版文件
在上文配置好的路径/WEB-INF/view/
下创建userinfo.ftl模版文件
List:<br/>
<#list list as item >
<font color="red">${item}</br></font>
</#list>
User:<br/>
${user.name}--->${user.age}<br/>
request:<br/>
${haha}
2.6 运行web程序
访问http://localhost:8080/user/info
显示如下结果既为成功
2.7 源码和文档
源码 github 地址: https://github.com/JSONCat/demo-java/tree/master/hello-springmvc-freemarker freemarker 文档:项目doc目录下
BeanNameViewResolver demo地址:https://github.com/JSONCat/demo-java/tree/master/hello-springmvc-beanresovler
3. Freemarker语法简介
Freemarker
是区分大小写的 ,
3.1 标签
标签 | 说明 |
| 插入标签,输出内部的变量,字符串,数字等值 |
| 变量 |
| 字符串 |
| ftl的tags标签 |
| 包含一段文本 |
| 创建一个变量 |
| 用户的自定义标签<@EventTabNav activeIndex=2 /> |
| 和html相同的标签 |
3.2 常用标签
3.2.1 list遍历
<#list forumInfos as f>
<option value="${f.id}" <#if f.id==fid>selected</#if>>${f.name}</option>
</#list>
3.2.1 if else
<#if o.order.state == 20 && o.order.activityStyleClassPayType == 'O'>
1
<#elseif o.order.state == 0>
2
</#if>
3.2.1 插入页面
<#include "inc/cfg.ftl">
3.3 空值处理策略
标签 | 说明 |
| 判断左侧的变量是否丢失返回布尔值,相当于java中的null的判断, |
|
|
| 用来给变量一个默认值,例如color!”no color” |
| 是??的老写法,现在不推荐使用。 |
例子:
?,如果不存在返回false,存在返回true
<#if detailList?has_content>
3
</#if>
!,如果为空,设置一个默认值
${otherPayNote!"" }
(a.b.c)! a,b,c任意一个不存在就为0
${(a.b.c)!0}
a.b.c c!0 仅当c不存在时为0,可能报错不建议这样用
${ a.b.c!0}
3.4 数据
数列[2,3,4,5],类似js数组
2..5 类比[2,3,4,5]内存占用更少更快
5..2 类比[5,4,3,2]
[1+1,[1,2,3],"three"] 可以进行内嵌
- 取值
a = [2,3,4,5] b = a[0] b等于2 - 切分
a = [2,3,4,5] b = a[0…2] b等于[2,3,4] - 连接
<#list [1,2]+[3,4] as i>
哈希表
拼接<#assign age = {“jack”:20}+{“jack”:30,“lucy”:27}>
拼接后重复的值取决于最右边的哈希表{“jack”:30,“lucy”:27}
3.5 宏(自定义标签)
3.5.1 定义宏 - 两个参数
<#macro greet person color>
<font size="2" color="${color}">hello ${person}</font>
</#macro>
使用宏
<@greet person="lilei" color="red"/>
3.5.2 定义宏 - 带默认值的参数
<#macro greet person color="yellow">
<font size="2" color="${color}">hello ${person}</font>
</#macro>
使用宏
使用时必须给全部的参数赋值,要么在定义时设置初始值,否则会报错
<@greet person="lilei"/>
3.5.3 定义宏 - 嵌套结构
<#macro greet color>
<font size="2" color="${color}">
<#nested>
<#nested>
</font>
</#macro>
使用宏
<@greet color="red">
hello world
</@greet>
结果<#nested>
代表使用时标签内的嵌套的内容,可以像上面那样被多次调用,在内嵌元素
中不能使用宏的局部变量
PS:博文仅作为个人学习笔记,如有错误欢迎指正~
更多内容详见:笔记分类导航目录