1. 程式人生 > >SpringMVC+Freemarker生成靜態頁面

SpringMVC+Freemarker生成靜態頁面

最近公司使用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全文檢索,後文在說。