Springboot使用velocity模板引擎

作者: 光剑书架上的书 | 来源:发表于2016-06-26 14:20 被阅读11859次

    第五章 使用velocity模板引擎

    最爽的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="/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文件里.

    相关文章

      网友评论

      • f06de8738d2b:谢谢,写的很好,很有帮助:+1:
        光剑书架上的书:哈哈,这个比较老了。后来,有一篇更好的实践总结:

        《Springboot极简教程》第二章 使用Spring Boot, JPA, Mysql, ThymeLeaf,gradle, Kotlin快速构建一个CRUD Web App

        http://www.jianshu.com/p/8335c24e8c8d

      • 杨旸52:太好了

      本文标题:Springboot使用velocity模板引擎

      本文链接:https://www.haomeiwen.com/subject/rhoadttx.html