m-namikiの日記

おもしろき こともなき世を おもしろく

Strutsによる簡単Webアプリその2

前回のエントリJavaクラスを作り始める準備が整いましたので、今回は実際にJavaクラスを作成します。

まず始めに、画面から送られるリクエストをフィルタリングして、文字コードの変換を行うCharacterEncodingFilter.javaです。

package net.masa.simple.struts.filter;
import java.io.IOException;
import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
public class CharacterEncodingFilter implements Filter {
    public void destroy() {
    }
    public void doFilter(ServletRequest request, ServletResponse response,
            FilterChain chain) throws IOException, ServletException {
        request.setCharacterEncoding("UTF-8");
        chain.doFilter(request, response);
    }
    public void init(FilterConfig filterConfig) throws ServletException {
    }
}

きちんとしたFilterクラスを実装する場合にはもっと色々な処理を行いますが、今回は簡単Webアプリなので、ServletRequestの文字コードを変換する処理だけを行います。


続いて、画面で所定のボタンがクリックされた場合に行う処理を定義するSimpleAction.javaです。

package net.masa.simple.struts.action;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import net.masa.simple.struts.form.SimpleActionForm;
import org.apache.struts.action.Action;
import org.apache.struts.action.ActionForm;
import org.apache.struts.action.ActionForward;
import org.apache.struts.action.ActionMapping;
public class SimpleAction extends Action {
    @Override
    public ActionForward execute(ActionMapping mapping, ActionForm form,
            HttpServletRequest request, HttpServletResponse response)
            throws Exception {
        SimpleActionForm myForm = (SimpleActionForm) form;
        request.setAttribute("name", myForm.getName());
        return mapping.findForward("hello");
    }
}

このクラスでは、画面で入力された情報をActionFormクラス(ここではSimpleActionForm。詳細は後述します)から取得し、「name」というキー名で入力情報をHttpServletRequestに登録しています。また、最後のreturn節では、これも後述するstruts-config.xmlに定義する、遷移先の画面を指定しています。


最後に画面で入力された情報を保持するSimpleActionForm.javaです。

package net.masa.simple.struts.form;
import org.apache.struts.action.ActionForm;
public class SimpleActionForm extends ActionForm {
    private String name;
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
}

このクラスでは画面の入力項目をプロパティとして定義し、プロパティに対するアクセサメソッドを実装します。この場合、画面で入力される情報を「name」という名のプロパティとして保持します。この「name」というのは前回のエントリで紹介したindex.jspの以下の部分と紐付いています。

<html:text property="name">

なので、JSPで「property」の値を変更した場合、ActionFormのプロパティ名とアクセサメソッド名を同様に変更しなければなりません。


ここまででJavaクラスの作成は完了です。しかし、このままではまだこのWebアプリを動作させることは出来ません。動作させるには画面から送られるリクエストをどのActionに振り分け、その結果どの画面に遷移するかを定義したstruts-config.xmlを作成する必要があります。

struts-config.xmlはsrc/main/webapp/WEB-INF配下に作成します。

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE struts-config PUBLIC
          "-//Apache Software Foundation//DTD Struts Configuration 1.3//EN"
          "http://struts.apache.org/dtds/struts-config_1_3.dtd">
<struts-config>
  <form-beans>
    <form-bean name="simpleActionForm"
        type="net.masa.simple.struts.form.SimpleActionForm"/>
  </form-beans>
  <global-exceptions/>
  <global-forwards/>
  <action-mappings>
    <action path="/hello"
        name="simpleActionForm"
        type="net.masa.simple.struts.action.SimpleAction"
        input="/pages/index.jsp"
        validate="false"
        scope="request">
        <forward name="hello" path="/pages/hello.jsp"/>
    </action>
  </action-mappings>
</struts-config>

タグでは、Webアプリで利用するActionFormクラスをすべて定義します。今回はSimpleActionFormしか利用しないので、SimpleActionFormのみを指定しています。
タグでは、特定の例外が発生した場合の遷移先を指定することが出来ます。また、例外発生時に何らかの処理を行いたい場合には処理を行うクラスを指定することも出来ます。今回は例外処理は特に意識していないため、何も記述しません。
タグでは、すべてのActionで利用する遷移先を指定することが出来ます。今回のWebアプリでは共通で利用する遷移先は指定しないので何も記述しません。
タグでは、画面から送られるリクエストを処理するActionや遷移先の指定、ActionとActionFormの関連付けなどを定義します。今回、ActionはSimpleActionしか利用しないので、SimpleActionのみを指定しています。
まずタグのpath属性で、このActionを呼び出す場合のパス名を指定します。この値は前回のエントリで紹介したindex.jspの以下の部分と紐付いています。

<html:form action="/hello" method="POST">

name属性はこのpathがsubmitされた場合に利用するActionFormを指定します。指定する値はタグで指定したname属性の値を指定します。
type属性はこのpathがsubmitされた場合に利用するActionをフルパスで指定します。
input属性とvalidate属性はそれぞれ、入力画面の指定とcommons-validatorを利用した入力チェックを行うかどうかを指定します。validateの値がfalseの場合はcommons-validatorを利用した入力チェックは行いません。
scope属性はActionFormをどのスコープに保存するかを指定します。通常はrequestを指定しますが、セッション間でActionFormを保持したい場合はsessionを指定します。
最後のタグでは、遷移先画面を指定します。上記の場合、helloというキー名で/pages/hello.jspが定義されています。このキー名はActionのreturn節で指定した文字列に紐付きます。今回、SimpleAction#execute()のreturn節では、

return mapping.findForward("hello");

と指定していたので、ここで定義している遷移先のキー名はhello、すなわち遷移先画面は/pages/hello.jspとなります。


以上で簡単なWebアプリの作成は完了です。次回からはMavenの機能を利用してこのWebアプリをTomcat上で動作させる方法を紹介します。