単純なプログラムを書換えよう(WebWork2編)−コントローラとモデルの分離
はじめに
オリジナルソースをコントローラとモデルに分離する.名前はコントローラではなくアクションという方が適切かもしれない.
Observerを使ったawt版と見比べると,Controllerの違いが良く分かる.WebWork2版のexecuteメソッドがawt版のactionPerformedメソッドにあたり,awtにはなかったアクセッサが増えている.また,ModelからはObserverへ変化を知らせるメソッド(setChanged()/notifyObserver())がなくなった.
ファイル/ディレクトリ構成
プログラムを動かすために,以下のファイルを用意する.
- counter02-1.jsp/counter02-2.jsp
- ブラウザに表示するためのjsp.counter02-1.jspは最初に表示する画面,counter02-2.jspはプログラム起動後に遷移する画面.
- Controller.class/Model.class
- javaのクラス
- xwork.xml
- WebWork2の画面遷移等を指定するファイル
ディレクトリ構成は以下のようになる.各ファイルの内容はそれぞれ後述する.
${TOMCAT_HOME}/webapps/counter/counter02-1.jsp /counter02-2.jsp /WEB-INF/classes/counter02/Controller.class /Model.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/counter02-1.jsp
ポート番号が8080の場合は,
http://localhost:8080/counter/counter02-1.jsp
となる.
counter02-1.jsp/counter02-2.jsp
counter01-1.jsp/counter01-2.jspを一部修正する.
<%-- counter02-1.jsp --%> <html> <head> <title>counter02-1</title> </head> <body> value:0<br/> <form action="Counter02.action"> <%-- xwork.xmlの記述にあわせてaction属性にはCounter02を指定 --%> <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 --%> <%-- counter02-2.jsp --%> <%@ taglib prefix="ww" uri="webwork" %> <%-- WebWorkのカスタムタグを使うのでtaglibを宣言 --%> <html> <head> <title>counter02-2</title> </head> <body> value:<ww:property value="value"/><br/> <%-- Controller.getValue()メソッドを使って結果を取出す.propertyはWebWorkのカスタムタグ --%> <form action="Counter02.action"> <%-- xwork.xmlの記述にあわせてaction属性にはCounter02を指定 --%> <input type="hidden" name="value" value="<ww:property value="value"/>"/> <%-- hiddenフィールドにもプログラムからの値を保持 --%> <input type="submit" name="action" value="inc"/> <input type="submit" name="action" value="dec"/> </form> </body> </html> <%-- end --%>
Controller.java
//Controller.java package counter02; import com.opensymphony.xwork.*; public class Controller extends ActionSupport{ private Model model=new Model(); private String action; //jspから自動的に呼ばれるアクセッサ public void setValue(String value){ model.setValue(Integer.parseInt(value)); } public String getValue(){ return Integer.toString(model.getValue()); } public void setAction(String action){ this.action=action; } public String getAction(){ return action; } //actionで実行するメソッド public String execute(){ if(getAction().equals("inc")){ model.inc(); } else{ model.dec(); } return SUCCESS; } } //end
Model.java
//Model.java package counter02; public class Model{ private int value; public Model(){ this(0); } public Model(int value){ setValue(value); } public int getValue(){ return value; } public void setValue(int value){ this.value=value; } public int inc(){ return inc(1); } public int inc(int value){ setValue(getValue()+value); return getValue(); } public int dec(){ return dec(1); } public int dec(int value){ setValue(getValue()-value); return getValue(); } } //end
xwork.xml
また,xwork.xmlを以下のように修正する.
<!-- 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"/> <!-- Counter02を追加 --> <action name="Counter02" class="counter02.Controller"> <result name="success" type="dispatcher"> <param name="location">counter02-2.jsp</param> </result> </action> </package> </xwork> <!-- end -->