Springboot使用velocity模板引擎

第五章 使用velocity模板引擎

最爽的Web組合開(kāi)發(fā)就是Intellij IDEA + Maven + Spring Boot + Scala + Velocity + Boostrap + jQuery了.

Spring Boot提供了一個(gè)強(qiáng)大的一鍵式Spring的集成開(kāi)發(fā)環(huán)境奠滑,能夠單獨(dú)進(jìn)行一個(gè)Spring應(yīng)用的開(kāi)發(fā),其中:

(1)集中式配置(application.properties)+注解癞己,大大簡(jiǎn)化了開(kāi)發(fā)流程

(2)內(nèi)嵌的Tomcat和Jetty容器,可直接打成jar包啟動(dòng)柱嫌,無(wú)需提供Java war包以及繁瑣的Web配置

(3)提供了Spring各個(gè)插件的基于Maven的pom模板配置妥色,開(kāi)箱即用拆魏,便利無(wú)比气筋。

(4)可以在任何你想自動(dòng)化配置的地方缝驳,實(shí)現(xiàn)可能

(5)提供更多的企業(yè)級(jí)開(kāi)發(fā)特性连锯,如何系統(tǒng)監(jiān)控,健康診斷用狱,權(quán)限控制

(6)無(wú)冗余代碼生成和XML強(qiáng)制配置

(7)提供支持強(qiáng)大的Restfult風(fēng)格的編碼运怖,非常簡(jiǎn)潔

當(dāng)然Spring Boot提供的功能,遠(yuǎn)遠(yuǎn)比上面的強(qiáng)大. Spring boot集成了servlet容器齿拂,當(dāng)我們?cè)趐om文件中增加spring-boot-starter-web的maven依賴時(shí)驳规,不做任何web相關(guān)的配置便能提供web服務(wù),這還得歸于spring boot 自動(dòng)配置的功能(因?yàn)榧恿薊nableAutoConfiguration的注解)署海,幫我們創(chuàng)建了一堆默認(rèn)的配置吗购,以前在web.xml中配置,現(xiàn)在都可以通過(guò)spring bean的方式進(jìn)行配置砸狞,由spring來(lái)進(jìn)行生命周期的管理捻勉,大多數(shù)情況下,我們需要重載這些配置(例如修改服務(wù)的啟動(dòng)端口刀森,contextpath,filter,listener,servlet,session超時(shí)時(shí)間等)

本章我們介紹一下,在SB中使用模板引擎Velocity.

SB默認(rèn)支持的模板引擎

spring boot會(huì)自動(dòng)配置 FreeMarker,Thymeleaf,Velocity踱启,只需要在pom中加入相應(yīng)的依賴即可

SB使用Velocity的依賴

<dependency>
     <groupId>org.springframework.boot</groupId>
     <artifactId>spring-boot-starter-velocity</artifactId>
</dependency>

默認(rèn)配置下spring boot會(huì)從src/main/resources/templates目錄中去找模板

SB的velocity配置

application.properties配置

lightsword/src/main/resources/application.properties


# VELOCITY TEMPLATES (VelocityAutoConfiguration)
spring.velocity.charset=UTF-8
spring.velocity.properties.input.encoding=UTF-8
spring.velocity.properties.output.encoding=UTF-8
spring.velocity.resourceLoaderPath=classpath:/templates/
spring.velocity.suffix=.html
spring.velocity.toolbox-config-location=/WEB-INF/toolbox.xml

這樣,SB會(huì)從src/main/resources/templates目錄中去找以.html后綴的模板文件.

Controller里面的Model

數(shù)據(jù)httpapis通過(guò)model傳到模板文件(SpringMVC框架里面做的事情):

model.addAttribute("httpapis", HttpApiDao.findAll())

完整的Controller代碼:

https://github.com/LightSwordSpringBoot/lightsword/blob/lightsword/src/main/scala/com/springboot/in/action/controller/HttpApiController.scala

package com.springboot.in.action.controller

import java.util.Date
import java.util.concurrent.CountDownLatch

import com.alibaba.fastjson.JSON
import com.springboot.in.action.dao.{HttpApiDao, HttpReportDao, HttpSuiteDao}
import com.springboot.in.action.engine.OkHttp
import com.springboot.in.action.entity.{HttpApi, HttpReport}
import org.springframework.beans.factory.annotation.Autowired
import org.springframework.ui.Model
import org.springframework.web.bind.annotation.{PathVariable, RequestMapping, RequestMethod, RequestParam, ResponseBody, RestController}
import org.springframework.web.servlet.ModelAndView
import scala.collection.JavaConversions._

@RestController
@RequestMapping(Array("/httpapi"))
class HttpApiController @Autowired() (
    val HttpSuiteDao: HttpSuiteDao,
    val HttpApiDao: HttpApiDao,
    val HttpReportDao: HttpReportDao) {

  @RequestMapping(value = {
    Array("", "/")
  }, method = Array(RequestMethod.GET))
  def list(model: Model) = {
    model.addAttribute("httpapis", HttpApiDao.findAll())
    new ModelAndView("/httpapi/list")
  }
  
  ...
  
}

模板文件list.html

lightsword/src/main/resources/templates/httpapi/list.html


#include("/common/header.html")
<div class="form-group">
    <table style="word-break: break-all; word-wrap: break-all;"
        class="table table-hover table-condensed table-responsive">
        <thead>
            <tr>
                <th style='width: 60px'>Id</th>
                <th style='width: 100px'>用例名稱</th>
                <th>URL</th>
                <th style='width: 80px'>方法</th>
                <th style='width: 100px'>期望輸出</th>
                <th style='width: 60px'>次數(shù)</th>
                <th>狀態(tài)</th>
                <th style='width: 90px'>創(chuàng)建人</th>
                <th style='width: 120px'>調(diào)用時(shí)間</th>
                <th style='width: 60px'>操作</th>
                <th>執(zhí)行測(cè)試</th>
            </tr>
        </thead>
        <tbody>
            #foreach ($t in $httpapis)
            <tr>
                <td>$!t.id</td>
                <td>$!t.name</td>
                <td>$!t.url</td>
                <td>$!t.method</td>
                <td>$!t.expectOutput</td>
                <td>$!t.runTimes</td> #if($!t.state==1)
                <td><div class="btn btn-success">成功</div></td> #elseif($!t.state==0)
                <td><div class="btn btn-danger">失敗</div></td> #else
                <td><div class="btn btn-info">未執(zhí)行</div></td> #end
                <td>$!t.owner</td>
                <td>$!DateTool.format('yyyy-MM-dd HH:mm:ss', $!t.gmtModify)</td>
                <td><a href="/httpapi/detailPage/$t.id">查看</a></td>
                <td><div id='btn-$t.id' class='btn btn-primary'
                        onclick='runTest($t.id)'>運(yùn)行</div></td>
            </tr>
            #end
        </tbody>
    </table>
</div>

<script>
    function runTest(id) {
        var url = '/httpapi/runTest?id=' + id
        $.getJSON(url, function(data) {
            if (data) {
                alert('響應(yīng)結(jié)果:' + JSON.stringify(data, null, 2))
                location.reload()
            } else {
                alert('執(zhí)行失敗')
            }
        })
    }
</script>


#include("/common/footer.html")

velocity的語(yǔ)法詳情參考:

toolbox的使用

我們?cè)趘elocity模板文件中有時(shí)候需要格式化小數(shù)點(diǎn),日期等輸出,我們可以使用toolbox.

我們看到application.properties有這么一行配置:

spring.velocity.toolbox-config-location=/WEB-INF/toolbox.xml

然后,在list.html里面有這么一行代碼

<td>$!DateTool.format('yyyy-MM-dd HH:mm:ss', $!t.gmtModify)</td>

這個(gè)DateTool就是我們這里要說(shuō)的toolbox的功能.

lightsword/src/main/resources/WEB-INF/toolbox.xml的配置如下

<?xml version="1.0" encoding="UTF-8"?>
<!-- ============================================================= @(#) toolbox.xml 
    Copyright (c) 2016, Project, All Rights Reserved. ============================================================= -->

<toolbox>

    <!-- [ DateTool ] @see http://www.jajakarta.org/velocity/tools/velocity-tools-1.1/docs-ja/generic/DateTool.html 
        (ja) @see http://velocity.apache.org/tools/devel/javadoc/org/apache/velocity/tools/generic/DateTool.html 
        (en) @since VelocityTools 1.0 -->
    <tool>
        <key>DateTool</key>
        <scope>application</scope>
        <class>org.apache.velocity.tools.generic.DateTool</class>
    </tool>

    <!-- [ MathTool ] @see http://www.jajakarta.org/velocity/tools/velocity-tools-1.1/docs-ja/generic/MathTool.html 
        (ja) @see http://velocity.apache.org/tools/devel/generic/MathTool.html (en) 
        @since VelocityTools 1.0 -->
    <tool>
        <key>MathTool</key>
        <scope>application</scope>
        <class>org.apache.velocity.tools.generic.MathTool</class>
    </tool>

    <!-- [ NumberTool ] @see http://velocity.apache.org/tools/devel/javadoc/org/apache/velocity/tools/generic/NumberTool.html 
        (en) @since VelocityTools 1.2 -->
    <tool>
        <key>NumberTool</key>
        <scope>application</scope>
        <class>org.apache.velocity.tools.generic.NumberTool</class>
    </tool>

    <!-- [ RenderTool ] @see http://velocity.apache.org/tools/devel/generic/RenderTool.html 
        (en) @since VelocityTools 1.0 <tool> <key>render</key> <scope>application</scope> 
        <class>org.apache.velocity.tools.generic.RenderTool</class> </tool> -->

    <!-- [ EscapeTool ] @see http://velocity.apache.org/tools/devel/generic/EscapeTool.html 
        (en) @since VelocityTools 1.2 -->
    <tool>
        <key>EscapeTool</key>
        <scope>application</scope>
        <class>org.apache.velocity.tools.generic.EscapeTool</class>
    </tool>

    <!-- [ ResourceTool ] @see http://velocity.apache.org/tools/devel/javadoc/org/apache/velocity/tools/generic/ResourceTool.html 
        (en) @since Velocity 1.3 <tool> <key>text</key> <class>org.apache.velocity.tools.generic.ResourceTool</class> 
        <parameter name="bundles" value="resources,prj.hoboken.patrasche.resources.PatrascheResources" 
        /> <parameter name="locale" value="ja_JP" /> </tool> -->

    <!-- [ AlternatorTool ] @see http://velocity.apache.org/tools/devel/javadoc/org/apache/velocity/tools/generic/AlternatorTool.html 
        (en) @since VelocityTools 1.2 -->
    <tool>
        <key>AlternatorTool</key>
        <scope>application</scope>
        <class>org.apache.velocity.tools.generic.AlternatorTool</class>
    </tool>

    <!-- [ ValueParser ] @see http://velocity.apache.org/tools/devel/javadoc/org/apache/velocity/tools/generic/ValueParser.html 
        (en) @since VelocityTools 1.2 -->
    <tool>
        <key>ValueParser</key>
        <scope>application</scope>
        <class>org.apache.velocity.tools.generic.ValueParser</class>
    </tool>

    <!-- [ ListTool ] @see http://velocity.apache.org/tools/devel/javadoc/org/apache/velocity/tools/generic/ListTool.html 
        (en) @since VelocityTools 1.2 -->
    <tool>
        <key>ListTool</key>
        <scope>application</scope>
        <class>org.apache.velocity.tools.generic.ListTool</class>
    </tool>

    <!-- [ SortTool ] @see http://velocity.apache.org/tools/devel/javadoc/org/apache/velocity/tools/generic/SortTool.html 
        (en) @since VelocityTools 1.2 -->
    <tool>
        <key>SortTool</key>
        <scope>application</scope>
        <class>org.apache.velocity.tools.generic.SortTool</class>
    </tool>

    <!-- [ IteratorTool ] @see http://velocity.apache.org/tools/devel/javadoc/org/apache/velocity/tools/generic/IteratorTool.html 
        (en) @since VelocityTools 1.0 -->
    <tool>
        <key>IteratorTool</key>
        <scope>request</scope>
        <class>org.apache.velocity.tools.generic.IteratorTool</class>
    </tool>

    <!-- ============================================================ [ TOOL 
        FOR STRUTS TAGLIB ] ============================================================ -->
    <!-- [ ActionMessagesTool ] @see http://www.jajakarta.org/velocity/tools/velocity-tools-1.1/docs-ja/struts/ActionMessagesTool.html 
        (ja) @see http://velocity.apache.org/tools/devel/struts/ActionMessagesTool.html 
        (en) @since VelocityTools 1.1 -->
    <tool>
        <key>ActionMessagesTool</key>
        <scope>request</scope>
        <class>org.apache.velocity.tools.struts.ActionMessagesTool</class>
    </tool>

    <!-- [ ErrorsTool ] @see http://www.jajakarta.org/velocity/tools/velocity-tools-1.1/docs-ja/struts/ErrorsTool.html 
        (ja) @see http://velocity.apache.org/tools/devel/struts/ErrorsTool.html (en) 
        @since VelocityTools 1.0 -->
    <tool>
        <key>ErrorsTool</key>
        <scope>request</scope>
        <class>org.apache.velocity.tools.struts.ErrorsTool</class>
    </tool>

    <!-- [ FormTool ] @see http://www.jajakarta.org/velocity/tools/velocity-tools-1.1/docs-ja/struts/FormTool.html 
        (ja) @see http://velocity.apache.org/tools/devel/struts/FormTool.html (en) 
        @since VelocityTools 1.0 -->
    <tool>
        <key>FormTool</key>
        <scope>request</scope>
        <class>org.apache.velocity.tools.struts.FormTool</class>
    </tool>

    <!-- [ MessageTool ] @see http://www.jajakarta.org/velocity/tools/velocity-tools-1.1/docs-ja/struts/MessageTool.html 
        (ja) @see http://velocity.apache.org/tools/devel/struts/MessageTool.html 
        (en) @since VelocityTools 1.0 -->
    <tool>
        <key>MessageTool</key>
        <scope>request</scope>
        <class>org.apache.velocity.tools.struts.MessageTool</class>
    </tool>

    <!-- [ StrutsLinkTool ] LinkTool @see http://www.jajakarta.org/velocity/tools/velocity-tools-1.1/docs-ja/struts/StrutsLinkTool.html 
        (ja) @see http://velocity.apache.org/tools/devel/struts/StrutsLinkTool.html 
        (en) @since VelocityTools 1.0 -->
    <tool>
        <key>StrutsLinkTool</key>
        <scope>request</scope>
        <class>org.apache.velocity.tools.struts.StrutsLinkTool</class>
    </tool>

    <!-- [ SecureLinkTool ] LinkTool @see http://www.jajakarta.org/velocity/tools/velocity-tools-1.1/docs-ja/struts/SecureLinkTool.html 
        (ja) @see http://velocity.apache.org/tools/devel/struts/SecureLinkTool.html 
        (en) @since VelocityTools 1.1 -->
    <tool>
        <key>SecureLinkTool</key>
        <scope>request</scope>
        <class>org.apache.velocity.tools.struts.SecureLinkTool</class>
    </tool>

    <!-- [ TilesTool ] Tiles @see http://www.jajakarta.org/velocity/tools/velocity-tools-1.1/docs-ja/struts/TilesTool.html 
        (ja) @see http://velocity.apache.org/tools/devel/struts/TilesTool.html (en) 
        @since VelocityTools 1.1 -->
    <tool>
        <key>TilesTool</key>
        <scope>request</scope>
        <class>org.apache.velocity.tools.struts.TilesTool</class>
    </tool>

    <!-- [ ValidatorTool ] Validator @see http://www.jajakarta.org/velocity/tools/velocity-tools-1.1/docs-ja/struts/ValidatorTool.html 
        (ja) @see http://velocity.apache.org/tools/devel/struts/ValidatorTool.html 
        (en) @since VelocityTools 1.1 -->
    <tool>
        <key>ValidatorTool</key>
        <scope>request</scope>
        <class>org.apache.velocity.tools.struts.ValidatorTool</class>
    </tool>


</toolbox> 

這樣我們就可以在模板文件中使用類似DateTool這樣的工具類了.同時(shí)我們也可以在代碼里自己實(shí)現(xiàn)工具類,然后配置到toolbox.xml文件里.

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市研底,隨后出現(xiàn)的幾起案子埠偿,更是在濱河造成了極大的恐慌,老刑警劉巖榜晦,帶你破解...
    沈念sama閱讀 217,084評(píng)論 6 503
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件冠蒋,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡乾胶,警方通過(guò)查閱死者的電腦和手機(jī)抖剿,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,623評(píng)論 3 392
  • 文/潘曉璐 我一進(jìn)店門(mén)朽寞,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人斩郎,你說(shuō)我怎么就攤上這事脑融。” “怎么了缩宜?”我有些...
    開(kāi)封第一講書(shū)人閱讀 163,450評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵肘迎,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我锻煌,道長(zhǎng)膜宋,這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,322評(píng)論 1 293
  • 正文 為了忘掉前任炼幔,我火速辦了婚禮,結(jié)果婚禮上史简,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好篷帅,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,370評(píng)論 6 390
  • 文/花漫 我一把揭開(kāi)白布糯景。 她就那樣靜靜地躺著,像睡著了一般殉农。 火紅的嫁衣襯著肌膚如雪刀脏。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書(shū)人閱讀 51,274評(píng)論 1 300
  • 那天超凳,我揣著相機(jī)與錄音愈污,去河邊找鬼。 笑死轮傍,一個(gè)胖子當(dāng)著我的面吹牛暂雹,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播创夜,決...
    沈念sama閱讀 40,126評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼杭跪,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了驰吓?” 一聲冷哼從身側(cè)響起涧尿,我...
    開(kāi)封第一講書(shū)人閱讀 38,980評(píng)論 0 275
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎檬贰,沒(méi)想到半個(gè)月后姑廉,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,414評(píng)論 1 313
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡偎蘸,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,599評(píng)論 3 334
  • 正文 我和宋清朗相戀三年庄蹋,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了瞬内。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 39,773評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡限书,死狀恐怖虫蝶,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情倦西,我是刑警寧澤能真,帶...
    沈念sama閱讀 35,470評(píng)論 5 344
  • 正文 年R本政府宣布,位于F島的核電站扰柠,受9級(jí)特大地震影響粉铐,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜卤档,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,080評(píng)論 3 327
  • 文/蒙蒙 一蝙泼、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧劝枣,春花似錦汤踏、人聲如沸。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 31,713評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至稳诚,卻和暖如春哗脖,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背扳还。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 32,852評(píng)論 1 269
  • 我被黑心中介騙來(lái)泰國(guó)打工才避, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人氨距。 一個(gè)月前我還...
    沈念sama閱讀 47,865評(píng)論 2 370
  • 正文 我出身青樓工扎,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親衔蹲。 傳聞我的和親對(duì)象是個(gè)殘疾皇子肢娘,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,689評(píng)論 2 354

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