第2章 Struts2(HelloWorld)の作成
この章ではStruts2(HelloWorld)の作成を説明します
homepage
# **Struts2(HelloWorld)の作成** *** **本章の目標**は いわゆるHelloProjectアプリケーションを作ります。起動ページのリンクをクリックをすると、その下に文字が表示されるというものです。ごく簡単ながら、基本型ともいえるこのアプリケーションを構成するファイルを1つずつ追っていけば、Struts 2での基本的なフローが理解できるはずです。 **・起動ページ** テキストボックスに任意の値(例えば'田中')を入力し、「HelloWorldページへ行く」をクリックしましょう。 <!--graph2-1.png--> <a href="https://i.loli.net/2019/06/25/5d11f2fc2c72037968.jpg" target="_blank"> <img src="https://i.loli.net/2019/06/25/5d11f2fc2c72037968.jpg" width=40%></a> <br> **・成功ページ** テキストボックスの入力値が受け継がれ、HelloWorldが表示できました! <!--graph2-2.png--> <a href="https://i.loli.net/2019/06/25/5d11f2fbdf18939539.jpg" target="_blank"> <img src="https://i.loli.net/2019/06/25/5d11f2fbdf18939539.jpg" width=40%></a> <br><br> ## **1.トップページの準備** **(1)** アプリケーションアクセス時のトップページを準備します。 今回はJSPを使って実装します。WebContentを右クリック>新規> JSPでダイアログを開きます。 ファイル名に「index.jsp」と入力して完了します。 <br> <!--graph2-3.png--> <a href="https://i.loli.net/2019/06/25/5d11d6038faa263227.jpg" target="_blank"> <img src="https://i.loli.net/2019/06/25/5d11d6038faa263227.jpg" width=40%></a> <br> **(2)** ファイル名に「index.jsp」と入力して完了します。 <!--graph2-4.png--> <a href="https://i.loli.net/2019/06/25/5d11d65d9f91e64300.jpg" target="_blank"> <img src="https://i.loli.net/2019/06/25/5d11d65d9f91e64300.jpg" width=40%></a> <br> **(3)**「index.jsp」はWebContentの目録下にあります。 <!--graph2-5.png--> <a href="https://i.loli.net/2019/06/25/5d11d7da7e0ab78239.png" target="_blank"> <img src="https://i.loli.net/2019/06/25/5d11d7da7e0ab78239.png" width=40%></a> <br> **下のコードを「index.jsp」に入力してます。** <!--graph2-6.png--> <a href="https://i.loli.net/2019/06/20/5d0af586396d769474.jpg" target="_blank"> <img src="https://i.loli.net/2019/06/20/5d0af586396d769474.jpg" width=40%></a> <br><br> ## **2.遷移先ページの実装** トップページのボタンを押した際の遷移先を実装します。 トップページと同様の手順で「**HelloWorld.jsp**」を追加してください。 ``` <%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <%@ taglib prefix="s" uri="/struts-tags"%> <!DOCTYPE html> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> <title>Hello Struts2 world!</title> </head> <body> <!-- メッセージの間に渡されたデータを表示します。 --> Hello Struts2 world, <s:property value="name" />さん </body> </html> ``` <br><br> ## **3.struts.xmlの設定** ### **・struts.xml** Struts2において、JSPからサブミットされた際など、Webアプリケーションの処理を担うクラスをActionと呼びます。 Actionや、遷移先のページは、struts.xmlに定義しています。 **struts.xml**は**src**配下に格納します。 <br><br> ### **・struts.xmlにActionの定義を追加します。** **struts.xml** ``` <?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE struts PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 2.1.7//EN" "http://struts.apache.org/dtds/struts-2.1.7.dtd"> <struts> <package name="HelloProject" extends="struts-default"> <action name="hello" class="sample.HelloWorldAction" method="execute"> <result name="success">/HelloWorld.jsp</result> </action> </package> </struts> ``` <br> ※action要素の属性には、以下の値が設定できる<br> + **result**要素の属性には、以下の値が設定できる + **name:** マッピング名。省略すると"success"になる + error・・・アクションの実行に失敗 + input・・・入力エラーが発生 + none・・・アクションの実行は成功したけどViewを表示できない + success・・・アクションの実行に成功 + type: Actionクラスの処理終了後に呼ばれるタイプ。省略した場合は"dispatcher"になる tpyeに設定できる値としてデフォルトでは以下のものが設定できる + **chain** ・・・ 他のActionクラスを呼び出す + **dispatcher**・・・viewにjspを使う + freemarker・・・viewにfreemarkerを使う + httpheader・・・HTMLのヘッダーのみ返す + **redirect**・・・ 他のURLへリダイレクトする + **redirectAction**・・・他のActionクラスへリダイレクトする + stream・・・ファイルのダウンロードで使用 + velocity・・・viewにvelocityを使う + xslt・・・viewにxsltを使う + plainText・・・viewにplainTextを使う **・redirect処理** <a href="https://i.loli.net/2020/04/20/m4oRz3kOHp2eSBy.png" target="_blank"><img src="https://i.loli.net/2020/04/20/m4oRz3kOHp2eSBy.png" width="40%"></a> **・redirectAction処理** <a href="https://i.loli.net/2020/04/20/wCo7x6zeh3Pp1OG.png" target="_blank"><img src="https://i.loli.net/2020/04/20/wCo7x6zeh3Pp1OG.png" width="40%"></a> 元のオブジェクトは破棄され、あらたなActionクラスのオブジェクトが生成されているのです。遷移先でもデータが必要であれば、パラメータとして値を設定する必要があります。まとめてすると、下記の2点です。 ・ブラウザのアドレスバー表記とアクションは一致する ・request の内容は引き継がれない **chainの処理フロー** <a href="https://i.loli.net/2020/04/20/GWXezOJP9bi2Zk4.png" target="_blank"><img src="https://i.loli.net/2020/04/20/GWXezOJP9bi2Zk4.png" width="40%" ></a> + **class:** 呼び出されるクラス。省略するとcom.opensymphony.xwork2.ActionSupportクラスが呼ばれる。 + **method:** 呼び出されるメソッド。省略するとexecute()メソッドが呼ばれる。 <br> ## **4.Actionの実装** Struts2において、JSPからサブミットされた際など、Webアプリケーションの処理を担うクラスをActionと呼びます。 Actionクラス自体にsetterを用意しておくと、自動的にパラメタ名に対応したsetterにパラメタ値が設定されます。 Actionや、遷移先のページは、struts.xmlに定義しているのですが、その説明は後程行うので、現時点では、下記の通り実装してください。<br> **(1)** srcフォルダを右クリック>新規>クラスから、次の情報を入力して完了してください。 <!--graph2-6.png--> <a href="https://i.loli.net/2019/06/25/5d11e3aa2360772925.jpg" target="_blank"> <img src="https://i.loli.net/2019/06/25/5d11e3aa2360772925.jpg" width=40%></a> <br> **(2)** パッケージ名に「sample」、名前に「HelloWorldAction」と入力して完了します。 <!--graph2-7.png--> <a href="https://i.loli.net/2019/06/25/5d11ed208863985415.jpg" target="_blank"> <img src="https://i.loli.net/2019/06/25/5d11ed208863985415.jpg" width=40%></a> <br> **(3)** 以下のコードを「**HelloWorldAction.java**」に入力します。 ``` package sample; import com.opensymphony.xwork2.ActionSupport; public class HelloWorldAction extends ActionSupport{ /** 名前 */ private String name; /** * [名前取得処理]<br> * 名前を取得します。<br> * Struts2がフォームに入力された値をパラメータとしてする際、 * getterを使用するため、パラメータとして使用したい情報は、 * Actionクラスのプロパティとして宣言しておき、getterを用意する。 * <br> * @return 名前 */ public String getName() { return name; } /** * [名前設定処理]<br> * 名前を設定します。<br> * getter同様、ページ間で受け渡したい値はsetterを用意しておく。<br> * <br> * @param name 名前 */ public void setName(String name) { this.name = name; } /** * [アクション実行処理]<br> * HelloWorldを出力する処理を実行する。<br> * 実行するメソッドは、struts.xmlで指定したメソッド名を使用して実装する。<br> * Struts2ではアクションの処理結果でページの遷移先を決定するが、 * 今回は"success"の固定文字列を返却する。<br> * <br> * @return */ public String execute() { return "success"; } } ``` <br> ## **5.Struts 2アプリケーションの仕組み** <!--graph2-8.png--> <a href="https://i.loli.net/2019/06/25/5d11da8d44d9495648.png" target="_blank"> <img src="https://i.loli.net/2019/06/25/5d11da8d44d9495648.png" width=40%><br></a> ## **6.実行の流れ** <!--graph2-9.png--> <a href="https://i.loli.net/2019/06/25/5d11da58318f711919.png" target="_blank"> <img src="https://i.loli.net/2019/06/25/5d11da58318f711919.png" width=40%></a> <br> index.jsp を右クリック→実行→ サーバで実行 <!--graph2-9.png--> <a href="https://i.loli.net/2019/06/20/5d0b0a938653932956.jpg" target="_blank"> <img src="https://i.loli.net/2019/06/20/5d0b0a938653932956.jpg" width=40%></a> <!--graph2-9.png--> <a href="https://i.loli.net/2019/06/25/5d11dc5d41fdb57832.jpg" target="_blank"> <img src="https://i.loli.net/2019/06/25/5d11dc5d41fdb57832.jpg" width=40%></a> <br> <br> #### **実行結果** <!--graph2-10.png--> <a href="https://i.loli.net/2019/06/20/5d0b0c3241f5c95676.jpg" target="_blank"> <img src="https://i.loli.net/2019/06/20/5d0b0c3241f5c95676.jpg" width=40%></a> <br><br> ## **7.文字化にの対策** EncodingFilterフィルタは、文字化を避けるためのフィルタです。web.xmlに設定します。<br> **・下記のコードをweb.xmlに追加します。** ``` <!-- エンコード --> <filter> <filter-name>EncodingFilter</filter-name> <filter-class>EncodingFilter</filter-class> <init-param> <param-name>encoding</param-name> <param-value>UTF-8</param-value> </init-param> </filter> <filter-mapping> <filter-name>EncodingFilter</filter-name> <url-pattern>/*</url-pattern> </filter-mapping> ``` <br> **・「EncodingFilter.java」クラスを作ります。** <!--graph2-11.png--> <a href="https://i.loli.net/2019/06/25/5d11ee613799795038.png" target="_blank"> <img src="https://i.loli.net/2019/06/25/5d11ee613799795038.png" width=40%></a> <br> ``` 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; import javax.servlet.annotation.WebFilter; @WebFilter("/EncodingFilter") public class EncodingFilter implements Filter { private String encoding = null; public void init(FilterConfig config) throws ServletException { encoding = config.getInitParameter("encoding"); } public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws ServletException, IOException { request.setCharacterEncoding(encoding); chain.doFilter(request, response); } public void destroy() { encoding = null; } } ```
content
戻る