Apache Velocityのサンプルコードを動かすまで

# Apache Velocityのサンプルコードを動かすまで
自分用のメモとして記載します。
公式サイトを読みながらVelocityの挙動の確認する環境が欲しかったので作りました。
※「Velocityが動けばOK」という感じで環境構築したので、誤りなどがあれば指摘してくださると嬉しいです。

## 必要なもの
- Tomcat 9（サーブレットコンテナ）
- Eclipse（統合開発環境）

## ソースコード一式
下記の手順で作成したソースコード一式のGitリポジトリです。
https://github.com/vicboss1002/velocity_sample

## 手順
1. Tomcatをインストールする
2. TomcatをEclipseにサーバとして設定する
3. EclipseでMaevnプロジェクトを作成する
4. Mavenで依存ライブラリをダウンロードする
5. Velocityのテンプレートファイルをブラウザに表示する
6. JavaからVelocityコンテキストに変数を渡して表示する

### Tomcatをインストールする
以下のサイトから**32-bit/64-bit Windows Service Installer**をダウンロードしてインストールしました。
https://tomcat.apache.org/download-90.cgi
![image.png](https://qiita-image-store.s3.amazonaws.com/0/112941/f8cef4f3-407e-5df1-572c-f51ad6c865b3.png)

### TomcatをEclipseにサーバとして設定する
1. **Window > Preferences > Server > Runtime Environment**を開く
![image.png](https://qiita-image-store.s3.amazonaws.com/0/112941/129a8d19-7004-895f-83d7-ebf076beb608.png)
![image.png](https://qiita-image-store.s3.amazonaws.com/0/112941/f6ba6856-f294-6cba-8a97-14a0fa57f1e3.png)

### EclipseでMavenプロジェクトを作成する
1. **File > New > Maven Project**を選択する
![image.png](https://qiita-image-store.s3.amazonaws.com/0/112941/4d5ac5d1-cbef-3007-3ee6-8710ccf12240.png)
2. **Select an Archetype**で`maven-archetype-webapp`を選択する
![image.png](https://qiita-image-store.s3.amazonaws.com/0/112941/6caeca87-9a3b-e1af-0adf-19ad1ffa1583.png)
3. **GroupId**, **ArtifactId**を指定し、Mavenプロジェクトを作成する
![image.png](https://qiita-image-store.s3.amazonaws.com/0/112941/265d6444-1cd1-e2d8-465b-ef843f204320.png)
![image.png](https://qiita-image-store.s3.amazonaws.com/0/112941/e768248d-f621-be56-5ffc-444f49450eb8.png)

### Mavenで依存ライブラリをダウンロードする
1. **pom.xml**にて、依存ライブラリに以下を指定する

``` pom.xml
<dependency>
	<groupId>javax.servlet</groupId>
	<artifactId>javax.servlet-api</artifactId>
	<version>4.0.0</version>
</dependency>
<dependency>
	<groupId>org.apache.velocity.tools</groupId>
	<artifactId>velocity-tools-generic</artifactId>
	<version>3.0</version>
</dependency>
<dependency>
	<groupId>org.apache.velocity.tools</groupId>
	<artifactId>velocity-tools-view</artifactId>
	<version>3.0</version>
</dependency>
<dependency>
	<groupId>org.apache.velocity.tools</groupId>
	<artifactId>velocity-tools-view-jsp</artifactId>
	<version>3.0</version>
</dependency>
<dependency>
	<groupId>com.republicate</groupId>
	<artifactId>webapp-slf4j-logger</artifactId>
	<version>1.3</version>
</dependency>
```

2. **プロジェクト > Run As > Maven build**を実行する
![image.png](https://qiita-image-store.s3.amazonaws.com/0/112941/0717f624-1fdd-62fb-7331-0b7fcd8c7f51.png)
![image.png](https://qiita-image-store.s3.amazonaws.com/0/112941/50809008-5611-2399-c08b-893adccd1784.png)

### Velocityのテンプレートファイルをブラウザに表示する
1. web.xmlに**VelocityViewServlet**の設定を追記する  
[こちら](http://velocity.apache.org/tools/3.0/view-servlet.html)の記述に基づいてweb.xmlに**VelocityViewServlet**の設定を追記します。

``` web.xml
<!-- ログ出力の設定 -->
<context-param>
	<param-name>webapp-slf4j-logger.level</param-name>
	<param-value>debug</param-value>
</context-param>
<context-param>
	<param-name>webapp-slf4j-logger.format</param-name>
	<param-value>%logger [%level] [%ip] %message</param-value>
</context-param>
<servlet>
	<servlet-name>velocity</servlet-name>
	<servlet-class>
		org.apache.velocity.tools.view.VelocityViewServlet
	</servlet-class>

	<!-- Unless you plan to put your tools.xml and velocity.properties under 
		different folders or give them different names, then these two init-params 
		are unnecessary. The VelocityViewServlet will automatically look for these 
		files in the following locations. -->
	<init-param> 
		<param-name>org.apache.velocity.toolbox</param-name> 
		<param-value>/WEB-INF/tools.xml</param-value> 
	</init-param> 
	<init-param> 
		<param-name>org.apache.velocity.properties</param-name> 
		<param-value>/WEB-INF/velocity.properties</param-value> 
	</init-param>
</servlet>

<!-- Map *.vm files to Velocity -->
<servlet-mapping>
	<servlet-name>velocity</servlet-name>
	<url-pattern>*.vm</url-pattern>
</servlet-mapping>
```

2. **プロジェクトルート > src**直下に、テンプレートファイルを作成する
![image.png](https://qiita-image-store.s3.amazonaws.com/0/112941/5c8252a5-7563-d29e-d096-a79dd7bd1156.png)

``` sample.vm
#set($text = "Velocity World!")
Hello $text
```

3. Eclipseの**Servers**ビューからTomcatを起動する  
![image.png](https://qiita-image-store.s3.amazonaws.com/0/112941/44a7e62f-09c5-6f2b-c41c-9fb7eb4dd10c.png)

4. ブラウザ経由で**sample.vm**を表示確認する
ブラウザのURLに`http://localhost:8080/velocity_sample/sample.vm`を入力し、表示する
![image.png](https://qiita-image-store.s3.amazonaws.com/0/112941/1e85e5e8-273c-6a6a-bb26-acd3f75d4967.png)

これで完了です。
**sample.vm**に記述したVelocityの処理が実行され内容が表示されていることが確認できました。

### JavaからVelocityコンテキストに変数を渡して表示する
1. `VelictyViewServlet`のサブクラスを作成します。

```MyVelocityViewServlet.java
public class MyVelocityViewServlet extends VelocityViewServlet {
	private static final long serialVersionUID = 1L;
    protected Template handleRequest(HttpServletRequest request,
            HttpServletResponse response,
            Context ctx)
	{

    	ctx.put("boolTrue", true);
    	ctx.put("boolFalse", false);
    	ctx.put("number", 1234);
    	ctx.put("string", "abcd");
    	ctx.put("list", Arrays.asList("a", "b", "c", "d"));
    	
    	Map<String, String> map = new HashMap<>();
    	map.put("key1", "value1");
    	map.put("key2", "value2");
    	ctx.put("map", map);
    	return super.handleRequest(request, response, ctx);
	}
}
```

2. web.xmlを以下のように`VelictyViewServlet`のサブクラス用に書き換えます。

```web.xml
<servlet>
	<servlet-name>velocity</servlet-name>
<!-- 		<servlet-class> -->
<!-- 			org.apache.velocity.tools.view.VelocityViewServlet -->
<!-- 		</servlet-class> -->
	<servlet-class>velocity_sample.MyVelocityViewServlet</servlet-class>

	<!-- Unless you plan to put your tools.xml and velocity.properties under 
		different folders or give them different names, then these two init-params 
		are unnecessary. The VelocityViewServlet will automatically look for these 
		files in the following locations. -->
	<init-param>
		<param-name>org.apache.velocity.toolbox</param-name>
		<param-value>/WEB-INF/tools.xml</param-value>
	</init-param>
	<init-param>
		<param-name>org.apache.velocity.properties</param-name>
		<param-value>/WEB-INF/velocity.properties</param-value>
	</init-param>
</servlet>
```

3. Javaから設定された変数を呼び出すテンプレートファイルを作成する

```sample_of_context.vm
\${boolTrue}: ${boolTrue}<br/>
\${boolFalse}: ${boolFalse}<br/>
\${number}: ${number}<br/>
\${string}: ${string}<br/>
\${list}: ${list}<br/>
\${map}: ${map}<br/>
```

以下のように出力される。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/112941/3289f73d-d8e9-e44c-61e2-f1e96634f154.png)