SpringBoot使用velocity模板引擎

Easter79
• 阅读 635

最爽的Web组合开发就是Intellij IDEA + Maven + Spring Boot + Scala + Velocity + Boostrap + jQuery了.

Spring Boot提供了一个强大的一键式Spring的集成开发环境,能够单独进行一个Spring应用的开发,其中:

(1)集中式配置(application.properties)+注解,大大简化了开发流程

(2)内嵌的Tomcat和Jetty容器,可直接打成jar包启动,无需提供Java war包以及繁琐的Web配置

(3)提供了Spring各个插件的基于Maven的pom模板配置,开箱即用,便利无比。

(4)可以在任何你想自动化配置的地方,实现可能

(5)提供更多的企业级开发特性,如何系统监控,健康诊断,权限控制

(6)无冗余代码生成和XML强制配置

(7)提供支持强大的Restfult风格的编码,非常简洁

当然Spring Boot提供的功能,远远比上面的强大. Spring boot集成了servlet容器,当我们在pom文件中增加spring-boot-starter-web的maven依赖时,不做任何web相关的配置便能提供web服务,这还得归于spring boot 自动配置的功能(因为加了EnableAutoConfiguration的注解),帮我们创建了一堆默认的配置,以前在web.xml中配置,现在都可以通过spring bean的方式进行配置,由spring来进行生命周期的管理,大多数情况下,我们需要重载这些配置(例如修改服务的启动端口,contextpath,filter,listener,servlet,session超时时间等)

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

##SB默认支持的模板引擎

spring boot会自动配置 FreeMarker,Thymeleaf,Velocity,只需要在pom中加入相应的依赖即可

##SB使用Velocity的依赖

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

默认配置下spring boot会从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会从src/main/resources/templates目录中去找以.html后缀的模板文件.

###Controller里面的Model

数据httpapis通过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'>次数</th>
                <th>状态</th>
                <th style='width: 90px'>创建人</th>
                <th style='width: 120px'>调用时间</th>
                <th style='width: 60px'>操作</th>
                <th>执行测试</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">未执行</div></td> #end
                <td>$!t.owner</td>
                <td>$!DateTool.format('yyyy-MM-dd HH:mm:ss', $!t.gmtModify)</td>
                <td><a href="https://my.oschina.net/httpapi/detailPage/$t.id">查看</a></td>
                <td><div id='btn-$t.id' class='btn btn-primary'
                        onclick='runTest($t.id)'>运行</div></td>
            </tr>
            #end
        </tbody>
    </table>
</div>

<script>
    function runTest(id) {
        var url = '/httpapi/runTest?id=' + id
        $.getJSON(url, function(data) {
            if (data) {
                alert('响应结果:' + JSON.stringify(data, null, 2))
                location.reload()
            } else {
                alert('执行失败')
            }
        })
    }
</script>


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

velocity的语法详情参考:

##toolbox的使用

我们在velocity模板文件中有时候需要格式化小数点,日期等输出,我们可以使用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>

这个DateTool就是我们这里要说的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这样的工具类了.同时我们也可以在代码里自己实现工具类,然后配置到toolbox.xml文件里.

新书上架:《Spring Boot 开发实战》

— 基于 Kotlin + Gradle + Spring Boot 2.0 的企业级服务端开发实战

京东下单链接

https://item.jd.com/31178320122.html

天猫下单链接

https://detail.tmall.com/item.htm?id=574928877711

SpringBoot使用velocity模板引擎

点赞
收藏
评论区
推荐文章
blmius blmius
2年前
MySQL:[Err] 1292 - Incorrect datetime value: ‘0000-00-00 00:00:00‘ for column ‘CREATE_TIME‘ at row 1
文章目录问题用navicat导入数据时,报错:原因这是因为当前的MySQL不支持datetime为0的情况。解决修改sql\mode:sql\mode:SQLMode定义了MySQL应支持的SQL语法、数据校验等,这样可以更容易地在不同的环境中使用MySQL。全局s
Jacquelyn38 Jacquelyn38
2年前
2020年前端实用代码段,为你的工作保驾护航
有空的时候,自己总结了几个代码段,在开发中也经常使用,谢谢。1、使用解构获取json数据let jsonData  id: 1,status: "OK",data: 'a', 'b';let  id, status, data: number   jsonData;console.log(id, status, number )
皕杰报表之UUID
​在我们用皕杰报表工具设计填报报表时,如何在新增行里自动增加id呢?能新增整数排序id吗?目前可以在新增行里自动增加id,但只能用uuid函数增加UUID编码,不能新增整数排序id。uuid函数说明:获取一个UUID,可以在填报表中用来创建数据ID语法:uuid()或uuid(sep)参数说明:sep布尔值,生成的uuid中是否包含分隔符'',缺省为
Easter79 Easter79
2年前
Twitter的分布式自增ID算法snowflake (Java版)
概述分布式系统中,有一些需要使用全局唯一ID的场景,这种时候为了防止ID冲突可以使用36位的UUID,但是UUID有一些缺点,首先他相对比较长,另外UUID一般是无序的。有些时候我们希望能使用一种简单一些的ID,并且希望ID能够按照时间有序生成。而twitter的snowflake解决了这种需求,最初Twitter把存储系统从MySQL迁移
Wesley13 Wesley13
2年前
mysql设置时区
mysql设置时区mysql\_query("SETtime\_zone'8:00'")ordie('时区设置失败,请联系管理员!');中国在东8区所以加8方法二:selectcount(user\_id)asdevice,CONVERT\_TZ(FROM\_UNIXTIME(reg\_time),'08:00','0
Stella981 Stella981
2年前
SpringBoot使用velocity模板引擎
最爽的Web组合开发就是IntellijIDEAMavenSpringBootScalaVelocityBoostrapjQuery了.SpringBoot提供了一个强大的一键式Spring的集成开发环境,能够单独进行一个Spring应用的开发,其中:(1)集中式配置(application.properti
Wesley13 Wesley13
2年前
00:Java简单了解
浅谈Java之概述Java是SUN(StanfordUniversityNetwork),斯坦福大学网络公司)1995年推出的一门高级编程语言。Java是一种面向Internet的编程语言。随着Java技术在web方面的不断成熟,已经成为Web应用程序的首选开发语言。Java是简单易学,完全面向对象,安全可靠,与平台无关的编程语言。
Stella981 Stella981
2年前
Django中Admin中的一些参数配置
设置在列表中显示的字段,id为django模型默认的主键list_display('id','name','sex','profession','email','qq','phone','status','create_time')设置在列表可编辑字段list_editable
Wesley13 Wesley13
2年前
MySQL部分从库上面因为大量的临时表tmp_table造成慢查询
背景描述Time:20190124T00:08:14.70572408:00User@Host:@Id:Schema:sentrymetaLast_errno:0Killed:0Query_time:0.315758Lock_
Python进阶者 Python进阶者
4个月前
Excel中这日期老是出来00:00:00,怎么用Pandas把这个去除
大家好,我是皮皮。一、前言前几天在Python白银交流群【上海新年人】问了一个Pandas数据筛选的问题。问题如下:这日期老是出来00:00:00,怎么把这个去除。二、实现过程后来【论草莓如何成为冻干莓】给了一个思路和代码如下:pd.toexcel之前把这
Easter79
Easter79
Lv1
今生可爱与温柔,每一样都不能少。
文章
2.8k
粉丝
5
获赞
1.2k