Struts 2ベースのFreemarkerマクロによるデータとページの分離


Struts 2とFreemarkerを用いた開発では,Freemarkerのマクロ(macro)を用いてデータとページの分離効果を達成し,ページ開発者とバックグラウンドビジネス開発者を分離し,ビジネスコードの再利用性を向上させることができる.
      主な考え方は以下の通りです.
      まずはStruts 2コード
 
package com.test.mms.article.web.tag;

import org.apache.struts2.ServletActionContext;
import org.springframework.context.annotation.Scope;

import com.opensymphony.xwork2.ActionSupport;

@SuppressWarnings("serial")
@Scope("prototype")
public class TagAction extends ActionSupport {

	public String execute() {
		String[] names = { "Lucy", "Lily", "Gordon" };
		ServletActionContext.getRequest().setAttribute("names", names);
		return SUCCESS;
	}
}
    続いてFreemarkerのマクロ宣言で、struts2-convention-pluginが使用されているため、プロファイル指定ジャンプ関係は必要ありません.
 
<#macro Test_tag >
	<@s.action name="tag" namespace="/article/web/tag" executeResult="false">
    </@s.action>
    	<#nested names>
</#macro>
 
    TagActionを要求してexecuteResultをfalseとして指定し、ページを返さずrequestからのみデータを取得します.
 
    次に、マクロを具体的に呼び出すページを示します.MMSはFreemarkerのネーミングスペースです.
<@MMS.Test_tag >
	<#if names??>
	<ul>
		<#list names as name>
		<li>
			${name}
		</li>
		</#list>
	</ul>
	<#else>
		    
	</#if>
</@MMS.Test_tag>
 
   MMS.Test_tagマクロの宣言は、以下のように最適化することもできる.
<#macro Test_tag inner="1">
	<@s.action name="tag" namespace="/article/web/tag" executeResult="false">
    </@s.action>
    	<#nested names,ages,educations>
	    <#if inner="0">
	   		 <#if names??>
				<#list names as name>
				<span>${name}</span>
				</#list>
			</#if>
	    </#if>
</#macro>
     簡単な説明では、マクロに新しいパラメータinnerのデフォルト値は1であり、innerが0の場合、namesにデフォルトのスタイルが提供され、ages、educationsは他の2つのデータのセットにデフォルトのスタイルが提供されません.