模板是同样的静态HTML,Spring Web MVC是1种基于Java完毕了Web

Apache
FreeMarker模板引擎:Java库来扭转文书输出(HTML网页,电子邮件,配置文件,源代码,等等)基于模板和变化的数据。模板都写在FreeMarker模板语言(FTL),那是三个不难的、专门的语言(不是叁个成熟的编程语言(比如PHP)。你要预备的数码突显在多少个确实的编制程序语言,就像是数据库查询和做事情的乘除难点,然后模板已经准备好的多寡的体现。模板中您珍爱怎么着突显数据,和表面包车型地铁模版你关切如何数据。

因为Spring
Boot其实是对Spring生态的包裹整合打包,以简化开发中运用Spring框架。所以
Spring
Boot在合龙模板引擎进度中,其实正是对守旧SpringMVC集成对应模板引擎的打包自动化配置。

 

在Spring MVC架构中:

图片 1

图片 2

 

“视图”负责前端页面包车型地铁彰显。后端的数目对象如何流转到前端,以及上下端数据的交互是哪些的吧?
这么些都以由模板引擎来“牵线搭桥”的。

那种方法1般被称呼MVC(模型-视图-控制器)格局,并为动态网页更加受欢迎。它有助于分离网页设计师(HTML笔者)从开发者(Java程序员通常)。在模板设计者不汇合临复杂的逻辑,能够更改页面包车型客车外观无需程序员修改或重新编写翻译代码。

Spring Web MVC是一种基于Java实现了Web
MVC设计方式的乞请驱动类型的轻量级Web框架,即采纳了MVC架构方式的合计,将web层进行解耦,基于请求-响应模型帮忙大家简化平日web系统的开支。

Free马克尔最初创造时生成HTML页面在MVC
web应用程序框架,它不是绑定到servlet或东西的HTML或上述。它的非web应用程序环境中使用。

Spring Web
MVC框架正是壹种MVC框架。接纳“约定优于配备”的契约式编制程序方式。主要有上面几大作用模块:

 

  • 前端控制器是DispatcherServlet首要用于控制流程;
  • 选用控制器为电脑映射器(Handler Mapping)进行电脑管理
  • 视图解析器(View Resolver)实行视图的剖析;
  • 页面包车型客车url映射以及跳转控制由页面控制器(Controller)/动作跳转处理器来成功;
  • 地面消除析、文件上传等模块;
  • 多大校验、格式化和数码绑定模块

若果你在一个网址必要2个HTML页面,类似于:

下边大家第一讲的是跟视图解析器(View Resolver)相关的模板引擎。

 

模板引擎是为着使用户界面与作业数据分离而发生的,它能够变更特定格式的文书档案,用于网址的模板引擎就会扭转三个正式的HTML文书档案。

< html >
<头>
<标题>欢迎! < /名称>
< / >头
<身体>
<标题>欢迎John Doe ! < / h1 >
< p >我们的最新产品:
< a href = "产品/ greenmouse。html " >绿色鼠标< / > !
< /身体>
< / html >

在MVC方式中,模板引擎的做事原理基本1样,比如说以freemarker为例,如下图:

但用户的名号(上边的“JohnDoe”)取决于登录的用户是哪个人,和流行的制品音讯应该来自2个数据库。因为那几个数量变化,你不能够还是不能够应用静态HTML。相反,您能够利用2个模板所需的出口。模板是平等的静态HTML,除了它包括部分指令FreeMarker使其动态:

图片 3

 

可总结为八个公式:

< html >
<头>
<标题>欢迎! < /名称>
< / >头
<身体>
<标题>欢迎$ { user } ! < / h1 >
< p >我们的最新产品:
< a href = " $ { latestProduct.url } " > $ { latestProduct.name } < / > !
< /身体>
< / html >

模板 + 数据模型 = 输出

模板存款和储蓄在Web服务器上,经常就好像静态HTML页面。但每当有人访问这些页面,Free马克尔参加,将纯HTML的模板动态替换${...}s与流行的始末,并将结果发送到访问者的Web浏览器。所以访问者的浏览器将选拔类似HTML(即首先个例证。纯HTML未有Free马克尔指令),它不会意识到Free马克尔在服务器上应用。(当然,模板文件存款和储蓄在Web服务器上向来不变动,替换只出未来Web服务器的响应)。

在Java Web开发世界,常用的模板引擎有jsp, velocity, freemarker,
thymeleaf等。Spring
Boot对那么些模板引擎都支持集成。对spring-boot-starter-velocity的换代只保险到了一.四.陆.RELEASE版本。

注意,模板不带有编程逻辑来找出方今的别人是何人,或查询数据库获得新型的成品。要显得的数目准备Free马克尔外,平时经过1些写在部分“真实”编制程序语言(如Java)。模板小编不必知道那一个值是怎么总结的。事实上,那一个值的一个钱打二十七个结方法得以完全改观了模版可以维持完全相同,而且,完全改变了页面包车型大巴外观不会遇见别的东西,但模板。表示逻辑与业务逻辑的离别能够特意有用,当模板小编(设计师)和程序员都以见仁见智的村办,但也拉动管理应用程序的纷纷,要是她们是同一位。保持模板集中在陈述难题(视觉设计,布局和格式)是贰个重中之重的有效性采纳像Free马克尔模板引擎。

别的1个模板引擎(jsp,velocity,thymeleaf,freemarker等),都亟需经过数据模型变量以及一些中坚语法来促成多少到前端模板的出口。后端与前者隔离,其实并从未完全割裂,只是虚幻分层了,把数量逻辑归后端Model,显示的逻辑归视图View,中间经过数量对象来作数据的传导通讯。Model数据在视图View的解析显示,这么些工作正是模板引擎来成功的。

准备的整整数额称为数据模型的模板。模板作者而言,数据模型是3个树状结构(如硬盘上的公文夹和文书),而在那种景观下,能够可视化为:

JSP(Java Server
Pages,Java服务端页面),是1种动态页面技术,它的第三指标是将象征逻辑从Servlet中分离出来,本质上能够用作是二个简化的Servlet。

(根)
|
+ -用户=“大乔”
|
+ - latestProduct
|
+ - url =“产品/ greenmouse.html”
|
+ - name =“绿色鼠标”
注意:

JSP达成了Html语法中的java扩充(以 <%,
%>方式)。它是在观念的网页HTML文件中插入Java程序段和JSP标记,从而形成JSP文件,后缀名叫。

 

JSP与Servlet1样,是在劳务器端执行的。经常重临给客户端的正是一个HTML文本,因而客户端只要有浏览器就能浏览。

注意:

JSP将网页逻辑与网页设计的体现分离,帮忙可选用的依据组件的布置性,使基于Web的应用程序的支出变得更其简明[4]。

如上只是3个可视化;数据模型的文本格式,它从Java对象。对于Java程序员,根也许是2个Java对象getUser()getLatestProduct()主意,大概多个JavaMap"user""latestProducts"钥匙。同样的,latestProduct恐怕是二个Java对象getUrl()getName()方法。

要使用jsp,大家首先须要添加当中央注重

早些时候,你从这些数据模型的抉择值,userlatestProduct.name表明式。借使大家继承类比数据模型仿佛多个文件系统,然后“(根)”,latestProduct对应的目录(文件夹),user,urlname文本的目录。

 compile('org.springframework.boot:spring-boot-starter-web')// JSP providedCompile('org.springframework.boot:spring-boot-starter-tomcat') providedCompile('org.apache.tomcat.embed:tomcat-embed-jasper') compile('javax.servlet:jstl')

席卷、模板和数据模型的内需FreeMarker生成输出(如首先次彰显的HTML):

当中, JSTL(JSP Standard
TagLibrary)是JSP标准标签库。tomcat-embed-jasper是嵌入式tomcat协理。

模板+ 数据模型的= 输出

在Spring Web工程中,暗中认可的JSP的模版前缀是/WEB-INF/,后缀是.jsp。

 

其一是在org.springframework.web.servlet.config.annotation.ViewResolverRegistry中定义的

Free马克尔多少个优点:

 public UrlBasedViewResolverRegistration jsp() { return jsp("/WEB-INF/", ".jsp"); } public UrlBasedViewResolverRegistration jsp(String prefix, String suffix) { InternalResourceViewResolver resolver = new InternalResourceViewResolver(); resolver.setPrefix; resolver.setSuffix; this.viewResolvers.add; return new UrlBasedViewResolverRegistration; }
  • 强硬的沙盘语言:条件块、迭代、作业、字符串和算术运算和格式化,宏和函数,包涵其余模板,逃避在暗中同意情状下(可选),和诸多更加多

  • 多用途和轻量级:零依赖,任何输出格式,能够从此外省方加载模板(可插入),许多配置选项

  • 国际化/
    localization-aware:语言环境敏感的多寡和日期/时间格式,局地模板的变动。

  • XML处理功效:删除XML
    DOM-s到数据模型的遍历,甚至以宣称的点子处理它们

  • 通用的数据模型的:Java对象揭露在模板变量通过可插入适配器的树,那决定模板怎么着对待他们。

相应的工程目录如下

 

图片 4

 

如此大家就足以在Controller里面写代码了。举例如下:

 @GetMapping("/blogs.do") fun listAll(model: Model): String { val authentication = SecurityContextHolder.getContext().authentication model.addAttribute("currentUser", if (authentication == null) null else authentication.principal as UserDetails) val allblogs = blogService.findAll() model.addAttribute("blogs", allblogs) return "jsp/blog/list" }

中间,”jsp/blog/list”就是呼应的jsp文件的职位。

本小节具体实例工程得以参见:

https://github.com/Jason-Chen-2017/restfeel

Thymeleaf是1个XML/XHTML/HTML5模板引擎,可用来Web与非Web环境中的应用开发。它是七个开源的Java库,基于Apache
License 贰.0许可,由丹尼尔勒Fernández创立,该笔者依旧Java加密库Jasypt的撰稿人。

Thymeleaf提供了二个用以整合Spring
MVC的可选模块,在利用开发中,你可以利用Thymeleaf来完全代表JSP,或其它模板引擎,如Velocity、FreeMarker等。Thymeleaf的严重性对象在于提供壹种可被浏览器正确呈现的、格式杰出的沙盘创制方式,因而也得以用作静态建立模型。你能够选择它创造经过证实的XML与HTML模板。相对于编写逻辑或代码,开发者只需将标签属性添加到模板中即可。接下来,这一个标签属性就会在DOM上执行预先制定好的逻辑。

Thymeleaf官方文档:http://www.thymeleaf.org/documentation.html

演示模板:

<table> <thead> <tr> <th th:text="#{msgs.headers.name}">Name</td> <th th:text="#{msgs.headers.price}">Price</td> </tr> </thead> <tbody> <tr th:each="prod : ${allProducts}"> <td th:text="${prod.name}">Oranges</td> <td th:text="${#numbers.formatDecimal(prod.price,1,2)}">0.99</td> </tr> </tbody></table>

让我们开端吧!

<!DOCTYPE html><html xmlns="http://www.w3.org/1999/xhtml" xmlns:th="http://www.thymeleaf.org">

<!DOCTYPE html><html xmlns:th="http://www.thymeleaf.org"><th:block th:include="common/header :: head"></th:block><body><th:block th:include="common/header :: header"></th:block><div th:if="${not #lists.isEmpty(customers)}"> <h2>Customer List</h2> <table > <thead> <tr> <th>Id</th> <th>FirstName</th> <th>LastName</th> <th>Created Time</th> </tr> </thead> <tbody> <tr th:each="customer : ${customers}"> <td th:text="${customer.id}"><a href="/product/${product.id}">Id</a></td> <td th:text="${customer.firstName}">FirstName</td> <td th:text="${customer.lastName}">LastName</td> <td th:text="${customer.gmtCreated}">gmtCreated</td> <!--<td><a th:href="${ '/product/' + product.id}">View</a></td>--> <!--<td><a th:href="${'/product/edit/' + product.id}">Edit</a></td>--> </tr> </tbody> </table></div><th:block th:include="common/footer :: footer"></th:block></body></html>

common/header.html

<!DOCTYPE html><html xmlns:th="http://www.thymeleaf.org"><head lang="en" th:fragment="head"> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"/> <link href="http://cdn.jsdelivr.net/webjars/bootstrap/3.3.4/css/bootstrap.min.css" th:href="@{/webjars/bootstrap/3.3.4/css/bootstrap.min.css}" rel="stylesheet" media="screen"/> <link href="../../static/css/jquery.dataTables.min.css" th:href="@{css/jquery.dataTables.min.css}" rel="stylesheet" media="screen"/> <link href="../../static/css/mini_springboot.css" th:href="@{css/mini_springboot.css}" rel="stylesheet" media="screen"/> <title>Mini SpringBoot Tutorial</title></head><body><div th:fragment="header"> <nav > <div > <div > <a href="#" th:href="@{/}">Home</a> <ul > <li><a href="#" th:href="@{/customers.do}">Customers</a></li> <li><a href="#" th:href="@{/customer/new}">Create Customer</a></li> </ul> </div> </div> </nav> <div > <div > <div > <h1 >Springboot极简教程</h1> <h2>Mini SpringBoot Tutorial</h2> <h3>Spring Boot Kotlin Thymeleaf Web App</h3> </div> </div> <div > <iframe src="https://jason-chen-2017.github.io/Jason-Chen-2017/"></iframe> <!--![](../../static/images/home.png)--> </div> </div></div></body></html>

common/footer.html

<!DOCTYPE html><html xmlns:th="http://www.thymeleaf.org"><head lang="en"> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"/></head><body><div th:fragment="footer"> <div >Springboot极简教程, Jason Chen, 2017</div> <script src="http://cdn.jsdelivr.net/webjars/jquery/2.1.4/jquery.min.js" th:src="@{/webjars/jquery/2.1.4/jquery.min.js}"></script> <script src="http://cdn.jsdelivr.net/webjars/bootstrap/3.3.4/js/bootstrap.min.js" th:src="@{/webjars/bootstrap/3.3.4/js/bootstrap.min.js}"></script> <script src="../../static/js/jquery.dataTables.min.js" th:src="@{js/jquery.dataTables.min.js}"></script> <script src="../../static/js/mini_springboot.js" th:src="@{js/mini_springboot.js}"></script></div></body></html>

重要看一下thymeleaf的语法设计风格。

写一个th:fragment=”{id}”

<div th:fragment="footer"> 。。。</div>

能够直接在别的页面 th:include

<th:block th:include="common/footer :: footer"></th:block>

Spring Boot使用thymeleaf模板引擎的,只须求在build.gradle参加正视即可:

//thymeleaf compile("org.springframework.boot:spring-boot-starter-thymeleaf")

Springboot web
app有成都百货上千预约,依据那么些约定,能够省去第一次全国代表大会批判繁冗的安顿。请看标准的工程目录结构

.├── META-INF│ └── MANIFEST.MF├── README.md├── README_.md├── build│ └── kotlin-build│ └── caches│ └── version.txt├── build.gradle├── gradle│ └── wrapper│ ├── gradle-wrapper.jar│ └── gradle-wrapper.properties├── gradlew├── gradlew.bat├── run.bat├── run.sh├── settings.gradle└── src ├── main │ ├── java │ ├── kotlin │ │ └── jason │ │ └── chen │ │ └── mini_springboot │ │ ├── console │ │ │ └── HelloWorld.kt │ │ └── restful │ │ ├── Application.kt │ │ ├── biz │ │ │ └── CustomerService.kt │ │ ├── controller │ │ │ └── CustomerController.kt │ │ ├── entity │ │ │ └── Customer.kt │ │ └── utils │ │ └── DateUtils.kt │ └── resources │ ├── application.properties │ ├── application.yml │ ├── static │ │ ├── css │ │ │ ├── jquery.dataTables.min.css │ │ │ └── mini_springboot.css │ │ ├── images │ │ │ ├── home.png │ │ │ ├── sort_asc.png │ │ │ ├── sort_both.png │ │ │ └── sort_desc.png │ │ └── js │ │ ├── jquery.dataTables.min.js │ │ └── mini_springboot.js │ └── templates │ ├── common │ │ ├── footer.html │ │ └── header.html │ ├── customers.html │ ├── index.html │ ├── productform.html │ ├── products.html │ └── productshow.html └── test ├── java ├── kotlin └── resources30 directories, 35 files

package jason.chen.mini_springboot.restful.controllerimport jason.chen.mini_springboot.restful.biz.CustomerServiceimport org.springframework.stereotype.Controllerimport org.springframework.ui.Modelimport org.springframework.web.bind.annotation.GetMappingimport org.springframework.web.bind.annotation.PathVariableimport org.springframework.web.bind.annotation.ResponseBody@Controllerclass CustomerController(val customerService: CustomerService) { @GetMapping(value = "/") fun index(): String { return "index" } @GetMapping("/customers.do") fun listAll(model: Model): String { val allCustomers = customerService.findAll() model.addAttribute("customers", allCustomers) return "customers" } @GetMapping("/listCustomers") @ResponseBody fun listCustomers(model: Model) = customerService.findAll() @GetMapping("/{lastName}") @ResponseBody fun findByLastName(@PathVariable lastName: String) = customerService.findByLastName}

运转./gradlew bootRun,
运维完成后,访问http://127.0.0.1:9891/customers.do效果如下

图片 5螢幕快速照相2017-0叁-1一 2二.二三.一③.png

本章节工程源码:

https://github.com/MiniSpringBootTutorial/mini\_springboot/tree/use\_thymeleaf\_2017.3.11

Velocity,汉译为:速度、速率、急迅。Velocity是1种Java模版引擎技术,该类型由Apache建议,由此外一种引擎技术Webmacro发展而来。Apache对它的定义是:壹种基于Java的模版引擎,但允许任哪个人使用简单而强大的模板语言来引用定义在Java代码中的对象。近日,http://velocity.apache.org/download.cgi上面的最新的版本是1.7,还是2010-11-29发布的。现在已经不再维护了。

Velocity是MVC框架结构的中MV的完毕,它的关怀点在Model和View之间,作为它们的大桥。

本节大家使用SpringBoot集成velocity开发3个极简的服务监察和控制连串。

咱俩采取SpringBoot 1.肆.五.RELEASE。数据库ORAV4M层我们运用jpa。

默许境况下,Spring
Boot会配置八个VelocityViewResolver,假若须要的是VelocityLayoutViewResolver,你能够友善创设三个名叫velocityViewResolver的bean。你也得以将VelocityProperties实例注入到自定义视图解析器以取得基本的暗中同意设置。

以下示例使用VelocityLayoutViewResolver替换自动配置的velocity视图解析器,并自定义layoutUrl及利用拥有机关配置的性格:

@Bean(name = "velocityViewResolver")public VelocityLayoutViewResolver velocityViewResolver(VelocityProperties properties) { VelocityLayoutViewResolver resolver = new VelocityLayoutViewResolver(); properties.applyToViewResolver; resolver.setLayoutUrl("layout/default.vm"); return resolver;}

1.配置pom依赖

引入spring-boot-starter-parent

<parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <!-- Starter for building MVC web applications using Velocity views. Deprecated since 1.4 --> <version>1.4.5.RELEASE</version> <!--<version>1.5.2.RELEASE</version>--> </parent>

引入velocity-starter

<!--web容器支持 --> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <!--Velocity starter --> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-velocity</artifactId> </dependency>

私下认可配置下spring boot会从src/main/resources/templates目录中去找模板

引入jpa,mysql-connector

 <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-jpa</artifactId> </dependency> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> </dependency>

2.application.properties配置

# VELOCITY TEMPLATES (VelocityAutoConfiguration) 在SpringBootspring.velocity.templateEncoding=UTF-8spring.velocity.properties.input.encoding=UTF-8spring.velocity.properties.output.encoding=UTF-8spring.velocity.resourceLoaderPath=classpath:/templates/spring.velocity.suffix=.htmlserver.port=7001# security#security.user.name=admin#security.user.password=admin# Spring Boot log levellogging.config=logback.xmllogging.level.org.springframework.web: INFO#mysqlspring.datasource.url = jdbc:mysql://127.0.0.1:3306/femon?useUnicode=true&characterEncoding=UTF8spring.datasource.username = qa_connspring.datasource.password = qa_connspring.datasource.driverClassName = com.mysql.jdbc.Driver# Specify the DBMSspring.jpa.database = MYSQL# Show or not log for each sql queryspring.jpa.show-sql = true# Hibernate ddl auto (create, create-drop, update)spring.jpa.hibernate.ddl-auto = update# Naming strategyspring.jpa.hibernate.naming-strategy = org.hibernate.cfg.ImprovedNamingStrategy# stripped before adding them to the entity manager)spring.jpa.properties.hibernate.dialect = org.hibernate.dialect.MySQL5Dialect

3.Dao层代码示例

package com.femon.dao;import java.util.Date;import java.util.List;import com.femon.entity.ServiceData;import org.springframework.data.domain.Page;import org.springframework.data.domain.Pageable;import org.springframework.data.jpa.repository.Query;import org.springframework.data.repository.PagingAndSortingRepository;/** * @author 一剑 2015年12月23日 下午9:34:15 */public interface ServiceDataDao extends PagingAndSortingRepository<ServiceData, Integer> { @Query("select h from ServiceData h where h.serviceId = ?1") List<ServiceData> findByServiceId(int serviceId, Pageable pageable); @Query("select h from ServiceData h where h.serviceId = ?1 and h.sampleTime between ?2 and ?3 ") List<ServiceData> findByServiceIdAndDay(int serviceId, Date dayStart, Date dayEnd, Pageable pageable); @Query("select h from ServiceData h where h.serviceId = ?1 and state=0 and h.sampleTime between ?2 and ?3 ") Page<ServiceData> findFailByServiceIdAndDay(int serviceId, Date dayStart, Date dayEnd, Pageable pageable); ServiceData save(ServiceData h);}

四.Controller层代码示例

package com.femon.controller;import java.text.ParseException;import java.text.SimpleDateFormat;import java.util.ArrayList;import java.util.Calendar;import java.util.Collections;import java.util.Date;import java.util.GregorianCalendar;import java.util.List;import com.alibaba.fastjson.JSON;import com.femon.dao.ServiceDao;import com.femon.dao.ServiceDataDao;import com.femon.entity.Service;import com.femon.entity.ServiceData;import com.femon.result.ServiceDataResult;import org.springframework.beans.factory.annotation.Autowired;import org.springframework.data.domain.Page;import org.springframework.data.domain.PageRequest;import org.springframework.data.domain.Pageable;import org.springframework.data.domain.Sort;import org.springframework.data.web.PageableDefault;import org.springframework.stereotype.Controller;import org.springframework.ui.Model;import org.springframework.web.bind.annotation.PathVariable;import org.springframework.web.bind.annotation.RequestMapping;import org.springframework.web.bind.annotation.RequestMethod;import org.springframework.web.bind.annotation.RequestParam;import org.springframework.web.bind.annotation.ResponseBody;import org.springframework.web.servlet.ModelAndView;/** * @author 一剑 2015年12月29日 下午5:23:22 */@Controllerpublic class ServiceController { @Autowired ServiceDataDao historyDao; @Autowired ServiceDao serviceDao; ...... @RequestMapping(value = "/service", method = RequestMethod.GET) public ModelAndView list(Model model, @RequestParam(value = "page", defaultValue = "0", required = false) int page, @RequestParam(value = "count", defaultValue = "10", required = false) int count, @RequestParam(value = "order", defaultValue = "ASC", required = false) Sort.Direction direction, @RequestParam(value = "sort", defaultValue = "gmtCreate", required = false) String sortProperty, @RequestParam(value = "hostCode", defaultValue = "1", required = false) int hostCode) { ModelAndView modelAndView = new ModelAndView("/service"); Page result = null; if (hostCode == 0) { result = serviceDao.findAll(new PageRequest(page, count, new Sort(direction, sortProperty))); } else { result = serviceDao.findByHost(hostCode, new PageRequest(page, count, new Sort(direction, sortProperty))); } long totalPages = result.getTotalPages(); List<Integer> pageIndexList = new ArrayList<Integer>totalPages); for (int i = 0; i < totalPages; i++) { pageIndexList.add; } int currentPage = page; List<Service> serviceList = result.getContent(); model.addAttribute("serviceList", serviceList); model.addAttribute("pageIndexList", pageIndexList); model.addAttribute("currentPage", currentPage); model.addAttribute("currentHost", hostCode); return modelAndView; } ......}

5.执行定时职分

简易的定时职责的推行,只供给运用@Scheduled注明即可。可是要在起步类方面加上评释@EnableScheduling。

支持cron表达式:

@Scheduled(cron="0 * * * * MON-FRI")

和fixedRate:

@Scheduled(fixedRate = 60000)

等应用方法。

代码示例

@Componentpublic class WatchService { @Scheduled(fixedRate = 60000) public void curlJob() { ... }}

六.运维类代码

利用入口类:Application.java

package com.femon;import org.springframework.boot.SpringApplication;import org.springframework.boot.autoconfigure.EnableAutoConfiguration;import org.springframework.context.annotation.ComponentScan;import org.springframework.context.annotation.Configuration;import org.springframework.scheduling.annotation.EnableScheduling;/** * @author 一剑 */@Configuration@EnableAutoConfiguration@ComponentScan(basePackages = "com.femon")@EnableSchedulingpublic class Application { public static void main(String[] args) { SpringApplication.run(Application.class, args); }}

7.运行测试

Run Application,你将见到如下的输出:

 . ____ _ __ _ _ /\\ / ___'_ __ _ __ __ __ _ \ \ \ \\___ | '_ | '_| | '_ \/ _` | \ \ \ \ \\/ ___)| |_)| | | | | ||  ) ) ' |____| .__|_| |_|_| |_\__, | / / / / =========|_|==============|___/=/_/_/_/ :: Spring Boot :: (v1.4.5.RELEASE)2017-04-05 14:08:35.456 INFO 93948 --- [ main] com.femon.Application : Starting Application on jacks-MacBook-Air.local with PID 93948 (/Users/jack/book/femon/target/classes started by jack in /Users/jack/book/femon)2017-04-05 14:08:35.466 INFO 93948 --- [ main] com.femon.Application : No active profile set, falling back to default profiles: default2017-04-05 14:08:35.742 INFO 93948 --- [ main] ationConfigEmbeddedWebApplicationContext : Refreshing org.springframework.boot.context.embedded.AnnotationConfigEmbeddedWebApplicationContext@36c88a32: startup date [Wed Apr 05 14:08:35 CST 2017]; root of context hierarchy2017-04-05 14:08:37.996 INFO 93948 --- [ main] trationDelegate$BeanPostProcessorChecker : Bean 'org.springframework.transaction.annotation.ProxyTransactionManagementConfiguration' of type [org.springframework.transaction.annotation.ProxyTransactionManagementConfiguration$$EnhancerBySpringCGLIB$$e6b9fa58] is not eligible for getting processed by all BeanPostProcessors (for example: not eligible for auto-proxying)2017-04-05 14:08:38.673 INFO 93948 --- [ main] s.b.c.e.t.TomcatEmbeddedServletContainer : Tomcat initialized with port: 7001 2017-04-05 14:08:38.686 INFO 93948 --- [ main] o.apache.catalina.core.StandardService : Starting service Tomcat2017-04-05 14:08:38.687 INFO 93948 --- [ main] org.apache.catalina.core.StandardEngine : Starting Servlet Engine: Apache Tomcat/8.5.112017-04-05 14:08:38.811 INFO 93948 --- [ost-startStop-1] o.a.c.c.C.[Tomcat].[localhost].[/] : Initializing Spring embedded WebApplicationContext2017-04-05 14:08:38.812 INFO 93948 --- [ost-startStop-1] o.s.web.context.ContextLoader : Root WebApplicationContext: initialization completed in 3079 ms.......2017-04-05 14:08:45.135 INFO 93948 --- [ main] o.s.w.s.v.velocity.VelocityConfigurer : ClasspathResourceLoader with name 'springMacro' added to configured VelocityEngine2017-04-05 14:08:45.471 INFO 93948 --- [ main] o.s.j.e.a.AnnotationMBeanExporter : Registering beans for JMX exposure on startup2017-04-05 14:08:45.486 INFO 93948 --- [ main] s.a.ScheduledAnnotationBeanPostProcessor : No TaskScheduler/ScheduledExecutorService bean found for scheduled processing2017-04-05 14:08:45.576 INFO 93948 --- [ main] s.b.c.e.t.TomcatEmbeddedServletContainer : Tomcat started on port: 7001 2017-04-05 14:08:45.582 INFO 93948 --- [ main] com.femon.Application : Started Application in 11.253 seconds (JVM running for 12.373)

访问:http://localhost:7001/

系统运营效果图:

图片 6劳务列表图片 7服务详情

源代码:https://github.com/EasySpringBoot/femon

Free马克尔是一款模板引擎: 即1种基于模板和要改成的数目,
并用来生成输出文本(HTML网页、电子邮件、配置文件、源代码等)的通用工具。

FreeMarker,其模板编写为Free马克尔 Template
Language,属于不难、专用的言语。

  • ${…}:Free马克尔将会输出真实的值来替换大括号内的表明式,那样的表明式被叫做interpolation。
  • 诠释:注释和HTML的注释也很相像,不过它们选择<#– and
    –>来标识。不像HTML注释那样,FTL注释不汇合世在出口中(不现身在访问者的页面中),因为Free马克尔会跳过它们。
  • FTL标签(Free马克尔模板的语言标签):FTL标签和HTML标签有一部分相似之处,可是它们是Free马克尔的吩咐,是不会在输出中打字与印刷的。那么些标签的名字以#开端。(用户自定义的FTL标签则要求选用@来代替#)

  • 通用性

可见转移各个文件:HTML、XML、CR-VTF、Java源代码等等。
易于嵌入到成品中:轻量级;不供给Servlet环境。
插件式模板载入器:可以从别的源载入模板,如当羊眼半夏件、数据库等等。
能够按所需转变文书:保存到地点文件;作为Email发送;从Web应用程序发送它回到给Web浏览器。

  • 模板语言

帮忙全数常用的命令:include、if/elseif/else、循环结构。
在模板中开创和转移变量。 差不离在任啥地方方都能够采纳复杂表明式来钦定值。
命名的宏,能够具有地方参数和嵌套内容。
名字空间有助于树立和维护可选择的宏库,恐怕将一个大工程分为模块,而无需顾虑名字争持。
输出转换块:在嵌套模板片段生成输出时,转换HTML转义、压缩、语法高亮等等;能够定义本身的变换。

  • 通用数据模型
    FreeMarker不是直接反射到Java对象,Java对象通过插件式对象封装,以变量格局在模板中体现。
    能够应用抽象格局表示对象(JavaBean、XML文书档案、SQL查询结果集等等),告诉模板开发者使用。方法,使其不受技术细节的打扰。

  • Web领域专业性 在模板语言中内建拍卖典型Web相关任务的组织。
    可以融为1体到Model二 Web应用框架中作为JSP的代表。 支持JSP标记库。
    为MVC情势设计:分离可视化设计和应用程序逻辑;分离页面设计员和程序员。

  • 智能的国际化和本土壤化学 字符集智能化(内部采纳UNICODE)。
    数字格式本地化敏感。 日期和时间格式本地化敏感。
    非US字符集能够用作标识。 八种不相同语言的同样模板。

  • XML处理能力 <#recurse>
    和<#visit>指令用于递归遍历XML树。
    在模板中知情和平素的拜访XML对象模型 。

与JSP相比,Free马克尔的3个亮点在于不能够随意突破模板语言起头编写制定Java代码,因而下跌了世界逻辑漏进视图层的危殆可能率。

本节我们付出2个SpringBoot集成freemarker模板引擎的德姆o,基于gradle构建。

1.添加spring-boot-starter-freemarker依赖到pom中

buildscript { ext { springBootVersion = '1.5.2.RELEASE' } repositories { mavenCentral() } dependencies { classpath("org.springframework.boot:spring-boot-gradle-plugin:${springBootVersion}") }}apply plugin: 'java'apply plugin: 'eclipse'apply plugin: 'org.springframework.boot'version = '0.0.1-SNAPSHOT'sourceCompatibility = 1.8repositories { mavenCentral()}dependencies { compile('org.springframework.boot:spring-boot-starter-web') compile('org.springframework.boot:spring-boot-starter-freemarker') testCompile('org.springframework.boot:spring-boot-starter-test')}

2.写后端Controller

package com.example.controller;import java.util.Date;import java.util.Map;import com.example.biz.BookService;import org.springframework.beans.factory.annotation.Autowired;import org.springframework.beans.factory.annotation.Value;import org.springframework.stereotype.Controller;import org.springframework.web.bind.annotation.GetMapping;/** * Created by jack on 2017/4/5. */@Controllerpublic class WelcomeController { @Value("${application.message:Hello,World}") private String message = "Hello,World"; @Autowired BookService bookService; @GetMapping("/welcome") public String welcome(Map<String, Object> model) { model.put("time", new Date; model.put("message", this.message); model.put("books", bookService.findAll; return "welcome"; }}

3.写前端ftl代码

 <!DOCTYPE html><html lang="zh"><body>Date: ${time?date}<br>Time: ${time?time}<br>Message: ${message}<div> <#list books as book> <li>书名: ${book.name}</li> <li>作者: ${book.author}</li> <li>出版社: ${book.press}</li> </#list></div></body></html>

4.周转测试

运维德姆oApplication, 大家将见到如下日志:

2017-04-05 22:05:06.020 INFO 98366 --- [ main] com.example.DemoApplication : Starting DemoApplication on jacks-MacBook-Air.local with PID 98366 (/Users/jack/book/demo/build/classes/main started by jack in /Users/jack/book/demo)......o.s.w.s.v.f.FreeMarkerConfigurer : ClassTemplateLoader for Spring macros added to FreeMarker configuration2017-04-05 22:05:08.848 INFO 98366 --- [ main] o.s.j.e.a.AnnotationMBeanExporter : Registering beans for JMX exposure on startup2017-04-05 22:05:08.911 INFO 98366 --- [ main] s.b.c.e.t.TomcatEmbeddedServletContainer : Tomcat started on port: 5678 2017-04-05 22:05:08.931 INFO 98366 --- [ main] com.example.DemoApplication : Started DemoApplication in 3.37 seconds (JVM running for 4.017)2017-04-05 22:25:02.870 INFO 98366 --- [nio-5678-exec-1] o.a.c.c.C.[Tomcat].[localhost].[/] : Initializing Spring FrameworkServlet 'dispatcherServlet'2017-04-05 22:25:02.872 INFO 98366 --- [nio-5678-exec-1] o.s.web.servlet.DispatcherServlet : FrameworkServlet 'dispatcherServlet': initialization started2017-04-05 22:25:02.902 INFO 98366 --- [nio-5678-exec-1] o.s.web.servlet.DispatcherServlet : FrameworkServlet 'dispatcherServlet': initialization completed in 30 ms

浏览器访问:http://localhost:5678/welcome我们将看到如下输出:

图片 8freemarker
demo

本节工程源码 :

https://github.com/EasySpringBoot/HelloWorld/tree/freemarker\_demo\_2017.4.6

参考资料:

1.http://baike.baidu.com/item/freemarker2.http://freemarker.org/3.http://velocity.apache.org/4.http://baike.baidu.com/item/JSP/141543

相关文章