単純なプログラムを書換えよう(WebWork2編)−オリジナルソース
ファイル/ディレクトリ構成
プログラムを動かすために,以下のファイルを用意する.
- counter01-1.jsp/counter01-2.jsp
- ブラウザに表示するためのjsp.counter01-1.jspは最初に表示する画面,counter01-2.jspはプログラム起動後に遷移する画面.
- Counter.class
- javaのクラス
- xwork.xml
- WebWork2の画面遷移等を指定するファイル
ディレクトリ構成は以下のようになる.各ファイルの内容はそれぞれ後述する.
${TOMCAT_HOME}/webapps/counter/counter01-1.jsp /counter01-2.jsp /WEB-INF/classes/counter01/Counter.class /xwork.xml /lib/commons-logging.jar /ognl-2.6.3-modified.jar /oscore-2.2.1.jar /velocity-dep-1.3.1.jar /webwork-2.0.jar /xwork-1.0.jar /web.xml
URL
アクセスするためのURLは以下の通りとなる.
http://localhost:[ポート番号]/counter/counter01-1.jsp
ポート番号が8080の場合は,
http://localhost:8080/counter/counter01-1.jsp
となる.
counter01-1.jsp/counter01-2.jps
counter01-1.jspはブラウザに最初に表示する画面である.値とincボタン,decボタンを表示する.hiddenフィールドに初期値0を持たせている.プログラム起動後はcounter01-2.jspに遷移する.
<%-- counter01-1.jsp --%> <html> <head> <title>counter01-1</title> </head> <body> value:0<br/> <form action="Counter01.action"> <%-- submitボタンを押すとxwork.xmlでCounter01に定義したclassのexecute()メソッドが動く --%> <input type="hidden" name="value" value="0"/> <%-- 初期値0を設定 --%> <input type="submit" name="action" value="inc"/> <input type="submit" name="action" value="dec"/> </form> </body> </html> <%-- end --%> <%-- counter01-2.jsp --%> <%@ taglib prefix="ww" uri="webwork" %> <%-- WebWorkのカスタムタグを使うのでtaglibを宣言 --%> <html> <head> <title>counter01-2</title> </head> <body> value:<ww:property value="value"/><br/> <%-- Counter.getValue()メソッドを使って結果を取出す.propertyはWebWorkのカスタムタグ --%> <form action="Counter01.action"> <%-- submitボタンを押すとxwork.xmlでCounter01に定義したclassのexecute()メソッドが動く --%> <input type="hidden" name="value" value="<ww:property value="value"/>"/> <input type="submit" name="action" value="inc"/> <input type="submit" name="action" value="dec"/> </form> </body> </html> <%-- end --%>
Counter.java
jspからのアクションで動くプログラムは以下の通り.
// Counter.java package counter01; import com.opensymphony.xwork.*; public class Counter extends ActionSupport{ //jspからWebWork経由で実行するクラスはActionSupportクラスのサブクラスにする. //または,com.opensymphony.xwork.Actionインタフェースを実装(implements Action)する. private int value=0; private String action; //setter/getterはww:propertyやinputタグから自動的に呼ばれる public void setValue(String value){ this.value=Integer.parseInt(value); } public String getValue(){ return Integer.toString(value); } public void setAction(String action){ this.action=action; } public String getAction(){ return action; } public String execute(){ //actionの結果動くメソッド if(getAction().equals("inc")){ value++; } else{ value--; } return SUCCESS; //文字列"success"を返す. } } // end
コンパイルする際には,xwork-1.0.jarをクラスパスに指定する必要がある.
$ javac -classpath ${TOMCAT_HOME}/webapps/counter/WEB-INF/lib/xwork-1.0.jar Counter.java
とか
$ javac -classpath ../../lib/xwork-1.0.jar Counter.java
と指定する
xwork.xmlの設定
他にも色々書けるのだが,今回は画面遷移のみの記述である.jspに指定した名前「Counter01」とそれにひも付くクラス(counter01.Counter),処理終了後に遷移する画面を記述している.
<!-- xwork.xml --> <?xml version="1.0" encoding="ISO-8859-1"?> <!DOCTYPE xwork PUBLIC "-//OpenSymphony Group//XWork 1.0//EN" "http://www.opensymphony.com/xwork/xwork-1.0.dtd"> <xwork> <include file="webwork-default.xml"/> <package name="default" extends="webwork-default"> <default-interceptor-ref name="defaultStack"/> <action name="Counter01" class="counter01.Counter"> <!-- jspの中でCounter01を実行するとcounter01.Counterクラスを参照する. 動くメソッドはexecute().変更も可能.--> <result name="success" type="dispatcher"> <!-- counter01.Counterクラスから"success"が帰ってきたら,counter01-2.jspを表示する --> <param name="location">counter01-2.jsp</param> </result> </action> </package> </xwork> <!-- end -->
概略図
概略を図にするとこのようになるのだと思う.