freemarker整合maven的簡單的應用
阿新 • • 發佈:2018-11-09
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.啟動後臺釋出新聞專案,在執行前臺新聞首頁