> Velocity is a Java-based template engine. It permits anyone to use a simple yet powerful template language to reference objects defined in Java code.
>
> When Velocity is used for web development, Web designers can work in parallel with Java programmers to develop web sites according to the Model-View-Controller (MVC) model, meaning that web page designers can focus solely on creating a site that looks good, and programmers can focus solely on writing top-notch code. Velocity separates Java code from the web pages, making the web site more maintainable over its lifespan and providing a viable alternative to Java Server Pages (JSPs) or PHP.
以上內容摘自[velocity的官方首頁](http://velocity.apache.org/engine/devel/)。
以下通過示例來說明velocity的使用。
## [](https://github.com/someus/another-tutorial-about-java-web/blob/master/00-06.md#項目結構)項目結構
在[http://velocity.apache.org/download.cgi](http://velocity.apache.org/download.cgi)中下載velocity-1.7、velocity-tools-2.0。
參考[00-03、從JSP開始](https://github.com/someus/another-tutorial-about-java-web/blob/master/00-03.md)所述,創建項目`Project_0006_Velocity`,導入相關的jar,編寫代碼。
項目結構如下:
[](https://github.com/someus/another-tutorial-about-java-web/blob/master/img/00-06/01.png)
對于新增的jar,放到/WEB-INF/lib目錄即可。但當多個webApp要使用時,放入CLASSPATH或Servlet容器(如Tomcat)的頂層lib是最好的選擇.
## [](https://github.com/someus/another-tutorial-about-java-web/blob/master/00-06.md#代碼)代碼
web.xml(在這一節,該文件可以忽略):
~~~
<?xml version="1.0" encoding="UTF-8"?>
<web-app version="3.1" xmlns="http://xmlns.jcp.org/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd">
<servlet-mapping>
<servlet-name>default</servlet-name>
<url-pattern>*.jpg</url-pattern>
</servlet-mapping>
<servlet-mapping>
<servlet-name>default</servlet-name>
<url-pattern>*.png</url-pattern>
</servlet-mapping>
<servlet-mapping>
<servlet-name>default</servlet-name>
<url-pattern>*.js</url-pattern>
</servlet-mapping>
<servlet-mapping>
<servlet-name>default</servlet-name>
<url-pattern>*.css</url-pattern>
</servlet-mapping>
<session-config>
<session-timeout>
30
</session-timeout>
</session-config>
</web-app>
~~~
hello.vm:
~~~
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
</head>
<body>
#set( $this = "Velocity")
$this is great! <br/>
$name <br/>
hi , i am letian
<h1>你好</h1>
</body>
</html>
~~~
HelloServlet.java:
~~~
package me.letiantian.servlet;
import java.io.IOException;
import java.io.PrintWriter;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.util.Properties;
import java.io.StringWriter;
import org.apache.velocity.app.Velocity;
import org.apache.velocity.app.VelocityEngine;
import org.apache.velocity.VelocityContext;
@WebServlet(name = "HelloServlet", urlPatterns = {"/hello"})
public class HelloServlet extends HttpServlet {
protected void processRequest(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
response.setContentType("text/html;charset=UTF-8");
PrintWriter out = response.getWriter();
Properties properties=new Properties();
properties.setProperty("resource.loader", "webapp");
properties.setProperty("webapp.resource.loader.class", "org.apache.velocity.tools.view.servlet.WebappLoader");
properties.setProperty("webapp.resource.loader.path", "/WEB-INF/template");
properties.setProperty(Velocity.ENCODING_DEFAULT, "UTF-8");
properties.setProperty(Velocity.INPUT_ENCODING, "UTF-8");
properties.setProperty(Velocity.OUTPUT_ENCODING, "UTF-8");
VelocityEngine velocityEngine = new VelocityEngine(properties);
velocityEngine.setApplicationAttribute("javax.servlet.ServletContext", request.getServletContext());
VelocityContext context=new VelocityContext();
context.put("name", "user01");
StringWriter sw = new StringWriter();
velocityEngine.mergeTemplate("hello.vm", "utf-8", context, sw);
// velocityEngine.mergeTemplate("hello.vm", "utf-8", context, sw); //如果這行不注釋,hello.vm的內容會出現兩次
out.println(sw.toString());
}
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
processRequest(request, response);
}
@Override
protected void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
processRequest(request, response);
}
}
~~~
運行項目,用瀏覽器訪問`http://127.0.0.1:8084/Project_0006_Velocity/hello`:?[](https://github.com/someus/another-tutorial-about-java-web/blob/master/img/00-06/02.png)
## [](https://github.com/someus/another-tutorial-about-java-web/blob/master/00-06.md#改進上面的代碼)改進上面的代碼
在WEB-INF目錄下創建`velocity.properties`文件,其內容如下:
~~~
resource.loader=webapp
webapp.resource.loader.class=org.apache.velocity.tools.view.servlet.WebappLoader
webapp.resource.loader.path=/WEB-INF/template/
input.encoding=utf-8
output.encoding=utf-8
~~~
修改HelloServlet.java:
~~~
package me.letiantian.servlet;
import java.io.IOException;
import java.io.PrintWriter;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.util.Properties;
import java.io.StringWriter;
import org.apache.velocity.app.VelocityEngine;
import org.apache.velocity.VelocityContext;
@WebServlet(name = "HelloServlet", urlPatterns = {"/hello"})
public class HelloServlet extends HttpServlet {
protected void processRequest(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
response.setContentType("text/html;charset=UTF-8");
PrintWriter out = response.getWriter();
Properties properties=new Properties();
properties.load(getServletContext().getResourceAsStream("/WEB-INF/velocity.properties"));
VelocityEngine velocityEngine = new VelocityEngine(properties);
velocityEngine.setApplicationAttribute("javax.servlet.ServletContext", request.getServletContext());
VelocityContext context=new VelocityContext();
context.put("name", "user01");
StringWriter sw = new StringWriter();
velocityEngine.mergeTemplate("hello.vm", "utf-8", context, sw);
out.println(sw.toString());
}
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
processRequest(request, response);
}
@Override
protected void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
processRequest(request, response);
}
}
~~~
## [](https://github.com/someus/another-tutorial-about-java-web/blob/master/00-06.md#資料)資料
[velocity模板加載](http://www.blogjava.net/sxyx2008/archive/2010/11/11/337799.html)
[velocity整合servlet](http://www.blogjava.net/sxyx2008/archive/2010/11/11/337819.html)
[Velocity三——基于Servlet+Velocity的web應用](http://bit1129.iteye.com/blog/2106142)
[使用 Velocity 實現客戶端和服務器端模板](http://www.ibm.com/developerworks/cn/java/j-velocity/)
[Servlet 知識詳解(一)之 —— ServletContext對象 和 ServletConfig對象 學習筆記](http://even2012.iteye.com/blog/1838063)
- JSP & Servlet
- 00-00、序
- 00-01、相關軟件的安裝
- 00-02、理解HTTP
- 00-03、從JSP開始
- 00-04、理解Servlet
- 00-05、過濾器與監聽器
- 00-06、使用velocity模板引擎
- 00-07、使用數據庫連接池
- 00-08、Tomcat的運行機制
- Spring MVC
- 01-00、Spring與依賴注入
- 01-01、Spring與面向切面編程
- 01-02、使用Spring MVC構建Hello World
- 01-03、JdbcTemplate
- 01-04、基于注解的URL映射
- 01-05、JSON
- 01-06、校驗器
- 01-07、國際化
- 01-08、攔截器
- 01-09、文件上傳
- 01-10、轉換器與格式化
- Book
- Online Tutorial
- Q & A
- Learn More
- Supplement