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

Velocityのシングルクォーテーションとダブルクォーテーションは、#set関数の中、#macroの引数、メソッドの引数で特殊な意味を持ち、

  ・シングルクォーテーションで囲った場合(‘~’):文字列を表す。変数は置き換えない。

  ・ダブルクォーテーション囲った場合(“~”):文字列を表す。変数は置き換える。

となっています。

具体的には次のようになります。

 

      1. 関数外で’~’および”~”を使った場合にはそのままシングルクォーテーションとダブルクォーテーションが出力されます。

         例:

        context.put("dayOfWeek", "月曜日");
         今日は${dayOfWeek}
         今日は'${dayOfWeek}'
         今日は"${dayOfWeek}"
         <h1 class="${dayOfWeek}">
         今日は""${dayOfWeek}""

         出力:

         今日は月曜日
         今日は'月曜日'
         今日は"月曜日"
         <h1 class="月曜日">
         今日は""月曜日""
      2. setやmacro,メソッドなどの関数の引数では囲った中身が文字列として解釈されます。

          関数の中で’~’および”~”を使った例:

        #set($a = ${dayOfWeek})
         今日は${a}
        #set($a = "${dayOfWeek}")
         今日は${a}
        #set($a = "$dayOfWeek")
         今日は${a}
        #set($a = '$dayOfWeek')
         今日は${a}
        
        ##macroの場合
        #macro(nextNumber $number)
        #if($number == "1")2
        #end
        #end
        #macro(showString $number)
        $number
        #end
          1の次は#showString("#nextNumber('1')")
          1の次は#showString('#nextNumber('1')')
        
        ##メソッドの引数の場合
         明日は${Util.getNext(${Monday.getToday()}).getToday()}
         明日は${Util.getNext("${Monday.getToday()}").getToday()}
         明日は${Util.getNext('${Monday.getToday()}').getToday()}

         出力:

         今日は月曜日
         今日は月曜日
         今日は月曜日
         今日は$dayOfWeek
        
          1の次は2
          1の次は#nextNumber(
        
         明日は火曜日
         明日は火曜日
         明日は

 

なお、メソッドは次のように定義

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;
    }

}
context.put("Monday", new Day("月曜日")); 
context.put("Util", new Day(""));