FreeMarker
是一款模板引擎: 即一种基于模板和要改变的数据, 并用来生成输出文本(HTML网页、电子邮件、配置文件、源代码等)的通用工具。 它不是面向最终用户的,而是一个Java类库,是一款程序员可以嵌入他们所开发产品的组件。
FreeMarker
是免费的,基于Apache许可证2.0版本发布。其模板编写为FreeMarker Template Language(FTL
),属于简单、专用的语言。需要准备数据在真实编程语言中来显示,比如数据库查询和业务运算, 之后模板显示已经准备好的数据。在模板中,主要用于如何展现数据, 而在模板之外注意于要展示什么数据 [1] 。
<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.0modelVersion>
<groupId>com.springmvcgroupId>
<artifactId>springmvc-freemarkerartifactId>
<version>0.0.1-SNAPSHOTversion>
<packaging>warpackaging>
<properties>
<spring.version>4.3.17.RELEASEspring.version>
<servlet.version>3.1.0servlet.version>
<freemarker.version>2.3.23freemarker.version>
properties>
<dependencies>
<dependency>
<groupId>org.springframeworkgroupId>
<artifactId>spring-webmvcartifactId>
<version>${spring.version}version>
dependency>
<dependency>
<groupId>org.springframeworkgroupId>
<artifactId>spring-context-supportartifactId>
<version>${spring.version}version>
dependency>
<dependency>
<groupId>javax.servletgroupId>
<artifactId>javax.servlet-apiartifactId>
<version>${servlet.version}version>
dependency>
<dependency>
<groupId>org.freemarkergroupId>
<artifactId>freemarkerartifactId>
<version>${freemarker.version}version>
dependency>
dependencies>
project>
这里主要是springmvc的配置,不清楚的可以去看我的另两篇文章
《走向单体地狱(八):Spring MVC》
《Spring MVC 的 xml 配置详解》
<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>springDispatcherServletservlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServletservlet-class>
<init-param>
<param-name>contextConfigLocationparam-name>
<param-value>classpath:springmvc_freemarker.xmlparam-value>
init-param>
<load-on-startup>1load-on-startup>
servlet>
<servlet-mapping>
<servlet-name>springDispatcherServletservlet-name>
<url-pattern>/*url-pattern>
servlet-mapping>
web-app>
在SpringMVC
中整合Freemarker
的具体配置
<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"/>
<mvc:annotation-driven/>
<bean class="org.springframework.web.servlet.view.BeanNameViewResolver">
<property name="order" value="1" />
bean>
<bean id="freeMarkerConfigurer" class="org.springframework.web.servlet.view.freemarker.FreeMarkerConfigurer">
<property name="templateLoaderPath" value="/WEB-INF/view/">property>
<property name="defaultEncoding" value="utf-8" />
<property name="freemarkerSettings">
<props>
<prop key="template_update_delay">0prop>
<prop key="locale">zh_CNprop>
<prop key="datetime_format">yyyy-MM-ddprop>
<prop key="date_format">yyyy-MM-ddprop>
<prop key="number_format">#.##prop>
props>
property>
bean>
<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" />
<property name="allowSessionOverride" value="false" />
<property name="allowRequestOverride" value="false" />
<property name="exposeSpringMacroHelpers" value="true" />
<property name="exposeRequestAttributes" value="true" />
<property name="exposeSessionAttributes" value="true" />
bean>
beans>
创建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;
}
}
在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";
}
}
在上文配置好的路径/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}
访问http://localhost:8080/user/info
显示如下结果既为成功
源码 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
Freemarker
是区分大小写的 ,
标签 | 说明 |
---|---|
${} |
插入标签,输出内部的变量,字符串,数字等值 |
${name} |
变量 |
${"aa"} |
字符串 |
<#...> |
ftl的tags标签 |
<#include "inc/sidebar.ftl"> |
包含一段文本 |
<#assign seq = ["foo", "bar", "baz"]> |
创建一个变量 |
<@...> |
用户的自定义标签<@EventTabNav activeIndex=2 /> |
|
和html相同的标签 |
<#list forumInfos as f>
<#if o.order.state == 20 && o.order.activityStyleClassPayType == 'O'>
1
<#elseif o.order.state == 0>
2
#if>
<#include "inc/cfg.ftl">
标签 | 说明 |
---|---|
?? |
判断左侧的变量是否丢失返回布尔值,相当于java中的null的判断, |
?has_content |
?has_content 非常像?? ,但是它同时也会对空字符串或空list 或空map 进行判断 |
! |
用来给变量一个默认值,例如color!”no color” |
?if_exists |
是??的老写法,现在不推荐使用。 |
例子:
?,如果不存在返回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}
数列[2,3,4,5],类似js数组
2..5 类比[2,3,4,5]内存占用更少更快
5..2 类比[5,4,3,2]
[1+1,[1,2,3],"three"] 可以进行内嵌
哈希表
拼接<#assign age = {“jack”:20}+{“jack”:30,“lucy”:27}>
拼接后重复的值取决于最右边的哈希表{“jack”:30,“lucy”:27}
<#macro greet person color>
<font size="2" color="${color}">hello ${person}font>
#macro>
使用宏
<@greet person="lilei" color="red"/>
<#macro greet person color="yellow">
<font size="2" color="${color}">hello ${person}font>
#macro>
使用宏
使用时必须给全部的参数赋值,要么在定义时设置初始值,否则会报错
<@greet person="lilei"/>
<#macro greet color>
<font size="2" color="${color}">
<#nested>
<#nested>
font>
#macro>
使用宏
<@greet color="red">
hello world
@greet>
结果
<#nested>
代表使用时标签内的嵌套的内容,可以像上面那样被多次调用,在内嵌元素
中不能使用宏的局部变量
PS:博文仅作为个人学习笔记,如有错误欢迎指正~
更多内容详见:笔记分类导航目录