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>
まず
<html:form action="/hello" method="POST">
name属性はこのpathがsubmitされた場合に利用するActionFormを指定します。指定する値は
type属性はこのpathがsubmitされた場合に利用するActionをフルパスで指定します。
input属性とvalidate属性はそれぞれ、入力画面の指定とcommons-validatorを利用した入力チェックを行うかどうかを指定します。validateの値がfalseの場合はcommons-validatorを利用した入力チェックは行いません。
scope属性はActionFormをどのスコープに保存するかを指定します。通常はrequestを指定しますが、セッション間でActionFormを保持したい場合はsessionを指定します。
最後の
return mapping.findForward("hello");
と指定していたので、ここで定義している遷移先のキー名はhello、すなわち遷移先画面は/pages/hello.jspとなります。
以上で簡単なWebアプリの作成は完了です。次回からはMavenの機能を利用してこのWebアプリをTomcat上で動作させる方法を紹介します。