freeMarker生成静态页面

项目结构图

footer.ftl

des==>${f.des}<br/>

<a href="http://www.baidu.com"> 百度 </a>

header.ftl

companyName==>${h.companyName}<br/>
address==>${h.address}<br/>

notice.ftl

<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">

  <body>
  <#include "header.ftl" parse=true encoding="utf-8">
  <hr/>

亲爱的${data.recipient}:

  您好!

  请查看如下通知:
  ${data.content}

  感谢您的阅读!

- ${data.publisher}
- ${data.dateTime}

  <hr/>
  <a href="#">用户列表</a><br/>
  <table border="1">
      <tr>
          <td>用户名</td>
          <td>年龄</td>
          <td>生日</td>
          <td>id</td>
          <td>操作</td>
      </tr>
      <#list users as user>
          <tr>
              <td>${user.name}</td>
              <td>${user.age}</td>
              <td>
              ${user.birthday?string("yyyy-MM-dd HH:mm:ss")}
              </td>
              <td>${user.id}</td>
              <td><a href="#">删除</a></td>
          </tr>
      </#list>

  </table>
<hr/>

<hr/>
  <#include "footer.ftl" parse=true encoding="utf-8">

</body>
</html>

Footer.java

package com.shm.entity;

public class Footer {

    private String des;

    public String getDes() {
        return des;
    }

    public void setDes(String des) {
        this.des = des;
    }

}

Header.java

package com.shm.entity;
public class Header {

    private String companyName;

    private String address;

    public String getCompanyName() {
        return companyName;
    }

    public void setCompanyName(String companyName) {
        this.companyName = companyName;
    }

    public String getAddress() {
        return address;
    }

    public void setAddress(String address) {
        this.address = address;
    }

}

Notice.java

package com.shm.entity;

public class Notice {
    private String recipient;
    private String content;
    private String publisher;
    private String dateTime;
    public String getRecipient() {
        return recipient;
    }
    public void setRecipient(String recipient) {
        this.recipient = recipient;
    }
    public String getContent() {
        return content;
    }
    public void setContent(String content) {
        this.content = content;
    }
    public String getPublisher() {
        return publisher;
    }
    public void setPublisher(String publisher) {
        this.publisher = publisher;
    }
    public String getDateTime() {
        return dateTime;
    }
    public void setDateTime(String dateTime) {
        this.dateTime = dateTime;
    }

}

User.java

package com.shm.entity;

import java.util.Date;

public class User {

    private Integer id;

    private String name ;

    private int age;

    private Date birthday;

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }

    public Date getBirthday() {
        return birthday;
    }

    public void setBirthday(Date birthday) {
        this.birthday = birthday;
    }

    public Integer getId() {
        return id;
    }

    public void setId(Integer id) {
        this.id = id;
    }

    public User(Integer id,String name, int age, Date birthday) {
        super();
        this.name = name;
        this.age = age;
        this.birthday = birthday;
        this.id = id;
    }

    public User() {
        super();
    }

}

DirectoryFilter.java

package com.shm.util;

import java.io.File;
import java.io.FilenameFilter;
public class DirectoryFilter implements FilenameFilter {

    String myString;
    public DirectoryFilter(String myString)
    {
        this.myString = myString;
    }

    public boolean accept(File dir,String name)
    {    //FilenameFilter.accept(File dir, String name)
       // 测试指定文件是否应该包含在某一文件列表中。
        String f= new File(name).getName();
        if(f.contains(myString) || f.equals(myString)){
            return true;
        }
        return false;
    }

}
FreeMarkerUtil工具类
package com.shm.util;

import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStreamWriter;
import java.io.Writer;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import com.shm.entity.Footer;
import com.shm.entity.Header;
import com.shm.entity.Notice;
import com.shm.entity.User;

import freemarker.template.Configuration;
import freemarker.template.DefaultObjectWrapperBuilder;
import freemarker.template.Template;
import freemarker.template.Version;
import service.FooterService;
import service.HeaderService;
import service.UserService;

public class FreeMarkerUtil {

    public static final String CHARSET_UTF8 = "UTF-8";

    public static Version version = Configuration.VERSION_2_3_25; //FreeMarker版本号
    public static Configuration config;

    // 模板对象
    public static Template template;

    public static DefaultObjectWrapperBuilder defaultObjectWrapperBuilder;

    // 创建 Configuration 对象
    static {
        config = new Configuration(version);
        config.setDefaultEncoding(CHARSET_UTF8);// 设置默认编码 (至关重要 - 解决中文乱码问题)
        defaultObjectWrapperBuilder = new DefaultObjectWrapperBuilder(version); //用于创建defaultObjectWrapper
        config.setObjectWrapper(defaultObjectWrapperBuilder.build()); // 设置对象包装器
    }

    /**
     * 拼接内容数据
     * @param dataMap
     * @return
     */
    public static Map<String, Object> processBody(Map<String, Object> dataMap){
        Header h = HeaderService.getHeader();
        dataMap.put("h", h);
        Footer f = FooterService.gerFooter();
        dataMap.put("f", f);
        List<User> users = UserService.getUsers();
        dataMap.put("users", users);
        return dataMap;
    }

    /**
     * 根据template和dataMap生成文档内容
     * @param templatePath 模板路径
     * @param templateName 模板文件名称
     * @param templateName 生成的文件存放路径
     * @param templateName 生成的文件名称
     * @param templateName 是否强制覆盖已存在的文件
     * @param dataMap 需要填充的数据
     * @return
     */
    public static String buildContent(final String templatePath, final String templateName, final String filePath, final String fileName, final boolean forceCovered, final Map<String, Object> dataMap) {
        Writer out = null;
        try    {
            //判断是否强制覆盖,如果是不覆盖则要检查该目录下是否已存在该文件
            if(!forceCovered){
                File path = new File(filePath);
                //判断是否已经存在该html文件
                String[] indexfileList = path.list(new DirectoryFilter(fileName));
                if(indexfileList == null || indexfileList.length == 0) {

                } else {
                    return filePath + "目录下已存在" + indexfileList[0];
                }
            }

            // 设置要解析的模板所在的目录,并加载模板文件
            config.setDirectoryForTemplateLoading(new File(templatePath));

            // 从模板目录下获取指定 ftl 模板文件
            Template template = config.getTemplate(templateName, CHARSET_UTF8);

            //生成引入的ftl中header与footer的数据
            processBody((Map<String, Object>) dataMap);

            /*// 字符串 字符输出流
            final StringWriter stringWriter = new StringWriter();
            final BufferedWriter bufferedWriter = new BufferedWriter(stringWriter);
             // 把 数据源写到模板中
            template.process(dataMap, bufferedWriter);

            // 刷新
            bufferedWriter.flush();
            // 关闭输出流
            bufferedWriter.close();

            // 获取输出的文本 (调用其 toString方法获得String)
            System.out.print(stringWriter.toString());*/

            // 合并数据模型与模板
            //html生成之后存放的路径
            out = new OutputStreamWriter(new FileOutputStream(filePath + "/" + fileName), CHARSET_UTF8);
            template.process(dataMap, out);

        } catch (Exception e) {
            e.printStackTrace();
            return "生成文件发生异常";
        } finally {
            if(out != null){
                try {
                    out.flush();
                    out.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }
        return "生成文件成功";
    }

    //测试
    public static void main(String[] args) {
        Notice notice = new Notice();
        notice.setRecipient("张三");
        notice.setPublisher("系统管理员");
        notice.setContent("这是通知内容,请记住。\n不要问我是谁!");
        SimpleDateFormat df = new SimpleDateFormat("yyyy年MM月dd日 HH时mm分ss秒");
        notice.setDateTime(df.format(new Date()));

        Map<String, Object> dataMap = new HashMap<String, Object>();
        dataMap.put("data", notice);

        String result = FreeMarkerUtil.buildContent("E:/templates", "notice.ftl", "E:/templates", "notice.html", false, dataMap);
        System.out.println(result);
    }
}

FooterService.java

package service;

import com.shm.entity.Footer;

public class FooterService {

    private static Footer f = new Footer();
    static{
        f.setDes("上海-哈哈!!!");
    }

    public static void update(String des){
        f.setDes(des);
    }

    public static Footer gerFooter(){
        return f;
    }
}

HeaderService.java

package service;

import com.shm.entity.Header;

public class HeaderService {

    private static Header h = new Header();

    static{
        h.setAddress("上海CBD");
        h.setCompanyName("上海!!!");
    }

    public static void update(String address,String companyName){
        h.setAddress(address);
        h.setCompanyName(companyName);
    }

    public static Header getHeader(){
        return h;
    }
}

UserService.java

package service;

import java.util.ArrayList;
import java.util.Date;
import java.util.List;

import com.shm.entity.User;

public class UserService {

    private static List<User> users = new ArrayList<User>();

    static{
        for(int i=0;i<10;i++){
            User u = new User(i,"ajun"+i,i+10,new Date());
            users.add(u);
        }
    }

    public static List<User> getUsers(){
        return users;
    }

    public static void delete(int index){
        for(int i=0 ;i<users.size();i++){
            User u = users.get(i);
            if(u.getId()==index){
                users.remove(u);
                //users.remove(index);
            }
        }
    }
}

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/maven-v4_0_0.xsd">
  <modelVersion>4.0.0</modelVersion>
  <groupId>com.shm</groupId>
  <artifactId>freeMarkerTest</artifactId>
  <packaging>war</packaging>
  <version>0.0.1-SNAPSHOT</version>
  <name>freeMarkerTest Maven Webapp</name>
  <url>http://maven.apache.org</url>
  <dependencies>
            <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <version>4.12</version>
            <scope>test</scope>
        </dependency>

        <dependency>
            <groupId>org.freemarker</groupId>
            <artifactId>freemarker</artifactId>
            <version>2.3.25-incubating</version>
        </dependency>

  </dependencies>
  <build>
    <finalName>freeMarkerTest</finalName>
  </build>
</project>
时间: 2024-08-21 12:28:49

freeMarker生成静态页面的相关文章

使用freemarker生成静态页面

一 说明 需要在spring mvc项目中加入下列包: <dependency> <groupId>org.freemarker</groupId> <artifactId>freemarker</artifactId> <version>${freemarker.version}</version> </dependency> 如果你还想使用freemarker实现表现层,那么还需要导入下列包: <de

通过FreeMarkerclasspath加载方式生成静态页面

package htmlskin; import java.io.BufferedWriter; import java.io.File; import java.io.FileNotFoundException; import java.io.FileOutputStream; import java.io.IOException; import java.io.OutputStreamWriter; import java.io.Writer; import java.util.Calend

freemark生成静态页面

到freemark的官方网站下载: http://sourceforge.net/projects/freemarker/files/freemarker/2.3.20/freemarker-2.3.20.tar.gz/download 建一个web project,如下: 建成的项目结构如下: 模板文件如下(test.ftl): <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> <html

过滤器为JSP文件生成静态页面

用过滤器为JSP文件生成静态页面,这只是一个简单的实例,客户端浏览器第一次请求JSP页面时,服务器将生成对应的HTML文件,以后访问同一JSP文件,将转为访问生成的HTML文件.一.过滤器 package com.kenfor.lyb.toHtmlfilter; import java.io.*; import java.io.IOException; import java.text.SimpleDateFormat; import java.util.Date; import javax.s

C#根据网址生成静态页面

HoverTree开源项目中HoverTreeWeb.HVTPanel的Index.aspx文件 是后台管理的首页. 包含生成留言板首页,以及显示用户名,退出等功能. 根据网址生成页面的方法: bool CreateHtmlFile(string url, string path) { //http://keleyi.com/a/bjae/3d10wfax.htm string m_content = Utils.GetHtmlByUrl(Utils.GetAbsolutePath() + ur

PHP代码为什么不能直接保存HTML文件——&gt;PHP生成静态页面教程

1.服务器会根据文件的后缀名去进行解析,如果是HTML文件则服务器不会进行语法解析,而是直接输出到浏览器. 2.如果一个页面中全部都是HTML代码而没有需要解析的PHP语法,则没有必要保存为PHP文件,这样反而会降低运行效率. 3.如果是需要PHP控制HTML代码的输出,比如需要PHP判断用户是否登陆,如果登陆则输出A,未登录则输出B.这就需要PHP来进行控制了.HTML不能实现这样的功能 PHP生成静态页面教程 ,一些基本的概念 一,PHP脚本与动态页面. PHP脚本是一种服务器端脚本程序,可

html模板生成静态页面及模板分页处理

它只让你修改页面的某一部分,当然这“某一部分”是由你来确定的.美工先做好一个页面,然后我们把这个页面当作模板(要注意的是这个模板就没必要使用EditRegion3这样的代码了,这种代码是Dreamwerver为了方便自己设计而弄的标识),把这个模板中我们需要改变的地方用一个与HTML可以区分的字符代替,如“{title}”.“[title]”.在生成静态页面的时候只需要把数据和这些字符串替换即可.这就是模板的含义了. 新建一个php页面和一个html页面[模板页];注:如果是从数据库调用数据,则

PHP生成静态页面的方法

在PHP网站开发中为了网站推广和SEO等需要,需要对网站进行全站或局部静态化处理,PHP生成静态HTML页面有多种方法,比如利用PHP模板.缓存等实现页面静态化,今天就以PHP实例教程形式讨论PHP生成静态页面的方法...."><LINKhref="http://www.php100.com//statics/st 在PHP网站开发中为了网站推广和SEO等需要,需要对网站进行全站或局部静态化处理,PHP生成静态HTML页面有多种方法,比如利用PHP模板.缓存等实现页面静态化

比较详细PHP生成静态页面教程

一,PHP脚本与动态页面. PHP脚本是一种服务器端脚本程序,可通过嵌入等方法与HTML文件混合, 也可以类,函数封装等形式,以模板的方式对用户请求进行处理.无论以何种方式,它的基本原理是这样的.由客户端提出请求,请求某一页面 -----> WEB服务器引入指定相应脚本进行处理 -----> 脚本被载入服务器 -----> 由服务器指定的PHP解析器对 脚本进行解析形成HTML语言形式 ----> 将解析后的HTML语句以包的方式传回给浏览器.由此不难看出,在页面发送到浏览器后,P