SpringMVC+Freemarker生成靜態頁面
阿新 • • 發佈:2019-02-15
最近公司使用Freemarker開發一個網站,所以自己抽空學了一下,怎麼說呢,剛入個門,給我的感覺Freemarker跟jsp實在是太像了,名字為模板引擎,其實理論上jsp同樣也屬於一種模板,如果動態的轉發到頁面上其使用步驟與Jsp一摸一樣(當然,前提是需要配置檢視解析器),我們這個專案主要使用它與資料結合生成靜態頁面,以檔案的形式儲存在本地。因此,你在控制器直接返回一個main.ftl其實沒有多大意義個人感覺,還不如用Jsp,Jsp與SpringMVC結合更方便。
那麼開始吧,使用Freemark生成靜態頁面肯定是需要兩個東西的,一個就是頁面模板,另外一個就是資料模型,專案業務是使用者發表文章,文章內容就是資料模型,所有文章共用一個模板檔案,使用者編輯好了文章之後後臺就會呼叫Freemarker介面生成靜態頁面。
首先是配置檔案:
freemarker的資原始檔:
<bean id="freemarkerConfiguration" class="org.springframework.beans.factory.config.PropertiesFactoryBean">
<property name="location" value="/WEB-INF/resource/freemarker.properties" />
</bean>
資源內容:default_encoding=UTF-8 url_escaping_charset=UTF-8 locale=zh_CN whitespace_stripping=true template_update_delay=0 tag_syntax=square_bracket #classic_compatible=true datetime_format=yyyy-MM-dd HH:mm:ss date_format=yyyy-MM-dd time_format=HH:mm:ss number_format=#;
接下來是設定屬性:
<bean id="freemarkerConfiguration" class="org.springframework.beans.factory.config.PropertiesFactoryBean"> <property name="location" value="/WEB-INF/resource/freemarker.properties" /> </bean> <bean class="org.springframework.web.servlet.view.freemarker.FreeMarkerConfigurer"> <property name="templateLoaderPath" value="/WEB-INF/views/templates" /> <property name="defaultEncoding" value="utf-8" /> <property name="freemarkerSettings" ref="freemarkerConfiguration"/> <!--設定一些常用的全域性變數--> <property name="freemarkerVariables"> <map> <entry key="webRoot" value="/shop"/> <entry key="jsRoot" value="/shop/js"/> </map> </property> </bean>
這是Spring的部分配置檔案,這一步是用來配置Freemarker基本屬性,具體含義不說了,百度一大堆,接下來是配置檢視解析器:
<!-- 配置jsp檢視解析器 -->
<bean id="jspViewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<property name="viewClass" value="org.springframework.web.servlet.view.JstlView"/>
<property name="prefix" value="/WEB-INF/views/jsp/"/>
<property name="suffix" value=".jsp"/>
<property name="order" value="2" />
</bean>
<!-- 配置freeMarker檢視解析器 -->
<bean id="freemarkerViewResolver" class="org.springframework.web.servlet.view.freemarker.FreeMarkerViewResolver">
<property name="viewClass" value="org.springframework.web.servlet.view.freemarker.FreeMarkerView"/>
<property name="suffix" value=".html" />
<!--
<property name="viewNames" value="*.ftl" />
-->
<property name="contentType" value="text/html; charset=utf-8" />
<property name="cache" value="true" />
<!-- 結果是請求和會話屬性都被複制到模板的屬性集中,可以使用FreeMarker的表示式語言來訪問並顯示 -->
<property name="exposeRequestAttributes" value="true" />
<property name="exposeSessionAttributes" value="true" />
<!-- 使用巨集 -->
<property name="exposeSpringMacroHelpers" value="true" />
<property name="order" value="1" />
</bean>
JSP試圖解析器和Freemarker檢視解析器,注意一下優先順序,同名同路徑的請求會有用。
配置檔案寫好了之後就可以來寫FreemarkerUtil了,這個工具類主要就是將傳入的資料模型生成靜態頁面:
private static String staticPagePath = "C:/Users/hao/Desktop/staticPages";
/**
* @param data 資料模型
* @param templatePath 模板路徑 "WEB-INF/templates"
* @param templateFileName 模板檔名 "main.html"
* @param staticPageName 生成的靜態檔案的檔名
*/
public static void createStaticPage(Configuration cfg,HttpServletRequest request,String staticPageName ,Map<String, Object> data, String templatePath, String templateFileName) {
try {
cfg.setTagSyntax(Configuration.AUTO_DETECT_TAG_SYNTAX);// 設定標籤
cfg.setServletContextForTemplateLoading(request.getServletContext(),templatePath);// 設定臨時載入目錄。
cfg.setDefaultEncoding("UTF-8");
cfg.setNumberFormat("#");
Template temp = cfg.getTemplate(templateFileName);// 獲取模板物件
Writer out = new OutputStreamWriter(new FileOutputStream(staticPagePath+"/"+staticPageName+(new Date()).getTime()+".html"), "UTF-8");
temp.process(data, out);
out.flush();
out.close();
} catch (Exception e) {
e.printStackTrace();
}
}
還有一個工具方法是判斷檔案是否已經存在:
/**
* @param request
* @param filePath 檔案存放的路徑
* @param fileName 檔案的名稱,需要副檔名
* @author HuifengWang
* @return
*/
public static Map<String,Object> htmlFileHasExist(HttpServletRequest request,String filePath,
String fileName) {
Map<String,Object> map = new HashMap<String,Object>();
String htmlPath = request.getSession().getServletContext() .getRealPath(filePath) + "/" + fileName;
File htmlFile = new File(htmlPath);
if(htmlFile.exists()){
map.put("exist", true);
}else{
map.put("exist",false);
}
return map ;
}
OK,以上就是FreemarkerUtil的內容,原理很簡單。
最後生成的頁面:
Demo的目錄結構如下:
當然,以後要查詢頁面的時候涉及到了檢索,我們用的是Lucene全文檢索,後文在說。