java-word-MassProduction
目錄
一.使用方法
1.制造題庫所需Word模板
需要填充數據的地方使用 ${pid} 代替。
將這個word選擇另存為,保存格式選擇為xml,然后將這個xml放到項目的ftl目錄下,后綴名改為.ftl 。
2.配置數據庫
項目中使用了hibernate,表結構可以自動生成,但前提得先有mysql數據庫環境且創建好數據庫,數據庫連接信息可以在hibernate.hbm.xml中修改。
對應上面模板實例中的${pid}值,在對應數據庫中選擇題目寫入。
3.運行程序
在程序中選擇要使用的word模板.
寫入輸出的word名稱.
點擊生成后,在項目word目錄下:
當然也可以在數據庫中導入大量題目,在導入時隨機選擇題目,然后對應相應的pid生成模板。
二.開發流程
1.題目模型
數據庫使用了hibernate,hibernate的相關知識不再做解釋.
Problem中定義了一道題目的信息。
id數據庫主鍵索引.
pid對應word模板的${id}.
title對應了題目的內容。
IProblemDAO是一個接口,用來實現題目的增刪改查.
public interface IProblemDAO {
void save(Problem problem);
void update(Problem problem);
void delete(Problem problem);
Problem get(Integer id);
List<Problem> listAll();
}
ProblemDAOImpl實現了IProblemDAO接口.
hibernate的save,delete,update,get等不再闡述.
ProblemDAOImpl的實現中我們使用到的其實只有listAll()方法。至於其他的暫時用不到。
2.Word生成
這里主要用到了一個叫freemarker的第三方包。
1.什么是FreeMarker?
FreeMarker是一款模板引擎,一種開源的、基於模板的、用來生成/輸出文本的通用工具。
它不是面向最終用戶的,不是Web應用框架,它是Java的一個類庫,是Web應用框架中的一個實用的組件,是一款可以嵌入開發產品的一款應用程序。
FreeMarker的設計是被用來生成HTML頁面,尤其是通過基於實現了MVC模式的Servlet應用程序。
使用MVC模式的動態網頁的構思,使得你可以將前端設計從程序中分離出來,更加貼合java的各司其職的編程思想,使得代碼更簡潔且便於維護。
盡管FreeMarker也有編程能力,但它也不像PHP那樣的一種全面的編程語言。
一般我們只使用FreeMarker的模板生成個文本來呈現早已准備好的數據,它僅僅來生成文本,它也非常適用於非 Web應用環境的開發。
要注意的是,我們使用FreeMarker作為視圖層組件,是為給如 Struts這樣的 Model2框架提供現成的解決方案,已經在一定情況下提高頁面的響應速度。
2.FreeMaker的作用:頁面靜態化
a)JavaEEWeb 開發存在的問題:動態網頁技術創建的網頁相率低,需要把這些動態網頁轉換成靜態網頁,節省程序運行時間
b)是不是把一個系統中所有的網頁都進行靜態化? 什么樣的頁面需要靜態化?
[1]不是,因為當一個頁面靜態化之后,所有的寫操作都會造成巨大的資源調動,造成更多資源的浪費,
所以我們只將一些修改幾率不大或不會修改的頁面靜態化。
[2]例:電子圖書、商品詳情信息....
c)CMS系統(Content Manager System) 就是把動態網頁靜態化
首先我們需要一個Map,其中是模板中 ${pid}的pid值與題目內容。
Map<String,String> dataMap = new HashMap<String,String>();
讀取模板ftl內容,ftl的格式規范其實是xml,所以我們使用Configuration用於讀取ftl文件。
Configuration configuration = new Configuration();
configuration.setDefaultEncoding("utf-8");
configuration.setDirectoryForTemplateLoading(new File("src\\main\\java\\ftl\\"));
獲取ftl的Template。
Template t = configuration.getTemplate(templateFileName,"utf-8");
利用Map替換模板內容
Writer out = new BufferedWriter(new OutputStreamWriter(new FileOutputStream("src\\main\\java\\word\\"+outFile+".doc"), "utf-8"),10240);
t.process(dataMap, out);