失敗
SAStruts において、ビューファイルは sastruts.VIEW_PREFIX (デフォルトは /WEB-INF/view) 以下に配置します。 HTML テンプレートのリンクには、これらのファイルへのパスを指定することになります。
しかし、アプリケーションサーバ上で実行する場合には、 当然アクセス不可となります (図1) 。 逆に、実行時のパスをリンクに指定すると、HTML テンプレートをブラウザだけでプレビューする場合にリンクが辿れなくなります。
アプリケーションサーバ上で実行する場合も、ブラウザだけでプレビューする場合にも、有効なパスを指定するにはどうすればよいのでしょうか?
環境
このレポートは、以下の環境について記述したものです。
| JDK | Java SE Development Kit 6 Update 18 |
| Seasar |
|
原因
ビューファイルの物理的な配置場所と SAStruts を経由した URL が異なるためです。
解決策
PathAdjuster をカスタマイズし、パスから sastruts.VIEW_PREFIX を取り除きます。
(1) PathAdjuster のカスタマイズ
org.seasar.mayaa.impl.builder.PathAdjusterImpl を継承したクラスを作成します。 adjustRelativePath メソッドをオーバーライドし、sastruts.VIEW_PREFIX を取り除く処理を追加します。
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 の完全修飾クラス名を指定します。
<?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 が取り除かれます (図2) 。
