Mayaa + SAStruts - PathAdjuster で sastruts.VIEW_PREFIX (/WEB-INF/view) を取り除く

失敗

sastruts.VIEW_PREFIX (/WEB-INF/view) へはアクセスできない
図1 /WEB-INF/view へはアクセス不可

図1 /WEB-INF/view へはアクセス不可

SAStruts において、ビューファイルは sastruts.VIEW_PREFIX (デフォルトは /WEB-INF/view) 以下に配置します。 HTML テンプレートのリンクには、これらのファイルへのパスを指定することになります。

しかし、アプリケーションサーバ上で実行する場合には、 当然アクセス不可となります (図1) 。 逆に、実行時のパスをリンクに指定すると、HTML テンプレートをブラウザだけでプレビューする場合にリンクが辿れなくなります。

アプリケーションサーバ上で実行する場合も、ブラウザだけでプレビューする場合にも、有効なパスを指定するにはどうすればよいのでしょうか?

環境

このレポートは、以下の環境について記述したものです。

JDK Java SE Development Kit 6 Update 18
Seasar
  • S2Container 2.4.40
  • SAStruts 1.0.4 SP 7
  • Mayaa 1.1.27

原因

ビューファイルの物理的な配置場所と SAStruts を経由した URL が異なるためです。

解決策

PathAdjuster をカスタマイズし、パスから sastruts.VIEW_PREFIX を取り除きます。

(1) PathAdjuster のカスタマイズ

org.seasar.mayaa.impl.builder.PathAdjusterImpl を継承したクラスを作成します。 adjustRelativePath メソッドをオーバーライドし、sastruts.VIEW_PREFIX を取り除く処理を追加します。

[CustomPathAdjuster - PathAdjuster の拡張]
package mysample.mayaa;

import javax.servlet.ServletContext;

import org.seasar.framework.container.SingletonS2Container;
import org.seasar.framework.util.StringUtil;
import org.seasar.mayaa.impl.builder.PathAdjusterImpl;

/**
 * {@see PathAdjusterImpl} に、SAStruts との連携を追加します。
 */
public class CustomPathAdjuster extends PathAdjusterImpl {
	private static final long serialVersionUID = 1L;

	/** sastruts.VIEW_PREFIX */
	private String viewPrefix;

	/**
	 * {@see PathAdjusterImpl#adjustRelativePath(String, String)}
	 * によって調整されたパスから、sastruts.VIEW_PREFIX を取り除きます。
	 * 
	 * @param base
	 *            リンク元パス
	 * @param path
	 *            リンク先パス
	 * @return 調整したパス
	 */
	@Override
	public String adjustRelativePath(String base, String path) {
		String newPath = super.adjustRelativePath(base, path);
		return StringUtil.trimPrefix(newPath, getViewPrefix());
	}

	/**
	 * context-param に定義された sastruts.VIEW_PREFIX の値を取得します。
	 * 
	 * @return sastruts.VIEW_PREFIX の値
	 */
	private String getViewPrefix() {
		if (StringUtil.isEmpty(viewPrefix)) {
			ServletContext context = 
				SingletonS2Container.getComponent(ServletContext.class);
			viewPrefix = context.getInitParameter("sastruts.VIEW_PREFIX");
		}
		return viewPrefix;
	}
}

(2) パス自動調整の設定

resources/META-INF/org.seasar.mayaa.provider.ServiceProvider に、PathAdjuster 要素を追加します。 class 属性には、(1) で作成した CustomPathAdjuster の完全修飾クラス名を指定します。

[org.seasar.mayaa.provider.ServiceProvider - パス自動調整の設定]
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE provider
	PUBLIC "-//The Seasar Foundation//DTD Mayaa Provider 1.0//EN"
	"http://mayaa.seasar.org/dtd/mayaa-provider_1_0.dtd">
<provider>
	(略)
	<pathAdjuster class="mysample.mayaa.CustomPathAdjuster">
		<parameter name="enabled" value="true"/><!-- パス自動調整の有効/無効 -->
		<parameter name="force" value="true"/><!-- "./*"以外も調整するか否か -->
	</pathAdjuster>
</provider>
sastruts.VIEW_PREFIX (/WEB-INF/view) が取り除かれる
図2 sastruts.VIEW_PREFIX が取り除かれる

図2 sastruts.VIEW_PREFIX が取り除かれる

以上で、リンクから sastruts.VIEW_PREFIX が取り除かれます (図2) 。

参考サイト

コメント

コメント投稿
(非公開)
     « アイコン一覧 »
(必須)

作成日:2010/03/10
更新日:2010/03/10