ゼロコンフィグレーションって言うんでしょうか・・・
struts2のstruts.xmlを書かない方式で、はまったことあれこれ
■一般的には、こうしろ!と書いてある
やることは、4つ
1.サーバー側のstruts2から呼び出されるものを
~Action(~の1文字目は大文字)にして、
2.アノテーションとして、executeのところに、
@Action("~" )
(~の1文字目、大文字を小文字に変える)
3.一番上に、
@Results({
@Result(name="success", location="/index.jsp")
})
のようにResultで、returnしたときの行き先を書く
4.web.xmlのフィルターのところ
<filter>
<filter-name>struts2</filter-name>
<filter-class>org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter</filter-class>
<init-param>
<param-name>actionPackages</param-name>
<param-value>struts2.s2down</param-value>
</init-param>
</filter>
のように、init-paramを指定せよ
(< >は、本当は半角。ただ、これをコピペしないように。理由は後述)
●そうすれば、
http://localhost:8080/アプリ名/~.action
(~の1文字目は小文字)でアクセスすると,Acion実行後、Resultで指定したJSPが動くはず!
※くわしくは、ここ
@いう間にWebアプリを作れる「Struts 2」入門
http://www.atmarkit.co.jp/fjava/special/struts2/struts2_1.html
注意:このソースをダウンロードして実行しようとしても、
ライブラリが無いので動かない。
そこで、最新のライブラリを入れても・・・動かない。後述
■はまった点1:eclipseで、アノテーションのところのエラーが消えない
・現象
コレを行うためには、
@Results
@Action
のアノテーションの指定が必要だが、ここでエラーになる
・理由
struts2-convention-plugin-2.3.15.1.jar を見ていなかった。
・対応
(1)struts2-convention-plugin-2.3.15.1.jarを、javaのクラスパスに足す
(WEB-INFのlibにも入れておくこと)
(2)ソースファイルで
import org.apache.struts2.convention.annotation.*;
を入れる
■はまった点2:500エラー、ぬるぽで落ちる
・現象
struts2.3いくつかをいれ、上記サイトからサンプルを落としてきて
実行すると、
HTTPステータス 500 -
type 例外レポート
メッセージ
説明 The server encountered an internal error () that prevented it from fulfilling this request.
例外
java.lang.NullPointerException
org.apache.struts2.impl.StrutsActionProxy.getErrorMessage(StrutsActionProxy.java:69)
・理由
最新のものは、フィルターが変わっている。
・対策
web.xmlを開くと、
<filter-class>org.apache.struts2.dispatcher.FilterDispatcher</filter-class>
となっている。
このフィルタークラスを
org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter
に変える
■はまった点3:見えない(404エラー)
・現象
上記のようにフィルタークラスを変えると、今度は
HTTPステータス 404 - There is no Action mapped for namespace [/] and action name [index] associated with context path
・理由
どうやら、param-valueに指定する値、すなわち、パッケージは、1単語ではだめで、
○○○.XXXのように、.がはいるものでないといけないようだ。
・対策
(1)param-valueをstruts2.s2downのように、○○○.XXXの形にする
(2)ということは、プログラムのパッケージもstruts2.s2downのように
○○○フォルダの下にXXXがあるようにして、そこにクラスファイルを置く
(3)ということは、ソースコードのpackageも修正する
■はまった点4:404エラー WEB-INF/content/を見に行こうとする
・現象
@Result(name="success", location="index.jsp")
と指定すると、
WEB-INF/content/index.jspを見に行こうとする。
(そこにファイルを作ると、うまく表示される)
・理由
相対パスになっている。
・対策
ゼッタイパス指定する
@Result(name="success", location="/index.jsp")
と、index.jspの前に/をつけると、サーブレットのフォルダの下のindex.jspを
見に行く。
■このほか
うちは、はまらなかったけど・・・
AbcEfgActionのように、大文字が2回出る場合、問題があるらしい。
Struts2のアクション名指定ではまった話
http://scarmitt.sakura.ne.jp/programs/struts2_no_action_mapped.html