最爽的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的依赖
1<dependency> 2 <groupId>org.springframework.boot</groupId> 3 <artifactId>spring-boot-starter-velocity</artifactId> 4</dependency>
默认配置下spring boot会从src/main/resources/templates目录中去找模板
##SB的velocity配置
###application.properties配置
lightsword/src/main/resources/application.properties
1# VELOCITY TEMPLATES (VelocityAutoConfiguration) 2spring.velocity.charset=UTF-8 3spring.velocity.properties.input.encoding=UTF-8 4spring.velocity.properties.output.encoding=UTF-8 5spring.velocity.resourceLoaderPath=classpath:/templates/ 6spring.velocity.suffix=.html 7spring.velocity.toolbox-config-location=/WEB-INF/toolbox.xml 8
这样,SB会从src/main/resources/templates目录中去找以.html后缀的模板文件.
###Controller里面的Model
数据httpapis通过model传到模板文件(SpringMVC框架里面做的事情):
model.addAttribute("httpapis", HttpApiDao.findAll())
完整的Controller代码:
1package com.springboot.in.action.controller 2 3import java.util.Date 4import java.util.concurrent.CountDownLatch 5 6import com.alibaba.fastjson.JSON 7import com.springboot.in.action.dao.{HttpApiDao, HttpReportDao, HttpSuiteDao} 8import com.springboot.in.action.engine.OkHttp 9import com.springboot.in.action.entity.{HttpApi, HttpReport} 10import org.springframework.beans.factory.annotation.Autowired 11import org.springframework.ui.Model 12import org.springframework.web.bind.annotation.{PathVariable, RequestMapping, RequestMethod, RequestParam, ResponseBody, RestController} 13import org.springframework.web.servlet.ModelAndView 14import scala.collection.JavaConversions._ 15 16@RestController 17@RequestMapping(Array("/httpapi")) 18class HttpApiController @Autowired() ( 19 val HttpSuiteDao: HttpSuiteDao, 20 val HttpApiDao: HttpApiDao, 21 val HttpReportDao: HttpReportDao) { 22 23 @RequestMapping(value = { 24 Array("", "/") 25 }, method = Array(RequestMethod.GET)) 26 def list(model: Model) = { 27 model.addAttribute("httpapis", HttpApiDao.findAll()) 28 new ModelAndView("/httpapi/list") 29 } 30 31 ... 32 33} 34
###模板文件list.html
lightsword/src/main/resources/templates/httpapi/list.html
1#include("/common/header.html") 2<div class="form-group"> 3 <table style="word-break: break-all; word-wrap: break-all;" 4 class="table table-hover table-condensed table-responsive"> 5 <thead> 6 <tr> 7 <th style='width: 60px'>Id</th> 8 <th style='width: 100px'>用例名称</th> 9 <th>URL</th> 10 <th style='width: 80px'>方法</th> 11 <th style='width: 100px'>期望输出</th> 12 <th style='width: 60px'>次数</th> 13 <th>状态</th> 14 <th style='width: 90px'>创建人</th> 15 <th style='width: 120px'>调用时间</th> 16 <th style='width: 60px'>操作</th> 17 <th>执行测试</th> 18 </tr> 19 </thead> 20 <tbody> 21 #foreach ($t in $httpapis) 22 <tr> 23 <td>$!t.id</td> 24 <td>$!t.name</td> 25 <td>$!t.url</td> 26 <td>$!t.method</td> 27 <td>$!t.expectOutput</td> 28 <td>$!t.runTimes</td> #if($!t.state==1) 29 <td><div class="btn btn-success">成功</div></td> #elseif($!t.state==0) 30 <td><div class="btn btn-danger">失败</div></td> #else 31 <td><div class="btn btn-info">未执行</div></td> #end 32 <td>$!t.owner</td> 33 <td>$!DateTool.format('yyyy-MM-dd HH:mm:ss', $!t.gmtModify)</td> 34 <td><a href="https://my.oschina.net/httpapi/detailPage/$t.id">查看</a></td> 35 <td><div id='btn-$t.id' class='btn btn-primary' 36 onclick='runTest($t.id)'>运行</div></td> 37 </tr> 38 #end 39 </tbody> 40 </table> 41</div> 42 43<script> 44 function runTest(id) { 45 var url = '/httpapi/runTest?id=' + id 46 $.getJSON(url, function(data) { 47 if (data) { 48 alert('响应结果:' + JSON.stringify(data, null, 2)) 49 location.reload() 50 } else { 51 alert('执行失败') 52 } 53 }) 54 } 55</script> 56 57 58#include("/common/footer.html") 59
velocity的语法详情参考:
##toolbox的使用
我们在velocity模板文件中有时候需要格式化小数点,日期等输出,我们可以使用toolbox.
我们看到application.properties有这么一行配置:
1spring.velocity.toolbox-config-location=/WEB-INF/toolbox.xml 2
然后,在list.html里面有这么一行代码
<td>$!DateTool.format('yyyy-MM-dd HH:mm:ss', $!t.gmtModify)</td>
这个DateTool就是我们这里要说的toolbox的功能.
lightsword/src/main/resources/WEB-INF/toolbox.xml的配置如下
1<?xml version="1.0" encoding="UTF-8"?> 2<!-- ============================================================= @(#) toolbox.xml 3 Copyright (c) 2016, Project, All Rights Reserved. ============================================================= --> 4 5<toolbox> 6 7 <!-- [ DateTool ] @see http://www.jajakarta.org/velocity/tools/velocity-tools-1.1/docs-ja/generic/DateTool.html 8 (ja) @see http://velocity.apache.org/tools/devel/javadoc/org/apache/velocity/tools/generic/DateTool.html 9 (en) @since VelocityTools 1.0 --> 10 <tool> 11 <key>DateTool</key> 12 <scope>application</scope> 13 <class>org.apache.velocity.tools.generic.DateTool</class> 14 </tool> 15 16 <!-- [ MathTool ] @see http://www.jajakarta.org/velocity/tools/velocity-tools-1.1/docs-ja/generic/MathTool.html 17 (ja) @see http://velocity.apache.org/tools/devel/generic/MathTool.html (en) 18 @since VelocityTools 1.0 --> 19 <tool> 20 <key>MathTool</key> 21 <scope>application</scope> 22 <class>org.apache.velocity.tools.generic.MathTool</class> 23 </tool> 24 25 <!-- [ NumberTool ] @see http://velocity.apache.org/tools/devel/javadoc/org/apache/velocity/tools/generic/NumberTool.html 26 (en) @since VelocityTools 1.2 --> 27 <tool> 28 <key>NumberTool</key> 29 <scope>application</scope> 30 <class>org.apache.velocity.tools.generic.NumberTool</class> 31 </tool> 32 33 <!-- [ RenderTool ] @see http://velocity.apache.org/tools/devel/generic/RenderTool.html 34 (en) @since VelocityTools 1.0 <tool> <key>render</key> <scope>application</scope> 35 <class>org.apache.velocity.tools.generic.RenderTool</class> </tool> --> 36 37 <!-- [ EscapeTool ] @see http://velocity.apache.org/tools/devel/generic/EscapeTool.html 38 (en) @since VelocityTools 1.2 --> 39 <tool> 40 <key>EscapeTool</key> 41 <scope>application</scope> 42 <class>org.apache.velocity.tools.generic.EscapeTool</class> 43 </tool> 44 45 <!-- [ ResourceTool ] @see http://velocity.apache.org/tools/devel/javadoc/org/apache/velocity/tools/generic/ResourceTool.html 46 (en) @since Velocity 1.3 <tool> <key>text</key> <class>org.apache.velocity.tools.generic.ResourceTool</class> 47 <parameter name="bundles" value="resources,prj.hoboken.patrasche.resources.PatrascheResources" 48 /> <parameter name="locale" value="ja_JP" /> </tool> --> 49 50 <!-- [ AlternatorTool ] @see http://velocity.apache.org/tools/devel/javadoc/org/apache/velocity/tools/generic/AlternatorTool.html 51 (en) @since VelocityTools 1.2 --> 52 <tool> 53 <key>AlternatorTool</key> 54 <scope>application</scope> 55 <class>org.apache.velocity.tools.generic.AlternatorTool</class> 56 </tool> 57 58 <!-- [ ValueParser ] @see http://velocity.apache.org/tools/devel/javadoc/org/apache/velocity/tools/generic/ValueParser.html 59 (en) @since VelocityTools 1.2 --> 60 <tool> 61 <key>ValueParser</key> 62 <scope>application</scope> 63 <class>org.apache.velocity.tools.generic.ValueParser</class> 64 </tool> 65 66 <!-- [ ListTool ] @see http://velocity.apache.org/tools/devel/javadoc/org/apache/velocity/tools/generic/ListTool.html 67 (en) @since VelocityTools 1.2 --> 68 <tool> 69 <key>ListTool</key> 70 <scope>application</scope> 71 <class>org.apache.velocity.tools.generic.ListTool</class> 72 </tool> 73 74 <!-- [ SortTool ] @see http://velocity.apache.org/tools/devel/javadoc/org/apache/velocity/tools/generic/SortTool.html 75 (en) @since VelocityTools 1.2 --> 76 <tool> 77 <key>SortTool</key> 78 <scope>application</scope> 79 <class>org.apache.velocity.tools.generic.SortTool</class> 80 </tool> 81 82 <!-- [ IteratorTool ] @see http://velocity.apache.org/tools/devel/javadoc/org/apache/velocity/tools/generic/IteratorTool.html 83 (en) @since VelocityTools 1.0 --> 84 <tool> 85 <key>IteratorTool</key> 86 <scope>request</scope> 87 <class>org.apache.velocity.tools.generic.IteratorTool</class> 88 </tool> 89 90 <!-- ============================================================ [ TOOL 91 FOR STRUTS TAGLIB ] ============================================================ --> 92 <!-- [ ActionMessagesTool ] @see http://www.jajakarta.org/velocity/tools/velocity-tools-1.1/docs-ja/struts/ActionMessagesTool.html 93 (ja) @see http://velocity.apache.org/tools/devel/struts/ActionMessagesTool.html 94 (en) @since VelocityTools 1.1 --> 95 <tool> 96 <key>ActionMessagesTool</key> 97 <scope>request</scope> 98 <class>org.apache.velocity.tools.struts.ActionMessagesTool</class> 99 </tool> 100 101 <!-- [ ErrorsTool ] @see http://www.jajakarta.org/velocity/tools/velocity-tools-1.1/docs-ja/struts/ErrorsTool.html 102 (ja) @see http://velocity.apache.org/tools/devel/struts/ErrorsTool.html (en) 103 @since VelocityTools 1.0 --> 104 <tool> 105 <key>ErrorsTool</key> 106 <scope>request</scope> 107 <class>org.apache.velocity.tools.struts.ErrorsTool</class> 108 </tool> 109 110 <!-- [ FormTool ] @see http://www.jajakarta.org/velocity/tools/velocity-tools-1.1/docs-ja/struts/FormTool.html 111 (ja) @see http://velocity.apache.org/tools/devel/struts/FormTool.html (en) 112 @since VelocityTools 1.0 --> 113 <tool> 114 <key>FormTool</key> 115 <scope>request</scope> 116 <class>org.apache.velocity.tools.struts.FormTool</class> 117 </tool> 118 119 <!-- [ MessageTool ] @see http://www.jajakarta.org/velocity/tools/velocity-tools-1.1/docs-ja/struts/MessageTool.html 120 (ja) @see http://velocity.apache.org/tools/devel/struts/MessageTool.html 121 (en) @since VelocityTools 1.0 --> 122 <tool> 123 <key>MessageTool</key> 124 <scope>request</scope> 125 <class>org.apache.velocity.tools.struts.MessageTool</class> 126 </tool> 127 128 <!-- [ StrutsLinkTool ] LinkTool @see http://www.jajakarta.org/velocity/tools/velocity-tools-1.1/docs-ja/struts/StrutsLinkTool.html 129 (ja) @see http://velocity.apache.org/tools/devel/struts/StrutsLinkTool.html 130 (en) @since VelocityTools 1.0 --> 131 <tool> 132 <key>StrutsLinkTool</key> 133 <scope>request</scope> 134 <class>org.apache.velocity.tools.struts.StrutsLinkTool</class> 135 </tool> 136 137 <!-- [ SecureLinkTool ] LinkTool @see http://www.jajakarta.org/velocity/tools/velocity-tools-1.1/docs-ja/struts/SecureLinkTool.html 138 (ja) @see http://velocity.apache.org/tools/devel/struts/SecureLinkTool.html 139 (en) @since VelocityTools 1.1 --> 140 <tool> 141 <key>SecureLinkTool</key> 142 <scope>request</scope> 143 <class>org.apache.velocity.tools.struts.SecureLinkTool</class> 144 </tool> 145 146 <!-- [ TilesTool ] Tiles @see http://www.jajakarta.org/velocity/tools/velocity-tools-1.1/docs-ja/struts/TilesTool.html 147 (ja) @see http://velocity.apache.org/tools/devel/struts/TilesTool.html (en) 148 @since VelocityTools 1.1 --> 149 <tool> 150 <key>TilesTool</key> 151 <scope>request</scope> 152 <class>org.apache.velocity.tools.struts.TilesTool</class> 153 </tool> 154 155 <!-- [ ValidatorTool ] Validator @see http://www.jajakarta.org/velocity/tools/velocity-tools-1.1/docs-ja/struts/ValidatorTool.html 156 (ja) @see http://velocity.apache.org/tools/devel/struts/ValidatorTool.html 157 (en) @since VelocityTools 1.1 --> 158 <tool> 159 <key>ValidatorTool</key> 160 <scope>request</scope> 161 <class>org.apache.velocity.tools.struts.ValidatorTool</class> 162 </tool> 163 164 165</toolbox> 166
这样我们就可以在模板文件中使用类似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
