概述
关于Freemark的原理:
模板引擎 + 数据 ------------------> 页面输出
一、什么是模板引擎,为什么要用模板引擎
在B/S程式设计中,常常有美工和程序员二个角色,他们具有不同专业技能:美工专注于表现——创建页面、风格、布局、效果等等可视元素;而程序员则忙于创建程式的商业流程,生成设计页面要显示的数据等等。
很多时候,要显示的资料在设计的时候并不存在,它们一般是在运行时由程式产生的,比如执行“价格不高于800NT的USB Disk”查询的返回结果。这种技术需求产生了JSP等Scriptlet,JSP十分强大,但是也常常被滥用,并导致一些不良的后果
- 将逻辑和表现混合在一起。
- 破坏了美工和程序员职责的正常分解。
- 使JSP页面难以阅读和维护。
模板引擎就是为了解决上面的问题而产生的。在设计HTML的时候,我们加入一些特定指令来指定要插入哪些数据,这些加了特殊指令的HTML或者其他文本,我们称为模板(Template)。而模板引擎会在输出页面时,用适当的数据替代这些代码。
模板和嵌入JSP的HTML是不同的,模板指令只有很有限的编程能力,可以避免混入商业逻辑。
FreeMarker缺点:
1. 性能没有Velocity高,学习起来没有Velocity简单
2. 需要花费时间重新学习
3. FreeMarker中不能读取值为null的变量,会报错,必须要设置默认值或者判断
4. 模板修改之后,如果没有更新模板生成的HTML,会看到过期的页面
5. MyEclipseIDE插件的效果不太好
环境Maven,需要freemark.jar,pom文件如下:
<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/maven-v4_0_0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.lgy</groupId>
<artifactId>freemarker</artifactId>
<packaging>war</packaging>
<version>0.0.1-SNAPSHOT</version>
<name>freemarker Maven Webapp</name>
<url>http://maven.apache.org</url>
<dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.10</version>
<scope>test</scope>
</dependency>
<!-- servlet,jsp -->
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>servlet-api</artifactId>
<version>2.4</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>javax.servlet.jsp</groupId>
<artifactId>jsp-api</artifactId>
<version>2.0</version>
<scope>provided</scope>
</dependency>
<!-- freemark -->
<dependency>
<groupId>org.freemarker</groupId>
<artifactId>freemarker</artifactId>
<version>2.3.22</version>
</dependency>
</dependencies>
<build>
<finalName>freemarker</finalName>
</build>
</project>
步骤:
1.编写模板文件:
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>freemark 测试</title>
</head>
<body>
${person.id!"aaa"}
<!-- 如果为null则打印aaa -->
-----------------------------------------------<br />
<#if person.id??>
<!-- if else语句
(person.id=null) -->
wo qu
<#else>
yufa piaoyi
</#if>
-----------------------------------------------<br />
<#if person.flag>
<!-- if else语句
(person.flah=true) -->
ye li shame
</#if>
------------------------------------------------<br />
<#switch person.username>
<#case "aa">
1
<#break>
<#case "hahah">
2
<#break>
<#default>
3
</#switch>
</body>
</html>
说明:person为一个对象
package com.lgy.entry;
public class Person {
private Integer id;
private String username;
private String password;
private Boolean flag = true;
public Boolean getFlag() {
return flag;
}
public void setFlag(Boolean flag) {
this.flag = flag;
}
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
}
第二步(核心代码说明):
package com.lgy.test;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStreamWriter;
import java.util.HashMap;
import java.util.Map;
import org.junit.Before;
import org.junit.Test;
import com.lgy.entry.Person;
import freemarker.template.Configuration;
import freemarker.template.Template;
import freemarker.template.TemplateException;
/*
* 模板
+
数据
=
输出
*/
public class FreeMarkerTest {
private Configuration configuration;
@SuppressWarnings("deprecation")
@Before
public void init() {
configuration = new Configuration();
try {
configuration.setDirectoryForTemplateLoading(new File("F://Users/Maven/freemarker/src/main/webapp/freemark"));
} catch (IOException e) {
e.printStackTrace();
}
}
@Test
public void FreemarkTest() {
OutputStreamWriter out = null;
File file = new File("F://Users/Maven/freemarker/src/main/webapp/index.html");
//创建一个合适的Configration对象
try {
out =
new OutputStreamWriter(new FileOutputStream(file));
//创建模版对象
Template t = configuration.getTemplate("index-string.html");
Person person = new Person();
person.setUsername("hahah");
//构造填充数据的Map
Map<String, Object> map = this.getData("person", person);
//在模版上执行插值操作,并输出到制定的输出流中
t.process(map, out);
out.close();
System.out.println("生产完成");
} catch (IOException e) {
e.printStackTrace();
} catch (TemplateException e) {
e.printStackTrace();
} finally {
if(out != null) {
try {
out.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
public Map<String, Object> getData(String key, Object value) {
Map<String, Object> map = new HashMap<String, Object>();
map.put(key, value);
return map;
}
}
最后
以上就是顺心机器猫为你收集整理的Freemark----基本数据类型(对象)的全部内容,希望文章能够帮你解决Freemark----基本数据类型(对象)所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复