いろいろなドキュメントを見ますと「struts.xml」は「WEB-INF/classes」配下に配置するように、
と書かれていますが、eclipse開発する場合、「WEB-INF/classes」配下はコンパイル毎に
クリーンアップされてしまうので、せっかく「struts.xml」を配置しても削除されてしまいます。
このため「struts.xml」は「WEB-INF/src」配下に配置するようにします。
同様にアクションクラス(Servlet)も「WEB-INF/src」配下に配置すると良いでしょう。
「struts.xml」では、
<package name="HelloWorld" namespace="/" extends="struts-default" >
<action name="Hello" class="pkg.sample.Hello">
<result name="success">/hello.jsp</result>
<result name="error" >/index.jsp</result>
</action>
</package>
などとstrutsの動作定義をします。
<package>タグ
・name :
struts.xml内でユニークとなる名前をつけます。自分の好きな名称をつけてかまいません。
・namespace :
このパッケージにアクセスする際のURL(とのマッピング)を指定します。
今回は「/」を指定したので「http://localhost:8080/HelloWorld/Hello.action」というようにアクセスしましたが、
例えば「/sample」を指定した場合には「http://localhost:8080/HelloWorld/sample/Hello.action」というようにアクセス
することになります。
WEB画面を各機能毎に分けて開発する場合には、このnamespaceをつけてパスを分けるとよいでしょう。
・extends :
struts2では定義内容を継承することができます。struts2では「struts-default」という定義が既に初期定義されているため、
通常はこの「struts-default」を継承する設定とします。
<action>タグ
actionタグでは、指定されたURLに対してどのアクションクラスを実行するかのマッピングを定義します。
・name :
アクションクラス(Servlet)を呼び出す際のURLを記述します。
今回は「Hello」と指定しましたので、「/Hello.action」というURLが指定された時に、アクションクラスが呼ばれます。
拡張子として必ず「.action」がつきます。これはstruts2の決まりごととして覚えてください。
・class :
name属性で記述したURLが指定されたときに呼び出すJavaクラスを指定します。
<result>タグ
resultタグでは、アクションクラスが実行完了後に、どの画面(jsp)に遷移するかを定義します。
・name :
アクションクラス(Servlet)内のexecuteメソッドが返却する文字列を指定します。
今回は「Hello.java」内で「success」を返却しています。このため「<result name="success">」の定義が次の画面遷移先となり、結果として「/hello.jsp」が表示されます。
上述したとおり、<action name="Hello" ... > と記述すると、
必ず「Hello.action」という拡張子つきでアクションクラスを呼び出さないといけません。
ポリシーをもったプログラマは、こういう仕様を許せないものです。(^^)
「struts.xml」ファイル内に、以下の記述をすることで、この「.action」という拡張子を削除すること(変更すること)ができます。
<constant name="struts.action.extension" value="" />