Struts1.3.5でクロスサイトスクリプティング対策
クロスサイトスクリプティング対策について
Strutsのタグライブラリ
bean:writeなどのタグリブを使えば「<」といった文字を「<」みたいに変換してくれる。
内部ではどうなっているのか?
調べてみると「ResponseUtils」ががんばってくれているらしい。このクラスは使えそうだなー。
Strutsベストプラクティス
スペシャルサンクス>http://graphite.que.jp/d/20050606.html 元ネタ>http://www.jaxmag.com/itr/online_artikel/psecom,id,648,nodeid,147.html Use intermediate Action class for common operations
一般的な操作のために中間Actionクラスを使いましょう。
共通のメソッドは中間Actionクラスを作成して共通化する。Actionクラスを継承するIntermediateActionクラスを定義し、Webアプリケーション内で使われるクラスはこのクラスを必ず継承するようにする。
Use DispatchAction to group related actions into a single class
関連するActionを1クラスにグループ化するためにDispatchActionクラスを使いましょう。
追加、削除、更新などのメソッドが同じ機能の一部であるような場合、それぞれActionクラスを作るわけではなく、DispachActionクラスを使うようにする。
Struts1.3.5のクイックスタートメモ
Strutsを使う時に、どこに何があるのかなどを情報をまとめる。
前提条件として、Struts、Tiles、Validatorは動く状態になっているとする。
Struts Webアプリケーションのプレゼンテーション層を得意とするフレームワーク。 Tiles 画面レイアウトを設定で簡単に行えるフレームワーク。 Validator エラーチェックを設定で簡単に行えるフレームワーク。 登場人物 JSP 画面を表現する。 ActionServlet Strutsのコントローラ。ActionやFormなどを管理する人。 Actionクラス ボタンを押した時などのアクションに対応したクラス。 Formクラス JSPとStrutsの間でパラメタなどの受け渡しをするクラス。 web.xml Webアプリケーションの設定を記述するファイル。 struts-config.xml StrutsのActionやFormの設定を記述するファイル。 tiles-def.xml Strutsと連携して動作するTilesの設定ファイル。画面定義やレイアウト、配置などを設定できる。 validation.xml Strutsと連携して動作するvalidationの設定ファイル。妥当性チェックの定義などを設定できる。 手順の概要 tiles-def.xmlで画面を定義する 作成する画面に対応したActionクラス、Formクラスをstruts-config.xmlに記述する Actionクラス、Formクラスを実装する Strutsのタグリブ(htmlタグ)を利用してJSPを記述する ブラウザから動作を確認する
tiles-defs.xml
画面を定義してStrutsとTilesで使う「画面名」を定義する。
<definition name=”layout” path=”/WEB-INF/jsp/layout.jsp”>
<put name=”header” value=”/WEB-INF/jsp/header.jsp” />
<put name=”menu” value=”/WEB-INF/jsp/menu.jsp” />
<put name=”content” value=”" />
<put name=”footer” value=”/WEB-INF/jsp/footer.jsp” />
</definition>
<definition name=”login” extends=”layout”>
<put name=”content” value=”/WEB-INF/jsp/login.jsp” />
</definition>
上記例の場合、「layout」という名前の基本となる画面を定義している。さらに、「login」という名前の画面は、layoutを継承し、content部分だけ「login.jsp」に摩り替えて定義している。
//layout
headerにheader.jsp
menuにmenu.jsp
contentは定義せず
fopoterにfooter.jsp //login
headerはlayoutと同じ
menuはlayoutと同じ
contentはTop.jsp
footerはlayoutと同じ
こうすることで、layoutで定義したレイアウトを使いまわして、似通ったレイアウトのページを定義することができる。
struts-config.xml
画面の製造で使用するActionクラスとFormクラスをまずは設定する。
例としてLogin画面を考えてみる。
ログイン画面には2つのテキストボックスと1つのログインボタンがあるものとする。この画面に対してStrutsを使って設計を行うとすると・・・
ログインボタンはログインAcitonになりそう 画面からの入力は2項目なので、Formに2項目作ればよさそう ログインに成功したら次のページに遷移して、エラーの場合はログイン画面に戻ってエラーメッセージをだせばいいかも
では、上記3点を踏まえて、必要そうなものをstruts-config.xmlに記述してみる。まずはForm。
<form-beans>
<form-bean name=”LoginForm” type=”com.daipresents.LoginForm” />
</form-beans>
LoginFormというものに2つの項目(ログイン名、パスワード)をStrutsに入れてもらうようにする。続いてAction。
<action path=”/LoginAction”
type=”com.daipresetns.LoginAction”
name=”LoginForm”
scope=”request”>
<description>ログイン処理のアクション</description>
<forward name=”success” path=”top” />
Struts1.3.5とMVCモデル
StrutsはMVC2パターンになっているのかな?
Struts1.xとMVCの対応について誤解
時間がなかったのもあるのだけれど、Strustで登場するクラスとMVCの関連で認識が間違っていた。
ViewはJSPだと思ってた(正解) ModelはActionFormと思ってた(不正解) ControllerはActionだと思ってた(不正解)
そこで、StrutsとMVCパターンの対応表をまとめてみた。
ViewはJSPで表現されている Modelはビジネスロジック部分。VO、DAO、処理を実際に行うJavaBeansが含まれる ModelはActionによって生成される ControllerはActionServletがstruts-config.xmlを元に行ってくれる ActionFormはViewとController(もしくはその逆もかな)をつなぐもの ActionFormはデータ転送の役割を持つ ActionはActionServletとビジネスロジックとのアダプタクラス Actionはコントロールされるクラス Actionはビジネスロジックを呼び出してModelオブジェクトを返す
設計してみる
今までは、Actionクラスにビジネスロジックを書いていたが、これだと、Strutsでしか使えないビジネスロジックになるのが問題なのかもしれない。これらをふまえて、MVCパターンを活用するとすると、こんな感じになった。
Actionクラス内では処理するデータ抜き出し、ビジネスロジックに渡して処理してもらう。結果はVOでもらい、ActionFormに設定しなおす。これでアダプタっぽく動くActionになる。formを渡すとStruts部分がビジネスロジックに影響するのでこうしてみた。
VO input = form.getVO();
BusinessLogic logic = new BusinessLogic();
VO result = logic.execute(input);
他にも、それぞれのBisinessLogicクラスを管理するManagerを作って、インスタンスをロジックに対して1つだけ作って使いまわしてくれる・・・っててもあるな。
上記では、formがVOを返したりするのだけれど、「formは純粋にパラメタの受け渡しだけだ!」とするなら、
VOMgr mgr = new VOMgr(form);
VO vo = mgr.getVO();
みたいにして、form用アダプタを作ってもいいかもかも。
Struts1.3.5の例外ハンドリング手法
Strutsのドキュメント(4.4.1 Action Class Design Guidelines)を読んでいて発見したのだけれど、
Don’t throw it, catch it!
らしい。Actionクラスでは例外を投げず、全てキャッチしろ!ってことだと思う。Runtimeを拾うかどうかは好みなのかもしれないが、拾っておいたほうがいいかもね。
ExceptionHandler
struts-config.xmlのglobal-exceptionsを使えば、例外のハンドリングが可能。web.xmlのerror-pageでも可能だが、こちらは「エラーが発生してからの処理」をHandlerクラスで行うことができる。ログ出力とかをまとめることができるね。
参考:
Struts 1.3.5 ExceptionHandler Javadoc Exception Handler
ExceptionHandler public class AppExceptionHandler extends ExceptionHandler {
@Override
public ActionForward execute(
Exception e, ExceptionConfig conf, ActionMapping map, ActionForm form, HttpServletRequest req, HttpServletResponse res) throws ServletException {
//ログ出力のかわりにprintStackTrace
System.out.println(“AppExceptionHandlerで制御”);
e.printStackTrace();
return super.execute(e, conf, map, form, req, res);
}
}
struts-config.xml <global-exceptions>
<exception key=”errors.9999″
type=”java.lang.Exception”
path=”/error50X.jsp”
handler=”com.daipresents.struts135.action.AppExceptionHandler” />
</global-exceptions>
handler属性で
ちなみに、web.xmlとstruts-config.xmlで同じ例外を指定していた場合は、struts-config.xmlが勝つらしい。
注意点
さらに、global-exceptionsはJSP上のエラーは無視する(なぜじゃ)。なので、保険のために、web.xmlの上でもerror-pageを指定しておくほうがいい。JSPでのエラーをひろって、ログに出力できるのであればこれ使うけどねー。
web.xml
<error-page>
<exception-type>java.lang.Exception</exception-type>
<location>/error50X.jsp</location>
</error-page>
Struts1.3.5で使った文字化け対策用Filter
Strutsを普通に使っていると、文字化けが発生する。そこで、Tomcatのサンプルにある「SetCharacterEncodingFilter」を使うといい。
使い方 web.xml <filter>
<filter-name>Set Character Encoding</filter-name>
<filter-class>com.daipresents.struts135.filter.SetCharacterEncodingFilter</filter-class>
<init-param>
<param-name>encoding</param-name>
<param-value>UTF-8</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>Set Character Encoding</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
Struts1.3.5で国際化対応
国際化(internationalization)のこと。i18nと略されることもある。Strutsで日本語、英語の切り替えが簡単にできるようにする方法を調べた。
これをきちんとしないと、Strutsのログに以下のように出てしまう。
//例 ApplicationResources.propertiesだけ作った場合
[WARN ] – Resource com/daipresents/ApplicationResources_ja.properties Not Found.
[WARN ] – Resource com/daipresents/ApplicationResources_ja_JP.properties Not Found.
警告なのは、「ロケール日本のプロパティファイルがないからMessageResources.properties」を使うからいいよ。という意味だろう。日本オンリーであっても警告して教えてくれるわけだ。
対応方法 JSPから日本語を切り出す validation.xmlから日本語を切り出す プロパティファイルの作成 JSPから日本語の切り出す
struts-config.xmlでメッセージリソースを使うことを宣言する。
<message-resources parameter=”com.daipresents.ApplicationResources” />
JSPではメッセージリソースを使って文字を出力する。
<bean:message key=”page.title” /> validation.xmlから日本語を切り出す
作成中ですわ
プロパティファイルの作成
今回は英語と日本語を用意する。
用意するのは
ApplicationResources.properties(デフォルト 日本語) ApplicationResources_ja.properties(日本語) ApplicationResources_en.properties(英語)
の3ファイル
プロパティファイルの命名規則は以下。
ベース名_言語コード_国コード_地域コード.properties 言語コード
ja(日本語) en(英語) 国コード
JP(日本) US(アメリカ合衆国)
詳しくは「ResourceBundle.getBundle
を参考にどうぞ。
ResourceBundleの検出方法をまとめると
指定されたロケール&デフォルトロケール(Locale.getDefault)を使う 指定されたロケールが空だったらbaseNameのプロパティファイルを使う それ以外の場合は指定されたロケールを使って以下の順番で探す baseName + “_” + language + “_” + country + “_” + variant baseName + “_” + language + “_” + country baseName + “_” + language それでも見つからなくて指定されたロケールとデフォルトロケールが異なる場合は、デフォルトのロケールを使って以下の順番で探す
baseName + “_” + language + “_” + country + “_” + variant baseName + “_” [...]
Struts1.3.5でログイン処理を作る
実装検討 Filterを使ってログインしているかどうかを判定しアクセス制限する
画像やJavascriptやCSSファイルはOKにしたいので除外URIを設定できるようにする 除外URIは正規表現を使えるとうれしい(*ぐらいだけど・・・) ログイン用フォームを用意するしてそこからログインを行う ログインしているかどうかは確認用オブジェクトをSessionに入れて、そのオブジェクトの存在チェックで行う ログアウトではSessionを無効化する ログインフィルタの作成 public class LoginFilter implements Filter {
private static final String CLASS_NAME = “LoginFilter”;
private static final String USER_INFO = “USER_INFO”;
private static final String EXCLUDE_PATH = “excludepath”;
private static final String LOGIN_PATH = “loginpath”;
private WebAppLogger logger = WebAppLogger.getInstance();
private String[] excludeArray;
private String loginPath;
public void init(FilterConfig config) throws ServletException {
logger.startLog(CLASS_NAME, “init”);
//web.xmlからパラメタを読み込む
String excludePath = (String)config.getInitParameter(EXCLUDE_PATH);
loginPath= (String)config.getInitParameter(LOGIN_PATH);
//パスを分割
excludeArray = StringUtility.splitToArray(excludePath);
logger.trace(loginPath);
logger.trace(excludePath);
}
Struts1.3.5でのメッセージ処理
メッセージはApplicationResources.propertiesで管理できる。JSPで使うには「bean:message」タグを使えるが、Actionの中などで使う場合は以下のクラス群を利用する。
関連するクラスたち ActionMessages メッセージはこれに入れて管理する ActionMessage 正常系のメッセージ(「成功しました」など)やエラーメッセージをこれで作る。html:messageで出力するのが定番みたい ActionErrors エラー系メッセージを格納。Validatorで使う。html:errorsで出力するみたい。http://civic.xrea.jp/2006/09/05/struts-message-4/ ActionError これは推奨されなくなったので使わない。 Actionでの使い方
Actionの中で画面に表示するメッセージを追加する。
成功の場合 ActionMessages messages = new ActionMessages();
messages.add(ActionMessages.GLOBAL_MESSAGE, new ActionMessage(key));
saveMessages(req, messages);
最後にsaveMessages()メソッドを呼び出すこと。
エラーの場合 ActionMessages msgs = new ActionMessages();
msgs.add(ActionMessages.GLOBAL_MESSAGE, new ActionMessage(“errors.0001″));
saveErrors(req, msgs);
saveErrorsメソッドでリクエストにメッセージをほりこんでいる。
JSPでの表示
html:messagesタグを参考のこと
Struts1.3.5でファイルアップロード
Strutsでは簡単にファイルアップロードができる。
Formを用意する
StrutsではファイルをFormFileクラスで操作する。Formにはこのゲッター、セッターを作ればいいだけ。
private FormFile file;
public FormFile getFile() {
return file;
}
public void setFile(FormFile file) {
this.file = file;
}
ファイルアップロードAction
FormFile.getInputStream()でInputStreamが取得できるので、これを使って、ファイルに書き出したり、よきにはからえばいい。
下の例では、メモリ上にロードしている。
FormFile formFile = f.getFile();
if(formFile != null){
InputStream is = null;
BufferedInputStream bis = null;
ByteArrayOutputStream baos = null;
BufferedOutputStream bos = null;
try{
is = formFile.getInputStream();
bis = new BufferedInputStream(is, 1024);
baos = new ByteArrayOutputStream(1024);
bos = new BufferedOutputStream(baos);
int data = 0;
while((data = bis.read()) != -1){
bos.write(data);
[...]
Struts1.3.5でlog4jを使うとWARNが表示される
以下のエラーがサーバ起動時(アプリケーションデプロイ時)に発生する。
log4j:WARN No appenders could be found for logger (org.apache.struts.util.PropertyMessageResources).
log4j:WARN Please initialize the log4j system properly. 環境 WebLogic8.1J(もしくは9.1J) Struts1.3.5 log4j1.2.13(もしくは1.2.14) commons-logging-1.0.4(Strutsに入っていたもの)
たぶんTomcatでもでるんじゃないかな?
調査
Strutsのログを出しているのが「commons-logging」。commons-loggingはLoggerを作るために、いろいろな設定を順番に探しに行くらしい(参考:commons-logging/1.1)。
そして今回のケースではlog4jのjarをクラスパス上においてあるため、commons-loggingがそれを見つけ、log4jを使って
Loggerを作ろうとしたんだけど、「org.apache・・・」というカテゴリがlog4jの設定ファイル(log4j.xml)に書かれていない
のでエラーになってしまう。
対応策 commons-logging.propertiesを使う
log4jよりも先に読まれる「commons-logging.properties」を使って、Loggerの作成にJDKを使うように設定する。
まずcommons-logging.propertiesファイルを作成し、中にこう記述する。
org.apache.commons.logging.Log=org.apache.commons.logging.impl.Jdk14Logger
これをクラスパスが通っているところ「WEB-INF/classes」に置いた。ちなみに環境がJDK5.0なのだけど、Jdk14Loggerを指定しても問題なかった。
log4j.xmlを使う
log4j.xmlをクラスパスに置いてそれをStrutsに読んでもらう。log4j.xmlを「WEB-INF/classes」に置く。そして以下のカテゴリを追加。Log4jを使うのであればこっちが現実的。
<logger name=”org.apache”>
<level value=”warn” />
<appender-ref ref=”CONSOLE” />
</logger>
「org.apache.commons.digester.Digester」などもLogを出すらしいのでname属性を[org.apache」にした。これで一応成功。
また、rootで指定すれば「org.apache」という指定がいらなくなる。
<root>
<level value=”warn” />
<appender-ref ref=”CONSOLE” />
</root>
参考ページ http://redolog.livedoor.biz/archives/8911271.html http://muimi.com/j/jakarta/commons/logging/
Struts1.3.5でActionServlet起動時にSAXNotRecognizedException
Struts起動時にエラーが発生。ActionServletが起動しない。
org.xml.sax.SAXNotRecognizedException: Feature: http://apache.org/xml/features/validation/dynamic
at org.apache.xerces.jaxp.SAXParserFactoryImpl.setFeature(SAXParserFactoryImpl.java:100)
at com.bluecast.xml.JAXPSAXParserFactory.setFeature(JAXPSAXParserFactory.java:132)
at org.apache.commons.digester.parser.XercesParser.configureXerces(XercesParser.java:185)
at org.apache.commons.digester.parser.XercesParser.newSAXParser(XercesParser.java:138)
at org.apache.commons.digester.ParserFeatureSetterFactory.newSAXParser(ParserFeatureSetterFactory.java:71)
at org.apache.commons.digester.Digester.getParser(Digester.java:692)
at org.apache.commons.digester.Digester.getXMLReader(Digester.java:899)
at org.apache.commons.digester.Digester.parse(Digester.java:1647)
at org.apache.struts.action.ActionServlet.parseModuleConfigFile(ActionServlet.java:745)
at org.apache.struts.action.ActionServlet.initModuleConfig(ActionServlet.java:686)
at org.apache.struts.action.ActionServlet.init(ActionServlet.java:353)
at javax.servlet.GenericServlet.init(GenericServlet.java:256)
at weblogic.servlet.internal.StubSecurityHelper$ServletInitAction.run(StubSecurityHelper.java:274)
at weblogic.security.acl.internal.AuthenticatedSubject.doAs(AuthenticatedSubject.java:321)
at weblogic.security.service.SecurityManager.runAs(SecurityManager.java:121)
at weblogic.servlet.internal.StubSecurityHelper.createServlet(StubSecurityHelper.java:64)
at weblogic.servlet.internal.StubLifecycleHelper.createOneInstance(StubLifecycleHelper.java:58)
at weblogic.servlet.internal.StubLifecycleHelper.<init>(StubLifecycleHelper.java:48)
at weblogic.servlet.internal.ServletStubImpl.prepareServlet(ServletStubImpl.java:504)
at weblogic.servlet.internal.WebAppServletContext.preloadServlet(WebAppServletContext.java:1716)
at weblogic.servlet.internal.WebAppServletContext.loadServletsOnStartup(WebAppServletContext.java:1693)
at weblogic.servlet.internal.WebAppServletContext.preloadResources(WebAppServletContext.java:1613)
at weblogic.servlet.internal.WebAppServletContext.start(WebAppServletContext.java:2764)
at weblogic.servlet.internal.WebAppModule.startContexts(WebAppModule.java:889)
at weblogic.servlet.internal.WebAppModule.start(WebAppModule.java:333)
at weblogic.application.internal.flow.ModuleStateDriver$3.next(ModuleStateDriver.java:204)
at weblogic.application.utils.StateMachineDriver.nextState(StateMachineDriver.java:26)
at weblogic.application.internal.flow.ModuleStateDriver.start(ModuleStateDriver.java:60)
at weblogic.application.internal.flow.ScopedModuleDriver.start(ScopedModuleDriver.java:200)
at weblogic.application.internal.flow.ModuleListenerInvoker.start(ModuleListenerInvoker.java:117)
at weblogic.application.internal.flow.ModuleStateDriver$3.next(ModuleStateDriver.java:204)
at weblogic.application.utils.StateMachineDriver.nextState(StateMachineDriver.java:26)
2007/06/20 19:39:16.457 [ERROR] ***** Unable to initialize Struts ActionServlet due [...]
ActionServletが起動しない。どうもstruts-config.xmlの読み込みでエラーが発生している。StrutsとDigesterのログを見ると以下のエラーが出ていた。
2007/04/25 19:52:54.913 [ERROR] ***** Digester.getParser:
javax.xml.parsers.ParserConfigurationException: XML document validation is not supported
at com.bluecast.xml.JAXPSAXParserFactory.newSAXParser(JAXPSAXParserFactory.java:103)
at org.apache.commons.digester.parser.XercesParser.newSAXParser(XercesParser.java:139)
at org.apache.commons.digester.ParserFeatureSetterFactory.newSAXParser(ParserFeatureSetterFactory.java:73)
at org.apache.commons.digester.Digester.getParser(Digester.java:682)
at org.apache.commons.digester.Digester.getXMLReader(Digester.java:891)
at org.apache.commons.digester.Digester.parse(Digester.java:1572)
at org.apache.struts.action.ActionServlet.parseModuleConfigFile(ActionServlet.java:745)
at org.apache.struts.action.ActionServlet.initModuleConfig(ActionServlet.java:686)
at org.apache.struts.action.ActionServlet.init(ActionServlet.java:353)
at javax.servlet.GenericServlet.init(GenericServlet.java:256)
at weblogic.servlet.internal.StubSecurityHelper$ServletInitAction.run(StubSecurityHelper.java:274)
at weblogic.security.acl.internal.AuthenticatedSubject.doAs(AuthenticatedSubject.java:321)
at weblogic.security.service.SecurityManager.runAs(SecurityManager.java:121)
at weblogic.servlet.internal.StubSecurityHelper.createServlet(StubSecurityHelper.java:64)
at weblogic.servlet.internal.StubLifecycleHelper.createOneInstance(StubLifecycleHelper.java:58)
at weblogic.servlet.internal.StubLifecycleHelper.<init>(StubLifecycleHelper.java:48)
at weblogic.servlet.internal.ServletStubImpl.prepareServlet(ServletStubImpl.java:504)
at weblogic.servlet.internal.WebAppServletContext.preloadServlet(WebAppServletContext.java:1716)
at weblogic.servlet.internal.WebAppServletContext.loadServletsOnStartup(WebAppServletContext.java:1693)
at weblogic.servlet.internal.WebAppServletContext.preloadResources(WebAppServletContext.java:1613)
at weblogic.servlet.internal.WebAppServletContext.start(WebAppServletContext.java:2764)
at weblogic.servlet.internal.WebAppModule.startContexts(WebAppModule.java:889)
at weblogic.servlet.internal.WebAppModule.start(WebAppModule.java:333)
at weblogic.application.internal.flow.ModuleStateDriver$3.next(ModuleStateDriver.java:204)
at weblogic.application.utils.StateMachineDriver.nextState(StateMachineDriver.java:26)
at weblogic.application.internal.flow.ModuleStateDriver.start(ModuleStateDriver.java:60)
at weblogic.application.internal.flow.ScopedModuleDriver.start(ScopedModuleDriver.java:200)
at weblogic.application.internal.flow.ModuleListenerInvoker.start(ModuleListenerInvoker.java:117)
at weblogic.application.internal.flow.ModuleStateDriver$3.next(ModuleStateDriver.java:204)
at weblogic.application.utils.StateMachineDriver.nextState(StateMachineDriver.java:26)
at weblogic.application.internal.flow.ModuleStateDriver.start(ModuleStateDriver.java:60)
at [...]
Struts1.3.5トラブルシューティング
とらぶりゅうは13章まであるらしい。
フィルタでエラー java.lang.NullPointerException
at org.apache.struts.config.FormBeanConfig.createActionForm(FormBeanConfig.java:286)
struts-config.xmlのform-beanにフォームが設定されていないから作れないということ。struts-config.xmlを確認すること。フィルタでエラーがでるのは、遷移先がおかしいのでフィルタででちゃう。
JSTLでタグの属性にEL式を書くとエラー <c:out value=”${param.id}” />
みたいに使えなかった。どうもweb.xmlがServlet2.3になっていたようだ。2.3ではデフォルトでEL式が動かないらしい。
<?xml version=”1.0″?>
<!DOCTYPE web-app PUBLIC
“-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN”
“http://java.sun.com/dtd/web-app_2_3.dtd”>
これを2.4にする。
<web-app xmlns=”http://java.sun.com/xml/ns/j2ee”
xmlns:xsi=”http://www.w3.org/2001/XMLSchema-instance”
xsi:schemaLocation=”http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd”
version=”2.4″> http://www.ecoop.net/memo/2005-09-29-2.html http://www.fraction.jp/log/archives/2005/09/161
Action[/login]でキーメソッドマップの中にリソース {1} が見つかりません
メッセージリソースが見つからなかった。
Path XXXXXX does not start with a “/” character
tilesの定義名が有効にならない。XXXXXXにはtilesで定義した値(topとか)が入る。struts-config.xmlのActionタグでpath属性にtilesの定義名を指定すると以下のエラーが発生する。
警告: Unhandled exception
java.lang.IllegalArgumentException: パス top が”/”文字で始まりません java.lang.IllegalArgumentException: Path top does not start with a “/” character
ためしにJBossを動かしてみると以下のエラーがでていることがわかった。
00:40:41,679 ERROR [STDERR] 2007/02/18 0:40:41 org.apache.struts.validator.ValidatorPlugIn initResources
情報: Loading validation rules file from ‘/org/apache/struts/validator/validator-rules.xml’
00:40:41,679 ERROR [STDERR] 2007/02/18 0:40:41 org.apache.struts.validator.ValidatorPlugIn initResources
調べること2日
原因は不明だが解決策は判明。
http://sabrenews.blogspot.com/2007/01/javaxservletservletexception-path.html
web.xmlのActionServletに以下のパラメタを追加する。
<init-param>
<param-name>chainConfig</param-name>
<param-value>
org/apache/struts/tiles/chain-config.xml
</param-value>
絶賛翻訳中!この秋発売予定!

『Lean from the Trenches』日本語翻訳版、2013年秋頃予定。
"本書は、全開発者に捧げる戦いの記録だ。圧倒的なリアリティで描かれた 越境するソフトウェア開発に至るための道しるべとなるだろう。"
翻訳:市谷 聡啓・藤原 大、監修:角谷 信太郎、タイトル:未定、出版社:オーム社
詳細情報はこちら!僕について
Dai Fujihara
藤原大はマネージャでありアジャイル実践者だ。そして、プロジェクトリーダー、チェンジ・エージェント、アジャイルコーチ、トレーナーでもある。彼はまたRedmine、Jenkinsといった開発を支援するツール環境の整備や、アジャイル開発を活用した創造的なソフトウェア開発の支援を行っている。さらに、趣味は沖縄離島巡りらしい。
最近の人気
永久保存の本
Venkat Subramaniam (著), Andy Hunt (著), 木下 史彦 (監訳), 角谷 信太郎 (監訳)
アジャイルな習慣とは一体何なのか?本書ではプラクティスを交えながら、その姿勢を読者に問いかけている。世代や役割をこえて色褪せない「アジャイル」に対する良書。Amazonレビュー
Mike Cohn (著), マイク コーン (著), 安井 力 (翻訳), 角谷 信太郎 (翻訳)
採用した現在のタイトルは、見積りや計画づくりといったプロセスを、アジャイルに進めなければならないと謳っているのだ。見積りと計画づくりがアジャイルでないのに、プロジェクトがアジャイルであるということはありえない。(イントロダクションより)
Jonathan Rasmusson (著), 西村 直人 (翻訳), 角谷 信太郎 (翻訳)
アジャイルサムライ―それはソフトウェアを顧客に届ける猛々しきプロフェッショナルだ。本書では、圧倒的なアジャイルプロジェクトの姿を見せる。2011年爆発的にヒットしたアジャイル開発に情熱を持つエンジニアに届けたい本。タグ
Agile ant Apache bash Eclipse GlassFish install Java Javascript kobo Linux log4j Management Maven Open Source PHP Pukiwiki Python Redmine Ruby Ruby on Rails Scrum Spring Struts Struts2 Subversion Test Tomcat Trac VBA Web WebDriver WebLogic Windows WordPress 働く 勉強会 嫁(ベータ) 思い出し笑う 我思う 旅する 映画/ドラマ 英語を話す 読むと聞く 過去を語るアーカイブ









