1. クライアントからのリクエストをActionServletが受け取る。
2. Struts設定ファイルの設定に従ってリクエストパスに関連付いたActionFormがインスタンス化され、リクエストデータがActionFormにセットされる。
3. 入力値検証が設定されている場合は検証が行われる。
4. Struts設定ファイルの設定に従ってリクエストパスに関連付いたActionクラスのexecute()メソッドが呼び出される。
5. Struts設定ファイルの設定に従って画面遷移が行われる。
1. クライアントからのリクエストをFacesServletが受け取る。
2. 元の画面に対応したUIコンポーネントにリクエストデータがセットされる。
3. 入力値検証が設定されている場合は検証が行われる。
4. UIコンポーネントが保持しているデータがBackingBeanにコピーされる。
5. イベント(ボタンが押されたなど)処理。イベントに関連付いたメソッドが呼び出される。
6. faces-config.xmlの設定に従って、次の画面のUIコンポーネントが用意され、画面を生成、画面遷移が行われる。
web.xmlにServletを登録、設定する。Strutsでは、アプリケーション中に唯一存在するServletとしてorg.apache.struts.action.ActionServletを使用する。
クライアントからのリクエストはすべてこのActionServletが受け取る。web.xmlにActionServletをactionというServlet名で登録し、URLパターンに*.doを設定するのが一般的だ。このように設定することによって、URLの末尾が.doで終わるリクエストはすべてActionServletに処理される。ActionServletの初期化パラメータ"config"には、Struts設定ファイルのパスとファイル名を指定する。また、コンテナ起動時にアプリケーションの初期化が行われるように <load-on-startup> 要素を設定する。StrutsではJSPページでカスタムタグを使うので、 <taglib> 要素の設定も必要だ。
リスト2の作成例では、そのほかにfiterの登録、設定とウェルカムファイルリストの登録が行われている。
リスト2■web.xmlの作成例 |
<?xml version="1.0" encoding="ISO-8859-1"?> <!DOCTYPE web-app PUBLIC "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN" "http://java.sun.com/dtd/web-app_2_3.dtd"> <web-app> <filter> <filter-name>Set Character Encoding</filter-name> <filter-class>filters.SetCharacterEncodingFilter</filter-class> <init-param> <param-name>encoding</param-name> <param-value>Windows-31J</param-value> </init-param> </filter> <filter-mapping> <filter-name>Set Character Encoding</filter-name> <url-pattern>/*</url-pattern> </filter-mapping> <!-- Standard Action Servlet Configuration (with debugging) --> <servlet> <servlet-name>action</servlet-name> <servlet-class>org.apache.struts.action.ActionServlet</servlet-class> <init-param> <param-name>config</param-name> <param-value>/WEB-INF/struts-config.xml</param-value> </init-param> <load-on-startup>2</load-on-startup> </servlet> <!-- Standard Action Servlet Mapping --> <servlet-mapping> <servlet-name>action</servlet-name> <url-pattern>*.do</url-pattern> </servlet-mapping> <!-- The Usual Welcome File List --> <welcome-file-list> <welcome-file>index.jsp</welcome-file> </welcome-file-list> <!-- Struts Tag Library Descriptors --> <taglib> <taglib-uri>/tags/struts-bean</taglib-uri> <taglib-location>/WEB-INF/tld/struts-bean.tld</taglib-location> </taglib> <taglib> <taglib-uri>/tags/struts-html</taglib-uri> <taglib-location>/WEB-INF/tld/struts-html.tld</taglib-location> </taglib> <taglib> <taglib-uri>/tags/struts-logic</taglib-uri> <taglib-location>/WEB-INF/tld/struts-logic.tld</taglib-location> </taglib> <taglib> <taglib-uri>/tags/struts-nested</taglib-uri> <taglib-location>/WEB-INF/tld/struts-nested.tld</taglib-location> </taglib> <taglib> <taglib-uri>/tags/struts-tiles</taglib-uri> <taglib-location>/WEB-INF/tld/struts-tiles.tld</taglib-location> </taglib> </web-app> |
Strutsでは、クライアントから入力された値を保持するコンポーネントとして、org.apache.struts.action.ActionFormのサブクラスを作成する。リスト3は、userNameという名前で送信される入力値を保持するためのActionFormの実装例だ。JSPページで実装されたフォーム要素のproperty属性の値と同名のプロパティと、アクセッサメソッドを実装する。
リスト3■ActionFormの実装例 |
package study.struts.form; import org.apache.struts.action.ActionForm; public class WelcomeForm extends ActionForm { private String userName; public String getUserName() { return userName; } public void setUserName(String userName) { this.userName = userName; } } |
作成したら、Struts設定ファイル(struts-config.xml)の
リスト4■ActionFormの登録例 |
<form-beans> <form-bean name="WelcomeForm" type="study.struts.form.WelcomeForm" /> </form-beans> |
Strutsでは、ビジネスロジックを呼び出すためのコントローラコンポーネントとして、org.apache.struts.action.Actionのサブクラスを作成し、execute()メソッドをオーバーライドして実装する。リスト5は、Actionクラスの実装例だ。このサンプルでは特に行うべきビジネスロジックはないので、execute()メソッドの処理は"success"という名前で登録されたActionForwardオブジェクトを取得し、returnするのみとなっている。
リスト5■Actionの実装例 |
package study.struts.action; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; 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 WelcomeAction extends Action { public ActionForward execute( ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response) throws Exception { // ビジネスロジックを呼び出す処理をここに記述 return mapping.findForward("success"); } } |
Strutsでは、カスタムタグを用いてJSPページを作成する。Strutsが標準で提供するタグライブラリを使うのが基本だ。
リスト6とリスト7は、Strutsのカスタムタグを使ったJSPページの実装例だ。画面には送信用のフォームがあり、テキストボックスひとつと送信ボタンひとつだけのシンプルなフォームである。フォーム要素を中心にStrutsのカスタムタグが使われているのが分かるだろう。html:text タグがテキストボックスに相当するタグであり、property属性の値が送信されるパラメータ名となる。ここでは、フォーム送信すると入力した値がActionFormの同名プロパティに格納される。html:submitタグはsubmitボタンに相当するものだ。
リスト6■入力画面(Struts) |
<%@ page contentType="text/html; charset=Windows-31J"%> <%@ taglib uri="/tags/struts-html" prefix="html" %> <html> <head> <title>Strutsのサンプル</title> </head> <body> <html:form action="/input" > <center> <br /> <h3>お名前は?</h3> <html:text property="userName" size="30" /> <br /><br /> <html:submit> 送信 </html:submit> </html:form> </center> </body> </html> |
リスト7は、入力された値を表示する画面実装例だ。bean:writeタグが画面出力を行うタグである。
ここでは、WelcomeFormというBeanのuserNameというプロパティの値を出力する、という処理が実装されている。html:linkタグはハイパーリンクを生成するタグだ。
この実装例では、forward属性によって、inputpageという名前で登録されたActionForwardを呼び出す処理が実装されている。html:linkタグでforward属性を使用するにはStruts設定ファイルの <global-forwards> 要素の設定が必要だ。
リスト7■ようこそ画面(Struts) |
<%@ page contentType="text/html; charset=Windows-31J"%> <%@ taglib uri="/tags/struts-html" prefix="html" %> <%@ taglib uri="/tags/struts-bean" prefix="bean" %> <html> <head> <title>ようこそ!Strutsの世界へ!</title> </head> <body> <center> <br /> <h3>ようこそ!<bean:write name="WelcomeForm" property="userName" />さん!</h3> <br /><br /> <html:link forward="inputpage"> 戻る </html:link> </center> </body> </html> |
Copyright © ITmedia, Inc. All Rights Reserved.