zoukankan      html  css  js  c++  java
  • 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("这是通知内容,请记住。
    不要问我是谁!");
            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>
  • 相关阅读:
    lua与C++的绑定
    lua与C的绑定
    如何得到真实的需求?
    mysql学习笔记——对数据库的操作
    排列组合公式
    英语口语积累笔记
    初学C++-----------------类的组合
    初学C++-----------------类的拷贝构造函数
    初学C++-----------------类的构造函数、析构函数
    初学C++-----------------类的定义
  • 原文地址:https://www.cnblogs.com/shihaiming/p/6257235.html
Copyright © 2011-2022 走看看