1. 程式人生 > >freemarker整合maven的簡單的應用

freemarker整合maven的簡單的應用

1.建立本地maven專案 ,在pom.xml中配置freemarker的架包

<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.0</modelVersion>  
  <groupId>cn</groupId>  
  <artifactId>fmarker</artifactId>  
  <version>0.0.1-SNAPSHOT</version>  
  <packaging>war</packaging>  
    
  <dependencies>  
    <!-- freemarker的架包 -->  
    <dependency>  
         <groupId>org.freemarker</groupId>  
         <artifactId>freemarker</artifactId>  
         <version>2.3.23</version>  
    </dependency>  
      
  </dependencies>  
</project>  

2.在webapp的web-inf下的web.xml中配置freemarker的服務

<?xml version="1.0" encoding="UTF-8"?>  
<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_2_5.xsd" version="2.5">  
  <display-name>fmarker</display-name>  
  <welcome-file-list>  
    <welcome-file>index.html</welcome-file>  
    <welcome-file>index.htm</welcome-file>  
    <welcome-file>index.jsp</welcome-file>  
    <welcome-file>default.html</welcome-file>  
    <welcome-file>default.htm</welcome-file>  
    <welcome-file>default.jsp</welcome-file>  
  </welcome-file-list>  
  <servlet>  
  <servlet-name>freemarker</servlet-name>  
  <servlet-class>freemarker.ext.servlet.FreemarkerServlet</servlet-class>  
      
  <!-- 模板的查詢路徑  從上下文根路徑查詢 模板 ftl-->  
  <init-param>  
    <param-name>TemplatePath</param-name>  
    <param-value>/</param-value>  
  </init-param>  
  <!-- 是否不需要快取 -->  
  <init-param>  
    <param-name>NoCache</param-name>  
    <param-value>true</param-value>  
  </init-param>  
  <!-- 最終顯示是html -->  
  <init-param>  
    <param-name>ContentType</param-name>  
    <param-value>text/html;charset=UTF-8</param-value>  
  </init-param>  
      
  <!-- FreeMarker settings: -->  
  <init-param>  
    <param-name>template_update_delay</param-name>  
    <param-value>0</param-value> <!-- 0 is for development only! Use higher value otherwise. -->  
  </init-param>  
  <init-param>  
    <param-name>default_encoding</param-name>  
    <param-value>UTF-8</param-value>  
  </init-param>  
  <!-- 數字的格式 -->  
  <init-param>  
    <param-name>number_format</param-name>  
    <param-value>0.##</param-value>  
  </init-param>  
  <!-- servlet 容器啟動時例項化 -->  
  <load-on-startup>1</load-on-startup>  
</servlet>  
  
<servlet-mapping>  
  <servlet-name>freemarker</servlet-name>  
  <url-pattern>*.ftl</url-pattern>  
</servlet-mapping>   
</web-app>  

3.在webapp建立一個ftl檔案,執行後可以直接在瀏覽器上輸入它的路徑

<#list 1..10 as i>  
<#if (i_index+1)%2==0>  
    <font color=red>${i}</font><br/>  
    <#else>  
    <font color=green>${i}</font><br/>  
</#if>      
</#list>  

4.應用maven ,在資料庫建立一張表用來儲存,以新聞釋出為例 ,新聞的標題 ,內容 ,HTML路徑 ,釋出時間


5.建立新聞後端上傳專案 ,在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/xsd/maven-4.0.0.xsd">  
  <modelVersion>4.0.0</modelVersion>  
  <groupId>cn</groupId>  
  <artifactId>news</artifactId>  
  <version>0.0.1-SNAPSHOT</version>  
  <packaging>war</packaging>  
  <dependencies>  
    <!-- 資料庫的架包 -->  
    <dependency>  
        <groupId>mysql</groupId>  
        <artifactId>mysql-connector-java</artifactId>  
        <version>5.1.26</version>  
    </dependency>  
    <!-- freemarker的架包 -->  
  <dependency>  
    <groupId>org.freemarker</groupId>  
    <artifactId>freemarker</artifactId>  
     <version>2.3.23</version>  
  </dependency>  
   
  </dependencies>  
  <!-- 設定字符集 -->  
  <build>  
  <plugins>  
    <plugin>  
        <groupId>org.codehaus.mojo</groupId>  
            <artifactId>tomcat-maven-plugin</artifactId>  
            <version>1.1</version>  
            <configuration>  
            <uriEncoding>UTF-8</uriEncoding>  
        </configuration>  
    </plugin>  
  </plugins>  
  </build>  
</project>  

6.在src/main/resources中配置資料的資原始檔 .properties

url=jdbc:mysql://localhost:3306/news  
drclass=com.mysql.jdbc.Driver  
userName=root  
password=123456  

7.配置呼叫資料來源的方法

package model;  
  
import java.io.IOException;  
import java.io.InputStream;  
import java.sql.Connection;  
import java.sql.DriverManager;  
import java.sql.PreparedStatement;  
import java.sql.ResultSet;  
import java.sql.ResultSetMetaData;  
import java.util.ArrayList;  
import java.util.HashMap;  
import java.util.List;  
import java.util.Map;  
import java.util.Properties;  
  
  
  
public class Dbuit {  
    static Properties p = new Properties();  
    static{  
          
        InputStream is = Dbuit.class.getResourceAsStream("/jdbc.properties");  
        try {  
            p.load(is);  
        } catch (IOException e) {  
              
            e.printStackTrace();  
        }  
    }  
/*獲取連結 
 * @return 
 *  
 */  
    public static Connection getConnection() throws Exception{  
        String url=p.getProperty("url");  
        String drclass=p.getProperty("drclass");  
        String userName=p.getProperty("userName");  
        String password=p.getProperty("password");  
        Class.forName(drclass);  
        //登入成功  
        Connection conn = DriverManager.getConnection(url,userName,password);  
          
        return conn;  
    }  
    //執行sql語句  
    public static int execute(String sql) throws Exception{  
        //連線資料庫  
        Connection con=getConnection();  
        //預編譯SQL語句  
        PreparedStatement pst=con.prepareStatement(sql);  
        //執行SQL語句  
        int i=pst.executeUpdate();  
        con.close();  
        pst.close();  
        return i;  
          
    }  
    //查詢  
    public static List<Map> query(String sql) throws Exception{  
          
        //連線資料庫  
        Connection con=getConnection();  
        //預編譯SQL語句  
        PreparedStatement pst=con.prepareStatement(sql);  
        //執行SQL語句  
        ResultSet rs=pst.executeQuery();  
        //獲取列名  
        ResultSetMetaData remd =rs.getMetaData();  
        List list=new ArrayList();  
        //獲取列的個數  
        int columnCount =remd.getColumnCount();  
      
        while(rs.next()){  
            Map map= new HashMap();  
            for(int i=1;i<=columnCount;i++){  
                //獲取列名  
                String colName=remd.getColumnName(i);  
                //獲取列值  
                String colValue=rs.getString(i);  
                map.put(colName, colValue);  
            }  
            list.add(map);  
        }  
        con.close();  
        pst.close();  
        rs.close();  
        return list;  
          
    }  
      
      
}  

8.建立新聞上傳,查詢的方法

package model;  
  
import java.util.List;  
import java.util.Map;  
  
public class Mynews {  
    //釋出新聞  
    public void inserNews(String title,String content,String newspath,String createtime) throws Exception{  
        String sql="insert into mynews(title,content,htmlpath,createtime)values('"+title+"','"+content+"','"+newspath+"','"+createtime+"')";  
        Dbuit.execute(sql);  
    }  
    //查詢新聞  
    public List<Map> queryNews() throws Exception{  
        String sql="select * from mynews";  
         return Dbuit.query(sql);  
      
    }  
      
}  

9.建立上傳新聞的頁面

<!DOCTYPE html>  
<html>  
<head>  
<meta charset="UTF-8">  
<title>Insert title here</title>  
</head>  
<body align="center">  
    <h1><font color=blue>新聞釋出</font></h1>  
    <form action="News" method="post">  
      
    標題:<input type="text" name="title"/><br/>  
    內容:<textarea rows="20" cols="100" name="content"></textarea><br/>  
    <input type="submit">  
    </form>  
</body>  
</html>  

10.controller層servlet的呼叫

package controller;  
  
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.Map;  
import java.util.UUID;  
  
import javax.servlet.ServletException;  
import javax.servlet.http.HttpServlet;  
import javax.servlet.http.HttpServletRequest;  
import javax.servlet.http.HttpServletResponse;  
  
import freemarker.template.Configuration;  
import freemarker.template.DefaultObjectWrapper;  
import freemarker.template.Template;  
import model.Mynews;  
  
/** 
 * Servlet implementation class News 
 */  
public class News extends HttpServlet {  
    private static final long serialVersionUID = 1L;  
  
    /** 
     * Default constructor.  
     */  
    public News() {  
        // TODO Auto-generated constructor stub  
    }  
    //呼叫插入,查詢的方法  
    Mynews my= new Mynews();  
    //設計時間格式  
    SimpleDateFormat sdf= new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");  
    //生成靜態HTML儲存的位置  
    public static final String HTML_DIR="E:\\html";  
    /** 
     * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response) 
     */  
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {  
        //設定字符集  
        response.setContentType("text/html;charset=UTF-8");  
        request.setCharacterEncoding("UTF-8");  
        //獲取新聞的標題  
        String title=request.getParameter("title");  
        //獲取新聞的內容  
        String content=request.getParameter("content");  
        //獲取時間  
        Date date= new Date();  
        String dates=sdf.format(date);  
        //獲取唯一的UUID  
        String uuid=UUID.randomUUID().toString();  
        try {  
          
            //生成HTML  
        Configuration config=new Configuration(Configuration.VERSION_2_3_23);    
            //模板檔案的位置  
        config.setDirectoryForTemplateLoading(new File("src/main/resources"));    
        config.setObjectWrapper(new DefaultObjectWrapper(Configuration.VERSION_2_3_23));  
        //把值注入HTML  
        Map root = new HashMap();  
        root.put("title", title);  
        root.put("content", content);  
        root.put("createtime", dates);  
        ////載入模板檔案  -- 例項化模板物件  
        Template temp =config.getTemplate("news.ftl");  
       //檔案的儲存路徑  
        String sa=HTML_DIR+"/"+(uuid)+".html";  
        Writer out =new OutputStreamWriter(new FileOutputStream(sa));    
        //檔案的輸出  
        temp.process(root, out);    
        out.flush();   
        out.close();  
        //新聞上傳到資料庫  
        my.inserNews(title, content, (uuid) + ".html", dates);  
        response.getWriter().println("釋出成功...");  
        } catch (Exception e) {  
              
            e.printStackTrace();  
        }  
    }  
  
    /** 
     * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response) 
     */  
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {  
          
        doGet(request, response);  
    }  
  
}  

11.新聞的模板

<div style="text-align:center;"><h1><font color=red>${title}</font><br/></h1></div>  
  ${createtime}<br/>  
  ${content}  

12.建立前端freemarker專案,在本地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/xsd/maven-4.0.0.xsd">  
  <modelVersion>4.0.0</modelVersion>  
  <groupId>cn</groupId>  
  <artifactId>new</artifactId>  
  <version>0.0.1-SNAPSHOT</version>  
  <packaging>war</packaging>  
  <dependencies>  
    <!-- 配置資料庫的架包 -->  
    <dependency>  
        <groupId>mysql</groupId>  
        <artifactId>mysql-connector-java</artifactId>  
        <version>5.1.26</version>  
    </dependency>  
    <!-- 配置freemarker的架包 -->  
  <dependency>  
      <groupId>org.freemarker</groupId>  
      <artifactId>freemarker</artifactId>  
      <version>2.3.23</version>  
  </dependency>  
  <!-- 配置commons-io的架包 -->  
  <dependency>  
     <groupId>org.apache.commons</groupId>  
     <artifactId>commons-io</artifactId>  
     <version>1.3.2</version>  
</dependency>  
  </dependencies>  
  <!-- 設定字符集 -->  
  <build>  
  <plugins>  
    <plugin>  
        <groupId>org.codehaus.mojo</groupId>  
        <artifactId>tomcat-maven-plugin</artifactId>  
        <version>1.1</version>  
        <configuration>  
        <uriEncoding>UTF-8</uriEncoding>  
        </configuration>  
    </plugin>  
  </plugins>  
  </build>  
</project>  

13.配置連線資料庫的四要素,在src/main/resources中建立 .properties檔案

url=jdbc:mysql://localhost:3306/news  
drclass=com.mysql.jdbc.Driver  
userName=root  
password=123456  

14.呼叫封裝jdbc的方法類

package model;  
  
import java.io.IOException;  
import java.io.InputStream;  
import java.sql.Connection;  
import java.sql.DriverManager;  
import java.sql.PreparedStatement;  
import java.sql.ResultSet;  
import java.sql.ResultSetMetaData;  
import java.util.ArrayList;  
import java.util.HashMap;  
import java.util.List;  
import java.util.Map;  
import java.util.Properties;  
  
  
  
public class Dbuit {  
    static Properties p = new Properties();  
    static{  
          
        InputStream is = Dbuit.class.getResourceAsStream("/jdbc.properties");  
        try {  
            p.load(is);  
        } catch (IOException e) {  
              
            e.printStackTrace();  
        }  
    }  
/*獲取連結 
 * @return 
 *  
 */  
    public static Connection getConnection() throws Exception{  
        String url=p.getProperty("url");  
        String drclass=p.getProperty("drclass");  
        String userName=p.getProperty("userName");  
        String password=p.getProperty("password");  
        Class.forName(drclass);  
        //登入成功  
        Connection conn = DriverManager.getConnection(url,userName,password);  
          
        return conn;  
    }  
      
    //執行sql  
    public static int execute(String sql) throws Exception{  
        //連線資料庫  
        Connection con=getConnection();  
        //預編譯SQL語句  
        PreparedStatement pst=con.prepareStatement(sql);  
        //執行SQL語句  
        int i=pst.executeUpdate();  
        con.close();  
        pst.close();  
        return i;  
          
    }  
    //查詢  
    public static List<Map> query(String sql) throws Exception{  
          
        //連線資料庫  
        Connection con=getConnection();  
        //預編譯SQL語句  
        PreparedStatement pst=con.prepareStatement(sql);  
        //執行SQL語句  
        ResultSet rs=pst.executeQuery();  
        //獲取列名  
        ResultSetMetaData remd =rs.getMetaData();  
        List list=new ArrayList();  
        //獲取列的個數  
        int columnCount =remd.getColumnCount();  
      
        while(rs.next()){  
            Map map= new HashMap();  
            for(int i=1;i<=columnCount;i++){  
                //獲取列名  
                String colName=remd.getColumnName(i);  
                //獲取列值  
                String colValue=rs.getString(i);  
                map.put(colName, colValue);  
            }  
            list.add(map);  
        }  
        con.close();  
        pst.close();  
        rs.close();  
        return list;  
          
    }  
      
      
}  

15.建立查詢新聞的方法

package model;  
  
import java.util.List;  
import java.util.Map;  
  
public class Mynews {  
      
    //查詢  
    public List<Map> queryNews() throws Exception{  
        String sql="select * from mynews";  
         return Dbuit.query(sql);  
      
    }  
      
}  


16.重新整理新聞頁面

package main;  
  
import java.util.Timer;  
  
public class Index {  
    public static void main(String[] args) {  
        Timer ti= new Timer();  
        //new執行任務,執行時間,執行第一次之後多少時間之後執行下一次  
        ti.schedule(new MyTimerTask(), 1000,5000);  
    }  
}  

17.生成前端模板

<#list List as new>  
<#-- 首頁顯示新聞的連線與標題-->  
<a href="new?path=${new.htmlpath}">${new.title}</a><br/>  
</#list> 

18.生成前端首頁

package main;  
  
import java.io.File;  
import java.io.FileOutputStream;  
import java.io.OutputStreamWriter;  
import java.io.Writer;  
import java.util.HashMap;  
import java.util.List;  
import java.util.Map;  
import java.util.TimerTask;  
  
import freemarker.template.Configuration;  
import freemarker.template.DefaultObjectWrapper;  
import freemarker.template.Template;  
import model.Mynews;  
  
public class MyTimerTask extends TimerTask{  
    //呼叫查詢的方法  
    Mynews my= new Mynews();  
  
    public void run(){  
        try {  
            // 生成html  
            Configuration cfg = new Configuration(Configuration.VERSION_2_3_23);  
            //模板檔案的位置  
            cfg.setDirectoryForTemplateLoading(new File("src/main/resources"));  
            cfg.setObjectWrapper(new DefaultObjectWrapper(Configuration.VERSION_2_3_23));  
            //獲取所有的新聞  
            List<Map> result=my.queryNews();  
            Map root = new HashMap();  
            root.put("List", result);  
              //載入模板檔案  -- 例項化模板物件  
            Template temp = cfg.getTemplate("index.ftl");  
            //生成首頁頁面的位置  
            String saveFile =  "src/main/webapp/index.html";  
            //寫入內容  
            Writer out = new OutputStreamWriter(new FileOutputStream(saveFile));  
            temp.process(root, out);  
            out.flush();  
            out.close();  
        } catch (Exception e) {  
            e.printStackTrace();  
        }  
    }  
}  

19 讀取新聞的內容

package main;  
  
import java.io.File;  
import java.io.IOException;  
  
import javax.servlet.ServletException;  
import javax.servlet.http.HttpServlet;  
import javax.servlet.http.HttpServletRequest;  
import javax.servlet.http.HttpServletResponse;  
  
import org.apache.commons.io.FileUtils;  
  
/** 
 * Servlet implementation class NewServler 
 */  
public class NewServler extends HttpServlet {  
    private static final long serialVersionUID = 1L;  
  
    /** 
     * Default constructor.  
     */  
    public NewServler() {  
        // TODO Auto-generated constructor stub  
    }  
    //新聞儲存的位置  
    public static final String HTML_DIR = "E:\\html\\";  
    /** 
     * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response) 
     */  
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {  
        //獲取模板傳過來的連線路徑  
        String path=request.getParameter("path");  
        //完整的檔案儲存路徑  
        String abs=HTML_DIR+path;  
        //讀取儲存的新聞內容  
        byte[] bt=FileUtils.readFileToByteArray(new File(abs));  
        //輸出到首頁連線  
        response.getOutputStream().write(bt);  
    }  
  
    /** 
     * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response) 
     */  
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {  
        // TODO Auto-generated method stub  
        doGet(request, response);  
    }  
  
}  

20.啟動後臺釋出新聞專案,在執行前臺新聞首頁