広告 |
---|
■■■■■■■■■■■■■■■■■■■■■■■■■■■■■ 2009年12月20日 Java総合講座 - 初心者から達人へのパスポート vol.184 セルゲイ・ランダウ バックナンバー: http://www.flsi.co.jp/Java_text/ ■■■■■■■■■■■■■■■■■■■■■■■■■■■■■ ------------------------------------------------------- ・現在、このメールマガジンは以下の2部構成になっています。 [1] 当初からのコース:毎週日曜の夜に発行 これは現在、中級レベルになっています。 [2] 2009年11月開講コース:毎週水曜の夜に発行 これは現在、初心者向けのレベルになっています。 ・このメールマガジンは、画面を最大化して見てください。 小さな画面で見ていると、不適切な位置で行が切れてしまう など、問題を起すことがあります。 ・このメールマガジンに掲載されているソース・コード及び 文章は特に断らない限り、すべて筆者が著作権を所有してい ます。また、これらのソース・コードは学習用のためだけに 提供しているものです。 ------------------------------------------------------- ======================================================== ◆ 01.Strutsのアプリケーション開発 ======================================================== では、今回は、StrutsEtoTestプロジェクトの各ソース・コードを 簡単に解説していきます。 では、まずindex.jspのソース・コードを下記に再度提示して おきます。 -------------------------------------------------------- <%@ page contentType="text/html; charset=UTF-8" %> <%@ taglib uri="/tags/struts-bean" prefix="bean" %> <%@ taglib uri="/tags/struts-logic" prefix="logic" %> <%@ taglib uri="/tags/struts-html" prefix="html" %> <%@ taglib uri="/tags/struts-nested" prefix="nested" %> <html:html> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"/> <title>干支(十二支)</title> </head> <body> <h1>干支(十二支)を調べる</h1> <html:form method="POST" action="/eto"> <br> 干支を調べたい年: <br> <html:text property="year" size="5" /> <br> <html:errors /> <html:submit property="submit" value="送信" /> </html:form> </body> </html:html> -------------------------------------------------------- まず、1行目の <%@ page contentType="text/html; charset=UTF-8" %> については、既に(vol.086で)学んでいますね。 次の2〜5行目の <%@ taglib uri="/tags/struts-bean" prefix="bean" %> <%@ taglib uri="/tags/struts-logic" prefix="logic" %> <%@ taglib uri="/tags/struts-html" prefix="html" %> <%@ taglib uri="/tags/struts-nested" prefix="nested" %> は、このJSPのページでどのようなタグ・ライブラリー(下の補足を参照) を使用するのかを定義する文(正確にはディレクティブ(directive = 命令))です。 そして、uri=にはそのタグ・ライブラリーのありか(場所)を指定し、 prefix=にはそのタグ・ライブラリーを参照するためのプリフィックス (prefix = 接頭辞)を指定します。 ┌補足─────────────────────────┐ JSPにはカスタム・タグ(custom tag)と呼ばれる、ユーザーが 独自のタグを定義できる機能があり、これらはタグ・ライブラ リー(tag library)と呼ばれる入れ物(拡張子が.tldのファイ ル)の中にまとめて定義されます。 Strutsではこの仕組みを利用して独自のタグ・ライブラリーを 提供しており、2〜5行目のようにbean、logic、html、nestedと いうプリフィックスで参照されるようになっています。 └───────────────────────────┘ このプリフィックスは具体的には、7行目や14行目のように<html:・・・> という形式で使用されます。 今回はhtmlというプリフィックスしか参照していないので4行目だけ しか必要ないのですが、2〜5行目はStrutsIDEプラグインが自動的に 挿入した行であるし、そのまま残しておいても害はないので、その ままにしています。 ここでちょっと注意しておきますが、このtaglibディレクティブの uri=の指定はその場所をずばり表しているわけではありません。 例えば、この/tags/struts-beanという指定が実際にはどこにあるのか、 というと、/tags/struts-beanという場所にあるのではなく、実際は web.xmlの中に/tags/struts-beanの実際のありかを記述しています。 そして、web.xmlの中では、実際のありかは/WEB-INF/struts-bean.tld として記述してあります。(StrutsIDEプラグインが自動的に記述 しています。) Eclipseのプロジェクト・エクスプローラー内のStrutsEtoTestプロジェ クト内のWebContentフォルダー内のWEB-INFフォルダーの中を見て調べ てみて下さい。 ┌補足─────────────────────────┐ JSP特有のタグの構文の詳細については、Webページ http://java.sun.com/products/jsp/tags/12/syntaxref12.html などで調べることができます。 └───────────────────────────┘ あと残りのソース・コードは <html: で始まるタグだけがStruts独自のタグで、 他は普通のHTMLの文になっています。 このうち、7行目と23行目 <html:html> </html:html> はHTMLの <HTML> </HTML> に相当します。(実際にサーバーからWebブラウザーへWebページが返される ときにこのHTML文に変換されてから返されます。) 17行目の <html:text property="year" size="5" /> は年の数字を入力させるためのテキスト・フィールドで、HTMLでは <input type="text" name="year" size="5" value=""> というコードに相当します。(実際にサーバーからWebブラウザーへWebページ が返されるときにこのHTML文に変換されてから返されるのです。) ところで、このJSPファイルは、vol.178のindex.htmlと同じく、干支を調べた い年を入力させ、サーブレットを呼び出すためのものですが、vol.178とは違い、 年の数字を直接入力させる形式にしていることに注意して下さい。この場合、 ユーザーがどんな値を入力するかわかりませんので、数字以外の文字を入力 した場合などに対するチェック(検証)が必要になるわけです。 そのために、前回お話したValidatorプラグインを使用しているわけです(詳しく は後述)。 そして、このValidatorプラグインによる検証の結果、入力データに問題があった 場合には、エラーのメッセージが返ってきますが、そのエラー・メッセージの 出力先が、19行目の <html:errors /> というコードを指定した場所になります。これはvol.107でも出てきましたね。 前回は色づけなどをせずに表示していたので、あまりエラーという感じがしな かったかもしれませんので、あとで色付けなどの装飾を行ってみましょう。 ┌補足─────────────────────────┐ Strutsのタグ・ライブラリーの詳細については、Webページ http://struts.apache.org/1.x/struts-taglib/ などで調べることができます。 └───────────────────────────┘ 20行目の <html:submit property="submit" value="送信" /> は、HTMLでは <input type="submit" name="submit" value="送信"> というコードに相当します。つまり、実際にサーバー側でこのHTML文に変換されて からWebブラウザーに返されることになります。 そして、14行目の <html:form method="POST" action="/eto"> はHTMLでは、 <form name="etoForm" method="POST" action="/StrutsEtoTest/eto.do"> というコードに相当します。実際にサーバー側でこのようなHTML文への変換 が行われるわけですが、このとき、vol.105などでもお話したように、etoの うしろに.doがつけられることに注意してください。 (ちなみに、/eto.doの前に/StrutsEtoTestがついていることからわかるように、 WTPのデフォルトではプロジェクト名(ここではStrutsEtoTest)がコンテキスト・ ルート(Context root = Context path = ドキュメント・ルート)として扱われ ます。これは、vol.101などでお話したように、Tomcatのディレクトリーでは、 webappsディレクトリーの配下のディレクトリー名に相当します。) .doがついていることによって、ActionServletが呼び出され、ActionServletは struts-config.xmlの中をみて、呼び出すActionクラスを探すのでしたね。 そこで、前回は、struts-config.xmlの中(14〜17行目)に <action path="/eto" type="jp.co.flsi.lecture.struts.test.ProcessEtoAction" name="etoForm" scope="request" input="/index.jsp" validate="true"> <forward name="success" path="/result.jsp"/> </action> というコードを書き込みました。 これは、vol.105でもお話したように、「/etoというパスがURLに指定されていたら jp.co.flsi.lecture.struts.test.ProcessEtoActionというActionクラスを呼び出し (そのexecuteというメソッドを実行し)、その結果forwardに"success"という 文字列が設定されたら、/result.jspというJSPファイルを結果のWebページとして Webブラウザーに返しなさい。」ということを指定しています。 また、 input="/index.jsp" validate="true" という指定があることにより、(name=で指定された)etoFormのデータに対して、 (validate="true"という指定があるので)データの検証(妥当性チェック)を行い、 その検証の結果に問題(不正)があった場合は(input=で指定された)/index.jspに 遷移することになる、ということもvol.105でもお話した通りです。 そして、etoFormについては、struts-config.xmlの中(7行目)に <form-bean name="etoForm" type="jp.co.flsi.lecture.struts.test.EtoForm" /> と書いておきましたから、jp.co.flsi.lecture.struts.test.EtoFormというクラス (FORMのデータを保有するクラスなのでFormビーンと呼ぶ)をetoFormに割り振って あるわけです。 こうしておくと、ActionServletはindex.jspのFORMのデータをEtoFormに渡し、 Validatorプラグインによる検証(後述)を実行し、検証結果に問題があれば index.jspのWebページをWebブラウザーに返します。あるいは検証結果に問題が なければProcessEtoActionを呼び出し、その結果forwardに"success"が設定 されたら(今回は必ず"success"が設定されるようにしている)/result.jspの WebページをWebブラウザーに返すということになります。 EtoFormのソース・コードについては説明するまでもないと思います。ただ yearのsetterメソッドとgetterメソッドがあるだけです。 ただし、ValidatorFormのサブクラスになっていることに注意して下さい。 こうしておくと、このFormビーンに取り込まれたデータに対して自動的に 検証(詳しくは後で説明)が行われます。 では、続いてProcessEtoActionのソース・コードを見てみましょう。 (下に再提示します。) -------------------------------------------------------- package jp.co.flsi.lecture.struts.test; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import javax.servlet.http.HttpSession; 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 ProcessEtoAction extends Action { public ActionForward execute(ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response) { EtoForm etoForm = (EtoForm) form; EtoBean etoBean = new EtoBean(); etoBean.calcEto(Integer.parseInt(etoForm.getYear())); HttpSession session = request.getSession(); session.setAttribute("etoBean", etoBean); return mapping.findForward("success"); } } -------------------------------------------------------- これもほとんど説明の必要がないと思いますが、execute()メソッドの引数の うち、ActionForm formという引数には、先ほどのstruts-config.xmlの中で name="etoForm"という形式で指定したetoForm(すなわちEtoFormクラスの オブジェクト)が渡されることになります。(ActionServletがstruts-config.xml の記述に従ってこのProcessEtoActionのexecute()メソッドを呼び出し、その ときに必要な引数の引渡しを行っている。) したがって、このformという引数にはEtoFormのオブジェクトが入るわけですが、 EtoFormのメソッドを呼び出す(上のソース・コードではgetYear()メソッドを 呼び出している)ためにはEtoForm型にキャストしてやる必要があります。 というわけで、 EtoForm etoForm = (EtoForm) form; という行があるわけです。 では、続いてEtoBeanのソース・コードを見てみましょう。 -------------------------------------------------------- package jp.co.flsi.lecture.struts.test; public class EtoBean { private String eto = "不明"; public void setEto(String eto) { this.eto = eto; } public String getEto() { return eto; } public void calcEto(int year) { int diff = (year - 1995) % 12; if (diff < 0) diff += 12; switch (diff) { case 0: eto = "亥"; break; case 1: eto = "子"; break; case 2: eto = "丑"; break; case 3: eto = "寅"; break; case 4: eto = "卯"; break; case 5: eto = "辰"; break; case 6: eto = "巳"; break; case 7: eto = "午"; break; case 8: eto = "未"; break; case 9: eto = "申"; break; case 10: eto = "酉"; break; case 11: eto = "戌"; break; default: break; } } } -------------------------------------------------------- これも特に説明の必要はないと思いますが、ただ、vol.178のときのロジックに 対して、 if (diff < 0) diff += 12; というコードが追加されている点が異なることに注意して下さい。 これは、vol.178の場合と違って、今回のアプリケーションでは入力される年 の数字が何ら制限されていないため、1995よりも小さい場合もあるからです。 なお、演算子「%」の働きがよくわからないという人は、vol.027を復習して 下さい。 あと、このビーン(このEtoBeanはJavaBeansのルールに従って作成してあるBean) のプロパティーとしてetoを用意してある(etoのgetterメソッドを用意してある) ことも覚えておいて下さい。これはあとで参照します。 続いてresult.jspを見てみましょう。 -------------------------------------------------------- <%@ page contentType="text/html; charset=UTF-8" %> <%@ taglib uri="/tags/struts-bean" prefix="bean" %> <%@ taglib uri="/tags/struts-logic" prefix="logic" %> <%@ taglib uri="/tags/struts-html" prefix="html" %> <%@ taglib uri="/tags/struts-nested" prefix="nested" %> <html:html> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"/> <title>干支(十二支)</title> </head> <body> <h1>干支(十二支)の結果</h1> <br> 干支は: <bean:write name="etoBean" property="eto"/> </body> </html:html> -------------------------------------------------------- ここで16行目の <bean:write name="etoBean" property="eto"/> というコードは、 <jsp:useBean class="jp.co.flsi.lecture.struts.test.EtoBean" id="etoBean" scope="session" /> <%= etoBean.getEto() %> に相当します。このように、JSPの普通のコードでは、etoBeanのプロパティーeto の値を取得するためのコードが長ったらしくなりますが、Strutsのタグを使うと 簡単に書けるのです。また普通のJSPのコードと違ってscope=の指定は必要なく、 requestでもsessionでも自動的に識別してくれますので簡単です。 では、最後にvalidation.xmlのソースを見てみましょう。これは、Validatorプラグイン による検証の内容を記述するためのものです。 ◆ ◆ ◆ ◆ ◆ ◆ ◆ ◆ ◆ ◆ ◆ ◆ ◆ ◆ ◆ ◆ ◆ ◆ ◆ (次回に続く) では、今日はここまでにします。 ┏━━━━━━━━━━━━━━━━━━━━━━━━━━━┓ ★ホームページ: http://www.flsi.co.jp/Java_text/ ★このメールマガジンは 「まぐまぐ(http://www.mag2.com)」 を利用して発行しています。 ★バックナンバーは http://www.flsi.co.jp/Java_text/ にあります。 ★このメールマガジンの登録/解除は下記Webページでできます。 http://www.mag2.com/m/0000193915.html ★このメールマガジンへの質問は下記Webページにて受け付けて います。わからない所がありましたら、どしどしと質問をお寄 せください。 http://www.flsi.co.jp/Java_text/ ┗━━━━━━━━━━━━━━━━━━━━━━━━━━━┛ Copyright (C) 2009 Future Lifestyle Inc. 不許無断複製 |