Freemark----基本数据类型(对象)

来源:互联网 发布:北京seo博客 编辑:程序博客网 时间:2024/09/21 06:34

关于Freemark的原理:

                                               模板引擎  +   数据     ------------------>   页面输出





一、什么是模板引擎,为什么要用模板引擎

B/S程式设计中,常常有美工和程序员二个角色,他们具有不同专业技能:美工专注于表现——创建页面、风格、布局、效果等等可视元素;而程序员则忙于创建程式的商业流程,生成设计页面要显示的数据等等。

很多时候,要显示的资料在设计的时候并不存在,它们一般是在运行时由程式产生的,比如执行价格不高于800NTUSB Disk”查询的返回结果。这种技术需求产生了JSPScriptletJSP十分强大,但是也常常被滥用,并导致一些不良的后果

  1. 将逻辑和表现混合在一起。
  2. 破坏了美工和程序员职责的正常分解。
  3. 使JSP页面难以阅读和维护。

模板引擎就是为了解决上面的问题而产生的。在设计HTML的时候,我们加入一些特定指令来指定要插入哪些数据,这些加了特殊指令的HTML或者其他文本,我们称为模板(Template)。而模板引擎会在输出页面时,用适当的数据替代这些代码。

模板和嵌入JSPHTML是不同的,模板指令只有很有限的编程能力,可以避免混入商业逻辑。


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")@Beforepublic void init() {configuration = new Configuration();try {configuration.setDirectoryForTemplateLoading(new File("F://Users/Maven/freemarker/src/main/webapp/freemark"));} catch (IOException e) {e.printStackTrace();}}@Testpublic 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;} }

0 0