Velocityでのシングルクォーテーションとダブルクォーテーションの扱いによるエラーについて

シングルクォーテーションとダブルクォーテーションを正しく使わない場合に

よく起こるエラーとしては次のようなものがあります。

  1. 文字列に変換し忘れていることによるエラー
  2. クォーテーションのネストによるエラー

 

 例えば、次のような場合にはエラーとなります。

## 文字列に変換し忘れていることによるエラー
 #set($a = hoge)
 #set($a = hoge+$dayOfWeek)
## クォーテーションのネストによるエラー
 明後日は${Util.getNext("${Util.getNext("${Monday.getToday()}").getToday()}").getToday()}
 明後日は${Util.getNext('${Util.getNext('月曜日').getToday()}').getToday()}
  1の次は#showString("#nextNumber("1")")

エラーを避けるためには、次のようにします。

##""もしくは''を使って文字列に変換する
 #set($a = "hoge")
 #set($a = "hoge+$dayOfWeek")

##シングルクォーテーション同士、ダブルクォーテーション同士のネストを避ける
 明後日は${Util.getNext("${Util.getNext(${Monday.getToday()}).getToday()}").getToday()}
 明後日は${Util.getNext("${Util.getNext('月曜日').getToday()}").getToday()}
  1の次は#showString("#nextNumber('1')")

 

 なお、変数・マクロ・メソッドは次のように定義

context.put("dayOfWeek", "月曜日");
context.put("Monday", new Day("月曜日")); 
context.put("Util", new Day(""));
#macro(nextNumber $number)
#if($number == "1")2
#end
#end

#macro(showString $number)
$number
#end
public class Day {

    String today;
    public Day(String string) {
        today=string;
    }
    public String getToday(){
        return today;
    }

    public static Day getNext(String day){
        Day tomorrow=new Day("");
        switch (day){
         case "月曜日":tomorrow= new Day("火曜日");break;
         case "火曜日":tomorrow= new Day("水曜日");break;
         case "水曜日":tomorrow= new Day("木曜日");break;
         case "木曜日":tomorrow= new Day("金曜日");break;
         case "金曜日":tomorrow= new Day("土曜日");break;
         case "土曜日":tomorrow= new Day("日曜日");break;
         case "日曜日":tomorrow= new Day("月曜日");break;
        }
        return tomorrow;
    }

}