単純なプログラムを書換えよう(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 -->
        

概略図

概略を図にするとこのようになるのだと思う.

counter01概略図