JFinal3.0快速上手何荚,遇見(jiàn)模板引擎(二十)

指令擴(kuò)展絕對(duì)是一個(gè)比較好用的技能囱淋,那么該如何進(jìn)行指令擴(kuò)展呢?別著急餐塘,今天我們將一起學(xué)習(xí)指令擴(kuò)展的小技巧妥衣。

1、逆向行駛,不按套路出牌

編寫(xiě)演示例子中使用到的HTML頁(yè)面代碼税手,本小節(jié)主要通過(guò)指令輸出當(dāng)前日期蜂筹,具體代碼如下:

<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>jfinal模板引擎之二十</title>
</head>
<body>
今天的日期是:#now()
</body>
</html>

2、幕后黑手芦倒,竟然在此

使用指令是簡(jiǎn)單艺挪,幸福的一件事情。我們先來(lái)領(lǐng)略一番指令相關(guān)代碼的魅力兵扬。因?yàn)镈irective類類中代碼不是很多麻裳,就直接閱讀一下這邊的源碼,還是很有意思的器钟。

package com.jfinal.template;

import com.jfinal.template.expr.ast.ExprList;
import com.jfinal.template.stat.ast.Stat;

/**
 * Directive 供用戶繼承并擴(kuò)展自定義指令津坑,具體用法可以參考
 * com.jfinal.template.ext.directive 包下面的例子
 */
public abstract class Directive extends Stat {
    
    /**
     * 傳遞給指令的表達(dá)式列表
     * 1:表達(dá)式列表可通過(guò) exprList.eval(scope) 以及 
     *exprList.evalExprList(scope) 進(jìn)行求值
     * 2:使用賦值表達(dá)式可實(shí)現(xiàn)參數(shù)傳遞功能
     * 
     * <pre>
     * 例如:#render("_hot.html", title="熱門新聞", list=newsList)
     * </pre>
     */
    protected ExprList exprList;
    
    /**
     * 具有 #end 結(jié)束符的指令內(nèi)部嵌套的所有內(nèi)容,
     *調(diào)用 stat.exec(env, scope, writer)
     * 即可執(zhí)行指令內(nèi)部嵌入所有指令與表達(dá)式傲霸,
     *如果指令沒(méi)有 #end 結(jié)束符疆瑰,該屬性無(wú)效 
     */
    protected Stat stat;
    
    /**
     * 指令被解析時(shí)注入指令參數(shù)表達(dá)式列表,
     *繼承類可以通過(guò)覆蓋此方法對(duì)參數(shù)長(zhǎng)度
     * 和參數(shù)類型進(jìn)行校驗(yàn)
     */
    public void setExprList(ExprList exprList) {
        this.exprList = exprList;
    }
    
    /**
     * 指令被解析時(shí)注入指令 body 內(nèi)容狞谱,
     *僅對(duì)于具有 #end 結(jié)束符的指令有效
     */
    public void setStat(Stat stat) {
        this.stat = stat;
    }
}

目測(cè)還有一層洋蔥皮乃摹,需要你忍著眼淚撥下來(lái)。因?yàn)槲覀兛吹紻irective繼承自Stat跟衅,所以我們需要去Stat里一探究竟孵睬。請(qǐng)記住write方法,接下來(lái)我們會(huì)在程序中使用到它伶跷。

package com.jfinal.template.stat.ast;

import java.io.IOException;
import java.io.Writer;
import com.jfinal.template.Env;
import com.jfinal.template.TemplateException;
import com.jfinal.template.expr.ast.ExprList;
import com.jfinal.template.stat.Location;
import com.jfinal.template.stat.Scope;

/**
 * Stat
 */
public abstract class Stat {
    
    protected Location location;
    
    public Stat setLocation(Location location) {
        this.location = location;
        return this;
    }
    
    public Location getLocation() {
        return location;
    }
    
    public void setExprList(ExprList exprList) {
    }
    
    public void setStat(Stat stat) {
    }
    
    public abstract void exec(Env env, Scope scope, Writer writer);
    
    public boolean hasEnd() {
        return false;
    }
    
    protected void write(Writer writer, String str) {
        try {
            writer.write(str);
        } catch (IOException e) {
            throw new TemplateException(e.getMessage(), location, e);
        }
    }
    
    protected void write(Writer writer, char[] chars) {
        try {
            writer.write(chars);
        } catch (IOException e) {
            throw new TemplateException(e.getMessage(), location, e);
        }
    }
}

3掰读、刷卡上車,擴(kuò)展指令

在第二小節(jié)叭莫,我們已經(jīng)簡(jiǎn)單的看了指令相關(guān)的代碼設(shè)計(jì)蹈集,那么作為使用者,該如何去自定義指令或者擴(kuò)展指令呢雇初?在例子中拢肆,我們先來(lái)創(chuàng)建一個(gè)普通的java類,然后繼承Directive類靖诗。既然是抽象類郭怪,那么就得實(shí)現(xiàn)點(diǎn)什么。你懂的刊橘。

package com.demo.test;

import java.io.Writer;
import java.text.SimpleDateFormat;
import java.util.Date;

import com.jfinal.template.Directive;
import com.jfinal.template.Env;
import com.jfinal.template.stat.Scope;

public class Now  extends Directive{

    @Override
    public void exec(Env env, Scope scope, Writer writer) {
        write(writer,new SimpleDateFormat("yyyy-MM-dd HH:mm:ss")
        .format(new Date()).toString());    
    }

}

4鄙才、驗(yàn)證代碼,見(jiàn)證奇跡

很好促绵,擴(kuò)展指令已經(jīng)成功引起了我們的注意攒庵。那么下面我們就來(lái)驗(yàn)證一下代碼實(shí)現(xiàn)的效果是否正確嘴纺,敬請(qǐng)期待。

測(cè)試效果

吶浓冒,這就是你要的效果栽渴!是否感覺(jué)很炫酷!開(kāi)玩笑裆蒸,你以為這樣熔萧,代碼就能運(yùn)行起來(lái)嗎?你上當(dāng)了僚祷,我們還必須在模板引擎中添加相關(guān)的配置。代碼如下贮缕,假裝你知道在jfinal的配置文件中設(shè)置辙谜。

    
    public void configEngine(Engine me) {
        //添加擴(kuò)展指令
        me.addDirective("now", new Now());
    }

5、千里之行始于足下

本小節(jié)就講這么多感昼,敬請(qǐng)期待下節(jié)內(nèi)容装哆。更新時(shí)間不確定,哈哈~這個(gè)擴(kuò)展指令有什么用定嗓?其實(shí)擴(kuò)展指令的用途還是蠻多的蜕琴,內(nèi)置的指令有時(shí)候不能完全滿足我們的生產(chǎn)需要,所以在實(shí)際情況中需要定制一些屬于自己的指令宵溅。既然這樣凌简,那么我們擴(kuò)展一下這個(gè)例子。

5.1頁(yè)面代碼

<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>jfinal模板引擎之二十</title>
</head>
<body>
今天的日期是:#now('2017-06-02 12:32:54')
</body>
</html>

5.2擴(kuò)展指令代碼

package com.demo.test;

import java.io.Writer;
import java.text.SimpleDateFormat;
import java.util.Date;

import com.jfinal.template.Directive;
import com.jfinal.template.Env;
import com.jfinal.template.expr.ast.Expr;
import com.jfinal.template.stat.Scope;

public class Now extends Directive{

    @Override
    public void exec(Env env, Scope scope, Writer writer) {
        
        //獲取參數(shù)
        Expr my_date=exprList.getExpr(0);
        //定義日期格式化規(guī)則
        SimpleDateFormat sdf=new 
                             SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        SimpleDateFormat sdf2=new 
                            SimpleDateFormat("yyyy年MM月dd HH:mm:ss");
        
        try {
            //轉(zhuǎn)換日期類型
            Date date=sdf.parse(my_date.toString());
            //輸出格式化之后的結(jié)果
            write(writer,sdf2.format(date).toString()); 
        } catch (Exception e) {
            //打印錯(cuò)誤信息
            e.printStackTrace();
        }
        
    }

}
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末恃逻,一起剝皮案震驚了整個(gè)濱河市雏搂,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌寇损,老刑警劉巖凸郑,帶你破解...
    沈念sama閱讀 217,542評(píng)論 6 504
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異矛市,居然都是意外死亡芙沥,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,822評(píng)論 3 394
  • 文/潘曉璐 我一進(jìn)店門浊吏,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)而昨,“玉大人,你說(shuō)我怎么就攤上這事卿捎∨渥希” “怎么了?”我有些...
    開(kāi)封第一講書(shū)人閱讀 163,912評(píng)論 0 354
  • 文/不壞的土叔 我叫張陵午阵,是天一觀的道長(zhǎng)躺孝。 經(jīng)常有香客問(wèn)我享扔,道長(zhǎng),這世上最難降的妖魔是什么植袍? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,449評(píng)論 1 293
  • 正文 為了忘掉前任惧眠,我火速辦了婚禮,結(jié)果婚禮上于个,老公的妹妹穿的比我還像新娘氛魁。我一直安慰自己,他們只是感情好厅篓,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,500評(píng)論 6 392
  • 文/花漫 我一把揭開(kāi)白布秀存。 她就那樣靜靜地躺著,像睡著了一般羽氮。 火紅的嫁衣襯著肌膚如雪或链。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書(shū)人閱讀 51,370評(píng)論 1 302
  • 那天档押,我揣著相機(jī)與錄音澳盐,去河邊找鬼。 笑死令宿,一個(gè)胖子當(dāng)著我的面吹牛叼耙,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播粒没,決...
    沈念sama閱讀 40,193評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼筛婉,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了革娄?” 一聲冷哼從身側(cè)響起倾贰,我...
    開(kāi)封第一講書(shū)人閱讀 39,074評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎拦惋,沒(méi)想到半個(gè)月后匆浙,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,505評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡厕妖,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,722評(píng)論 3 335
  • 正文 我和宋清朗相戀三年首尼,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片言秸。...
    茶點(diǎn)故事閱讀 39,841評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡软能,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出举畸,到底是詐尸還是另有隱情查排,我是刑警寧澤,帶...
    沈念sama閱讀 35,569評(píng)論 5 345
  • 正文 年R本政府宣布抄沮,位于F島的核電站跋核,受9級(jí)特大地震影響岖瑰,放射性物質(zhì)發(fā)生泄漏砂代。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,168評(píng)論 3 328
  • 文/蒙蒙 一露戒、第九天 我趴在偏房一處隱蔽的房頂上張望智什。 院中可真熱鬧讼呢,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 31,783評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至供炎,卻和暖如春疾党,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背竭钝。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 32,918評(píng)論 1 269
  • 我被黑心中介騙來(lái)泰國(guó)打工雹洗, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人庇茫。 一個(gè)月前我還...
    沈念sama閱讀 47,962評(píng)論 2 370
  • 正文 我出身青樓螃成,卻偏偏與公主長(zhǎng)得像查坪,于是被迫代替她去往敵國(guó)和親顷霹。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,781評(píng)論 2 354

推薦閱讀更多精彩內(nèi)容