1. 程式人生 > >spring中freemarker自定義標籤詳解

spring中freemarker自定義標籤詳解

最近因工作需要,從網上搜了一個jeecms網站,準備進行借鑑使用,發現裡面對模板用的不錯,前面雖說也對freemarker有用,但是還沒有這麼深入,所以就查了一些資料,下面進行總結下。

一、jar包準備

首先是Spring、SpringMVC的依賴jar包……

然後是Freemarker的依賴jar包,我使用的是freemarker-2.3.20.jar,如果使用maven的話可以直接在pom.xml中新增一段把它引進來:

  1. <groupId>org.freemarker</groupId>  
  2. <artifactId>freemarker</artifactId>  
  3.  <version>2.3.20</version>  


二、配置web.xml

  1. <?xml version="1.0" ?>  
  2. <web-app xmlns="http://java.sun.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"  
  3.     xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"  
  4.     version="3.0">  
  5.     <!--  Spring 服務層的配置檔案 -->  
  6.     <context-param>  
  7.         <param-name>contextConfigLocation</param-name>  
  8.         <param-value>classpath:applicationContext.xml</param-value>  
  9.     </context-param>  
  10.     <!--  Spring 容器啟動監聽器 -->  
  11.     <listener>  
  12.         <listener-class>org.springframework.web.context.ContextLoaderListener  
  13.         </listener-class>  
  14.     </listener>  
  15.     <servlet>  
  16.         <servlet-name>springmvc</servlet-name>  
  17.         <servlet-class>org.springframework.web.servlet.DispatcherServlet  
  18.         </servlet-class>  
  19.         <load-on-startup>1</load-on-startup>  
  20.     </servlet>  
  21.     <!--為DispatcherServlet建立對映 -->  
  22.     <servlet-mapping>  
  23.         <servlet-name>spring</servlet-name>  
  24.         <url-pattern>/</url-pattern>  
  25.     </servlet-mapping>  
  26. </web-app>  

三、配置spring-servlet.xml

這裡只寫上freemarker的配置部分,先配置檢視解析器:

  1. <bean id="viewResolver" class="org.springframework.web.servlet.view.freemarker.FreeMarkerViewResolver">  
  2.     <property name="viewClass" value="org.springframework.web.servlet.view.freemarker.FreeMarkerView"/>  
  3.     <property name="contentType" value="text/html; charset=utf-8"/>  
  4.     <property name="suffix" value=".ftl" />   <!-- 本行配置檔案型別,freemarker檔案型別標準是ftl -->  
  5.     <!-- 如果有多種解析器,新增下面這行,讓freemarker解析器優先 -->  
  6.     <property name="order" value="0" />  
  7. </bean>  

接下來加上freemarker的配置

  1. <bean id="freemarkerConfig"  
  2.     class="org.springframework.web.servlet.view.freemarker.FreeMarkerConfigurer">  
  3.     <property name="templateLoaderPath">  
  4.         <value>/WEB-INF/t/</value>  <!-- 你的模版檔案的存放路徑,我這裡存放在WEB-INF目錄下的t資料夾裡 -->  
  5.     </property>  
  6.     <property name="defaultEncoding">  
  7.         <value>utf-8</value>  
  8.     </property>  
  9.     <property name="freemarkerSettings">  
  10.         <props>  
  11.             <prop key="template_update_delay">3600</prop>  <!-- 模版更新間隔,開發時設為1,專案工作時建議設定為較大數字-->  
  12.         </props>   
  13.     </property>  
  14.     <!-- 假設你需要使用freemarker的自定義標籤,這裡還需要增加這一段 -->  
  15.     <property name="freemarkerVariables">  
  16.         <map>  
  17.         <entry key="XXDirective" value-ref="XXDirective"/>      
  18.         <!-- 這裡配置的是自定義標籤,建議命名為XXDirective,有多個就一起在這裡配置 -->  
  19.         </map>     
  20.     </property>  
  21. </bean>  
  22. <!-- 使用自定義標籤還需要配置自定義標籤的bean,不使用自定義標籤不用寫 -->  
  23. <bean id="XXDirective" class="..XXDirective"/>   



四、編寫Controller

  1. @RequestMapping(value = "/document/getArticle.action")  
  2. public String getColumn( ModelMap root) throws Exception {  
  3.     root.put(“art_content”, “這是一篇文章”);  
  4.     return article;//與模版名稱相對應   
  5. }  

五、在前面配置的模版路徑下編寫article.ftl
  1. <!DOCTYPE html>  
  2. <html>  
  3. <head>  
  4. </head>  
  5. <body>  
  6.     ${art_content}              
  7. </body>  
  8. </html>  

那麼訪問getArticle.action則跳轉到頁面輸出結果:這是一篇文章


六、自定義標籤的使用

這裡例舉一個最簡單的用法,我的資料庫中有一個文章表(文章有很多屬性title、content等),假設我需要在article.ftl的頁面上指定我需要取id=5的這篇文章標題和內容,這時候,就可以用到自定義標籤了。(用法很多,這裡只簡單介紹一下)

首先編寫一個自定義標籤類實現TemplateDirectiveModel介面:

/** env:環境變數
params:指令引數(儲存你所需要的值,隨便是什麼Key-Value你懂的)
loopVars:迴圈變數
body:指令內容 **/
  1. public class ArticleDirective implements TemplateDirectiveModel {  
  2.     public void execute(Environment env, Map params, TemplateModel[] loopVars,TemplateDirectiveBody body) throws TemplateException {      
  3.     Object paramValue = params.get("articleId"); //這裡模版頁面傳進來的引數叫做articleId   
  4.     int id=0;  
  5.         if (paramValue instanceof TemplateNumberModel) {  
  6.         id = ((TemplateNumberModel) paramValue).getAsNumber().intValue();  
  7.     }                                                                                                                                 
  8. <span style="white-space:pre">    </span>/* Freemarker自定義標籤不能直接識別傳過來的資料型別引數,例如引數是字串型別的引數,則用到SimpleScalar,比方說引數param是一個String,那麼要先將參<span style="white-space:pre">    </span>數強轉為SimpleScalar型別再使用其getAsString方法。                                
  9.     String id= (SimpleScalar) params.get("param").getAsString();  
  10.     引數還可以是集合、陣列型別、這裡不一一介紹 */  
  11.     Article article = ArticleService.getArticleById(id); //然後這裡呼叫service,通過id取得需要的文章article   
  12.     env.setVariable("article", DEFAULT_WRAPPER.wrap(article)); /*使用env.setVariable方法設定變數article(這個就是要返回給頁面的資料),注意需要使用freemarker中的靜態成員變數DEFAULT_WRAPPER把article處理一下 */  
  13.     body.render(env.getOut()); //最後使用body.render(env.getOut())將資料交給模版頁面    
  14.     }  
  15. }  


然後編寫Controller

  1. @RequestMapping(value = "/document/getArticle.action")  
  2. public String getColumn( ModelMap root) throws Exception {  
  3.     root.put(“article_d”, new ArticleDirective()); /*把標籤加進去,我的標籤名為article_d,方便區分資料,注意命名不要與變數名一樣,否則會出問題 */  
  4.     return article;  
  5. }  
那麼article.ftl這樣編寫:
  1. <pre name="code" class="html"><!DOCTYPE html>  
  2. <html>  
  3. <head>  
  4. </head>  
  5. <body>  
  6.     <@article articleId = 5> <#-- 使用自定義標籤,傳入的引數與自定義標籤類保持一致 -->  
  7.     文章的標題是${article.title},文章的內容是${article.content}  
  8.     </@article>              
  9. </body>  
  10. </html>  

相關推薦

springfreemarker定義標籤

最近因工作需要,從網上搜了一個jeecms網站,準備進行借鑑使用,發現裡面對模板用的不錯,前面雖說也對freemarker有用,但是還沒有這麼深入,所以就查了一些資料,下面進行總結下。 一、jar包準備 首先是Spring、SpringMVC的依賴jar包…… 然後是Fr

Word定義編號及疑難彙總!

        在Word中使用編號可以方便地對段落進行排序,當新增或刪除專案後,編號能自動按段落次序重新編排。本文主要給大家介紹如何自定義編號的格式,步驟如下:         1.選定要設定編號格式的段落,如果僅為一段,將插入點定位到段落中即可(如果為多個段,也可以一次

Spring Boot 定義日誌

本節內容基於 Spring Boot 2.0. 你所需具備的基礎 什麼是 Spring Boot? Spring Boot 核心配置檔案詳解 Spring Boot 開啟的 2 種方式 Spring Boot 自動配置原理、實戰 Spring Boot 2.x 啟動全過程原始碼分析

Freemarker定義標籤+spring國際化所碰到的坑

最近在弄springmvc國際化,碰到一個問題,昨天下午兩三個小時加上今天上午,最後終於在大佬同事的提示下知道了原因所在。 首先注意spring.ftl的這句話 這是freemarker的巨集變數,由此可以看出springMacroRequestContext是一個物件

Android通過友盟統計上傳定義錯誤

友盟統計中,其中有一個錯誤統計板塊,可以自動上傳錯誤統計,或者上傳自定義的錯誤統計,不過友盟中的這一部分,只是說了這麼幾句話,沒有詳細的說明怎麼使用 **************************************************************

Spring遇見問題(三)-----FreeMarker定義標籤

web.xml檔案 <?xml version="1.0" encoding="UTF-8"?> <web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http:

angular 定義指令 --restrict、restrict、replace

emp bold span 類型 ret space con 設置 註意 Angularjs 允許根據實際業務需要自定義指令, 通過angular全局對象下的 directive 方法實現。可以自定義屬性、自定義標簽、自定義功能 接下來定義一個名叫custom的指令,並利用

深究AngularJS——定義服務(factory、service、provider)

string targe 返回 config 屬性 doctype 三種方式 啟用 print 前言 3種創建自定義服務的方式。 Factory Service Provider 大家應該知道,AngularJS是後臺人員在工作之余發明的,他主要應用了後臺早就存

angular 定義指令 Directive

聲明 其他 原型繼承 創建 tool 兩個 模板 變化 組合 廢話不多說,下面就直接上代碼 //angular指令的定義,myDirective ,使用駝峰命名法 angular.module(‘myApp‘, []) .directive(‘myDirective‘,

AngularJs定義指令(5) - link

演示 hang cursor off drag font 雙向 事件 date 在指令中操作DOM,我們需要link參數,這參數要求聲明一個函數,稱之為鏈接函數。 寫法: link: function(scope, element, attrs) {  // 在這裏操作DO

spring增加定義配置支持

控制 images 映射 獲取 path efi ade get 處理 spring.schemas 在使用spring時,我們會首先編寫spring的配置文件,在配置文件中,我們除了使用基本的命名空間http://www.springframework.org/schem

Android定義view

this boolean mar 處理 都是 並且 jdk text 命名 從繼承開始 懂點面向對象語言知識的都知道:封裝,繼承和多態,這是面向對象的三個基本特征,所以在自定義View的時候,最簡單的方法就是繼承現有的View 通過上面這段代碼,我定義了一個Ske

Spring的applicationContext文件

finance 初始化 tgui 解析 示例 row -m 所有 table <?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/sche

Android Gradle 定義Task

png 發布 我們 批處理 使用總結 實用 shift fonts 博客 轉載請標明出處:http://blog.csdn.net/zhaoyanjun6/article/details/76408024 本文出自【趙彥軍的博客】 一:Gradle 是什麽 Gradl

Spring@Component註解,@Controller註解(網摘)

tin ava 代碼 autowired reat control type imp 訪問   在使用Spring的過程中,為了避免大量使用Bean註入的Xml配置文件,我們會采用Spring提供的自動掃描註入的方式, 只需要添加幾行自動註入的的配置,便可以完成Servic

我的springboot之路(2)----springboot定義配置

一、前言 我的springboot之路(1)介紹了springboot的誕生背景以及優點等,我們知道springboot簡化了程式設計配置,它體現出了一種 約定優於配置,也稱作按約定程式設計,是一種軟體設計正規化,旨在減少軟體開發人員需做決定的數量,獲得簡單的好處,而又不失靈活性。 一般

Spring定義事件

在spring中我們可以自定義事件,並且可以使用ApplicationContext型別物件來發布這個事件,事件釋出之後,所有的ApplicaitonListener(監聽器)例項都會被觸發並呼叫指定方法onApplicationEvent()來處理. 1.定義事件: 如圖所示: 2

定義View(3)

大家教師節快樂啊,不知道勤學的Coder們有沒有去嘗試下繪製上篇文章中最後留下的進階效果,不管怎樣,還是一起動手寫一遍吧!看看套路是否一致。 水波紋 首先來看圖-水波紋中的效果,其具有以下特點: 從內到外四層,內圓外環; 從內到外四個色值;

freemarker定義標籤報錯(四)

 freemarker自定義標籤 1、錯誤描述 六月 05, 2014 11:31:35 下午 freemarker.log.JDK14LoggerFactory$JDK14Logger error 嚴重: Template processing error: "Err

freemarker定義標籤報錯(五)

freemarker自定義標籤 1、錯誤描述 六月 05, 2014 11:40:49 下午 freemarker.log.JDK14LoggerFactory$JDK14Logger error 嚴重: Template processing error: "Expr