Velocity:基于Java的模板引擎具则,可以用Java代碼渲染的簡(jiǎn)單而又強(qiáng)大的模板語(yǔ)言三圆。開(kāi)發(fā)Web時(shí),可以將Web頁(yè)面和Java代碼分離谁撼,類似JSP和PHP。詳細(xì)介紹:參見(jiàn)官網(wǎng):Apache Velocity Project
本篇文章以發(fā)送郵件為例子滋饲,介紹一下Velocity簡(jiǎn)單的實(shí)際用法
步驟:pom.xml引入包 => xml文件添加配置 => 配置視圖 => Java代碼
步驟一:maven添加依賴包
pom.xml文件里引入下面的配置代碼
<dependency>
<groupId>org.apache.velocity</groupId>
<artifactId>velocity</artifactId>
<version>1.7</version>
</dependency>
<dependency>
<groupId>org.apache.velocity</groupId>
<artifactId>velocity-tools</artifactId>
<version>2.0</version>
</dependency>
步驟二:xml里面添加Velocity配置
在配置文件applicationContext.xml中加入配置厉碟,這里可以有兩種方式
- 配置文件方式,即Velocity的屬性通過(guò)配置文件方式來(lái)設(shè)置
<bean id="velocityEngine" class="org.springframework.ui.velocity.VelocityEngineFactoryBean">
<property name="resourceLoaderPath" value="/WEB-INF/velocity/"/><!-- 模板存放的路徑 -->
<property name="configLocation" value="classpath:velocity.properties"/><!-- Velocity的配置文件 -->
</bean>
resources下面新建velocity.properties文件
input.encoding=UTF-8
output.encoding=UTF-8
contentType=ext/html;charset=UTF-8
directive.foreach.counter.name=loopCounter
directive.foreach.counter.initial.value=0
- 直接設(shè)置屬性方式屠缭,即Velocity的屬性通過(guò)<prop>標(biāo)簽直接設(shè)置箍鼓,也就是將第一種方式合為一步,省去單獨(dú)設(shè)置配置文件的麻煩
<bean id="velocityEngine" class="org.springframework.ui.velocity.VelocityEngineFactoryBean">
<property name="resourceLoaderPath" value="/WEB-INF/velocity/"/><!-- 模板存放的路徑 -->
<property name="velocityProperties">
<props>
<prop key="directive.foreach.counter.name">loopCounter</prop>
<prop key="directive.foreach.counter.initial.value">0</prop>
<prop key="contentType">text/html;charset=UTF-8</prop>
<prop key="input.encoding">UTF-8</prop>
<prop key="output.encoding">UTF-8</prop>
</props>
</property>
</bean>
步驟三:配置視圖
在WEB-INF路徑下新建velocity文件夾呵曹,文件夾里新建后綴為vm的模板文件款咖,這里說(shuō)的文件路徑對(duì)應(yīng)步驟二中的模板存放路徑
下面是一個(gè)簡(jiǎn)單的郵件模板,模板內(nèi)容是一個(gè)表格奄喂,也就是發(fā)送一個(gè)內(nèi)容為一個(gè)表格的郵件铐殃。其中,表格的body是通過(guò)二層for循環(huán)動(dòng)態(tài)設(shè)定的數(shù)據(jù)跨新,具體的velocity語(yǔ)法富腊,自行百度
<!DOCTYPE html>
<html>
<head lang="en">
<meta charset="UTF-8">
<title></title>
<style>
table {
border-collapse: collapse;
width: 100%;
}
td {
padding: 6px 8px;
text-align: center;
border: solid #000 1px;
}
th {
padding: 6px 8px;
background: #e2e2e2;
border: solid #000 1px;
}
</style>
</head>
<body>
<h3>數(shù)據(jù)日期:${date}</h3>
<table>
<thead>
<tr>
<th>數(shù)據(jù)A</th>
<th>數(shù)據(jù)B</th>
<th>數(shù)據(jù)C</th>
<th>數(shù)據(jù)D</th>
</tr>
</thead>
<tbody>
#foreach($rowData in $data)
<tr>
#foreach($columnData in $rowData)
<td>$columnData</td>
#end
</tr>
#end
</tbody>
</table>
</body>
</html>
步驟四:Java代碼初始化數(shù)據(jù)
這里不介紹具體的發(fā)送郵件的Api,類似JavaMail的庫(kù)網(wǎng)上很多域帐。步驟三中寫(xiě)好了模板文件赘被,現(xiàn)在需要利用Java代碼將數(shù)據(jù)填充到模板文件里面,這里用Map數(shù)據(jù)結(jié)構(gòu)存放需要渲染的原始數(shù)據(jù)
private void sendMail() throws JobExecutionException {
String[] to = { "收件人" };
String subject = "主題";
String[] cc = {};
Map<String, Object> model = new HashMap<>();
model.put("date", "2017-09-17");
List<List> data = new ArrayList<>();
List row1 = new ArrayList();
list.add("A data");
list.add("B data");
list.add("C data");
list.add("D data");
List row2 = new ArrayList();
list.add("A data");
list.add("B data");
list.add("C data");
list.add("D data");
data.add(row1);
data.add(row2);
model.put("data", list);
String body = VelocityEngineUtils.mergeTemplateIntoString(velocityEngine, "DataValidator.vm", "UTF-8", model);
try {
EmailUtil.send(to, subject, body, cc);
} catch (Exception e) {
e.printStackTrace();
}
}
注意肖揣,velocityEngine需要注入一下這個(gè)實(shí)例民假,例如在serviceImpl中通過(guò)@Autowired注入
@Autowired
private VelocityEngine velocityEngine;