Velocity:基于Java的模板引擎,可以用Java代碼渲染的簡單而又強大的模板語言。開發Web時,可以將Web頁面和Java代碼分離,類似JSP和PHP。詳細介紹:參見官網:Apache Velocity Project
本篇文章以發送郵件為例子,介紹一下Velocity簡單的實際用法
步驟: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的屬性通過配置文件方式來設置
<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
- 直接設置屬性方式,即Velocity的屬性通過<prop>標簽直接設置,也就是將第一種方式合為一步,省去單獨設置配置文件的麻煩
<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的模板文件,這里說的文件路徑對應步驟二中的模板存放路徑
下面是一個簡單的郵件模板,模板內容是一個表格,也就是發送一個內容為一個表格的郵件。其中,表格的body是通過二層for循環動態設定的數據,具體的velocity語法,自行百度
<!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>數據日期:${date}</h3>
<table>
<thead>
<tr>
<th>數據A</th>
<th>數據B</th>
<th>數據C</th>
<th>數據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代碼初始化數據
這里不介紹具體的發送郵件的Api,類似JavaMail的庫網上很多。步驟三中寫好了模板文件,現在需要利用Java代碼將數據填充到模板文件里面,這里用Map數據結構存放需要渲染的原始數據
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需要注入一下這個實例,例如在serviceImpl中通過@Autowired注入
@Autowired
private VelocityEngine velocityEngine;