velocity.propertiesVelocity 通過 ResourceLoader 載入模版,兩種主流模式:
file.resource.loader.class = org.apache.velocity.runtime.resource.loader.ClasspathResourceLoader
input.encoding = UTF-8
output.encoding = UTF-8
src/main/resources/
velocity.properties
templates/
list.vm
VelocityEngine ve = new VelocityEngine();
InputStream is = this.getClass().getResourceAsStream("/velocity.properties");
Properties props = new Properties();
props.load(is);
ve.init(props);
Template template = ve.getTemplate("templates/list.vm"); // classpath 相對路徑
context.put("orders", orders);
StringWriter writer = new StringWriter();
template.merge(context, writer);
return writer.toString();
VelocityViewServlet)public class ListServlet extends VelocityViewServlet {
@Override
protected Template handleRequest(HttpServletRequest req, HttpServletResponse resp, Context ctx) {
// ... 準備數據 ...
ctx.put("orders", orders);
// 手動初始化引擎(或依賴父類已初始化)
VelocityEngine ve = new VelocityEngine();
InputStream is = getClass().getResourceAsStream("/velocity.properties");
Properties props = new Properties();
props.load(is);
ve.init(props);
return ve.getTemplate("templates/list.vm");
}
}
resource.loader = webapp
webapp.resource.loader.class = org.apache.velocity.tools.view.servlet.WebappLoader
webapp.resource.loader.path = /WEB-INF/vm/
input.encoding = UTF-8
output.encoding = UTF-8
src/main/webapp/
WEB-INF/
vm/
list.vm
velocity.properties
web.xml
public class ListServlet extends VelocityViewServlet {
@Override
protected Template handleRequest(HttpServletRequest req, HttpServletResponse resp, Context ctx) {
// ... 準備數據 ...
ctx.put("orders", orders);
return getTemplate("list.vm"); // 父類自動使用 WebappLoader 解析路徑
}
}
<servlet>
<servlet-name>velocity</servlet-name>
<servlet-class>org.apache.velocity.tools.view.servlet.VelocityViewServlet</servlet-class>
<init-param>
<param-name>properties-file</param-name>
<param-value>/WEB-INF/velocity.properties</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>velocity</servlet-name>
<url-pattern>*.vm</url-pattern>
</servlet-mapping>
| 維度 | Classpath Loader | Webapp Loader |
|---|---|---|
| 模版位置 | Classpath (src/main/resources, Jar內) | Webapp 物理路徑 (/WEB-INF/vm/) |
| 熱加載 | 需重啟/重新打包 | 支援運行時修改即時生效 |
| 初始化方式 | 手動 ve.init(props) | 父類 VelocityViewServlet 自動 |
| 獲取模版 | ve.getTemplate("path") | getTemplate("name") (相對 path) |
| 適用場景 | 獨立應用、微服務、測試、靜態模版 | 傳統 Web 應用、頻繁調整頁面 |
list.vm<html>
<body>
#foreach($order in $orders)
$order.item $order.type $order.price<br/>
#end
</body>
</html>
spring-boot-starter-velocity 自動配置,屬於 Classpath 模式增強版。ResourceLoader 機制,能快速排查「模版找不到」「編碼亂碼」「修改不生效」等常見問題。