SHOEISHA iD

※旧SEメンバーシップ会員の方は、同じ登録情報(メールアドレス&パスワード)でログインいただけます

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

作りながら学ぶJavaアプリケーションフレームワーク

Struts 2入門(2)~バリデーションの仕組みを理解する(前編)~

作りながら学ぶJavaアプリケーションフレームワーク


  • X ポスト
  • このエントリーをはてなブックマークに追加

ファイルの解説

struts.xml

 先ほどの画面遷移をもとにすると、struts.xmlは次のような設定になります。今回もstruts.xmlにて設定を記述する方法で解説します。設定ファイルを省略する方法は次回以降に紹介する予定です。

 struts.xmlには、以下のようにpackageタグ配下に新たな定義を追加します。

struts.xml(packageタグ配下に追加)
<action name="Research" class="part2.Research">
    <result name="success">/part2/research.jsp</result>
</action>

<action name="ResearchConfirm" method="confirm" class="part2.Research">
    <result name="success">/part2/confirm.jsp</result>
</action>

 ここでは2つのActionの定義をしています。最初のResearchアクションの定義は、Researchクラスのexecute()メソッドを実行し、戻り値が"success"の場合には、/part2/research.jspという入力ページを表示するものです。

 次のResearchConfirmアクションは、確認ボタンをsubmitしたときに呼び出されるActionで、method属性にて同じResearchクラスのconfirm()というメソッドを割り当てています。confirm()メソッドが"success"を返すと、/part2/confirm.jspを通して結果を表示します。

index.jsp

 トップページのindex.jspには、入力画面を表示するResearchアクションへのリンクを追加します。

index.jsp(body内の追加分)
<a href="Research.action"> アンケート </a><br />

research.jsp

 Research.actionの実行後に表示するJSPファイルは、/part2/research.jspとし、次のようになります。携帯CMに関するアンケートという感じのページにしました。<s:form>、<s:textfield>、<s:radio>、<s:submit>がカスタムタグです。

research.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%@ taglib prefix="s" uri="/struts-tags" %>   
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" 
    "http://www.w3.org/TR/html4/loose.dtd">
<html><head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>アンケート</title></head>
<body>
<s:form action="Research">
<s:textfield label="名前" name="name" />
<s:textfield label="メールアドレス" name="email" />
<s:textfield label="年齢" name="age" />
<s:radio label="どの携帯のCMが好き?" name="career" 
         list="#{'1':'ドコモ', '2':'au', '3':'ソフトバンク'}"/>
<s:submit value="確認" action="ResearchConfirm" />
</s:form>
</body>
</html>

 <s:form>のaction属性で、submit時に実行するActionクラスを指定します。submitが複数ある場合には、submitごとに異なるActionを設定することもできます。今回はsubmitにResearchConfirmアクションを設定しています。

 <s:radio>では、ラジオボタンの選択肢をOGNL式で記述したMapオブジェクトとしてlist属性で設定しています。OGNL(Object Graph Navigation Language) とは、オブジェクトを操作するためのJavaと似たような式言語のことです(参考資料のOGNLガイドが詳しいです)。

 その他の設定できる属性などカスタムタグの詳細については、Struts 2のタグリファレンスを参照してください。

表示テーマ
 入力ページのフォーム表示を見てください。指定したわけではないのに、レイアウトされていることに気がついたでしょうか。
 ブラウザで表示された入力ページのソースを見て確かめてみると、テーブルタグが追加されているはずです。Struts 2では、カスタムタグの表示をあらかじめ決められたテンプレート(テーマ)にもとづいてレンダリングするようになっており、デフォルトでは「xhtml」というテーマが適用されます。このテーマは、テーブルレイアウト、検証用のメッセージ表示、ラベル表示、必須入力表示などが自動で行われます。これ以外のテーマは、
  • simple(最低限のレイアウトを行うテンプレート)
  • css_xhtmlテーマ(テーブルレイアウトの代わりにCSSでのレイアウトを適用)
  • ajaxテーマ(Struts 2が提供するAjax機能を使う場合)
 となります。さらに自分で作った独自のテーマを使うこともできます。
 なお、適用するテーマの設定は、<s:form>等のタグでのtheme属性を用いて個別に指定するか、または、struts.xmlに以下のような<constant>タグを追加してアプリケーション単位に指定する方法があります。
<constant name="struts.ui.theme" value="simple" />

confirm.jsp

 次の/part2/confirm.jspは、確認のための入力値表示ページです。前回同様、プロパティを表示するタグ<s:property>を使っています。

confirm.jsp(一部省略)
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>確認</title>
</head>
<body>
名前:<s:property value="name"/><br />
メールアドレス:<s:property value="email"/><br />
年齢:<s:property value="age"/><br />
キャリア:<s:property value="career"/><br />
</body>

Research.java

 Actionクラスは、Research.classの1つだけです。ソースファイルは、/WEB-INF/src/part2/Research.javaとなり、内容は以下のようになります。

Research.java
package part2;
import com.opensymphony.xwork2.ActionSupport;

public class Research extends ActionSupport {

    private static final long serialVersionUID = 1L;

    // 入力フィールドに対応したメンバ変数
    private String name;
    private String email;
    private int age;
    private String career;

    public String getName(){ return name; }
    public void setName(String name){ this.name = name; }

    public String getEmail(){ return email; }
    public void setEmail(String email){ this.email = email; }

    public int getAge(){ return age; }
    public void setAge(int age){ this.age = age; }

    public String getCareer(){ return career; }
    public void setCareer(String career){ this.career = career; }

    // デフォルトのActionメソッド
    public String execute() throws Exception {
        return "success";
    }

    // submit時のActionメソッド
    public String confirm() throws Exception {
        return "success";
    }
}

 パッケージはpart2にしています。入力フォームの項目に対応したメンバ変数と、そのアクセッサ(getter/setterメソッド)、そして、Actionメソッドのexecute()とconfirm()です。

 Struts 2では、フォームに入力された値は対応するActionクラスのメンバ変数にsetterメソッドを介して自動的にセットされます。フォームに対応した変数として数値型が使えることに注目してください。Struts 2により自動的に型変換が行われます。数値のほかに、日付を入力したい場合にはDate型を使うこともできます。

 前回のクラスと異なるのは、confirm()というメソッドがあることと、ActionSupportクラスを継承していることです。ActionSupportクラスとは、その名のとおり、Actionクラスをサポートするクラスです。今回は次項で説明するバリデーション機能を使うために継承しています。なおActionSupportクラスは、Strust 2のライブラリ内のクラスですので、利用するには参照ライブラリの設定が必要です。プロジェクトのプロパティにある「Javaのビルドパス」のライブラリで、「外部JARの追加」を選び、/WEB-INF/libにコピーしたStruts 2のJARファイル群を追加しておいてください。

 Actionクラスは、デフォルトでexecute()というメソッドを実行することを前回説明しました。execute()以外のメソッドもActionとして実行するメソッドにでき、今回のResearchクラスでは前述のstruts.xmlの設定のとおり、confirm()メソッドを確認ボタンがクリックされた時に呼び出されるActionメソッドとしています。実態は単に"success"を返すだけです。

年齢フィールドに0表示されるのは
 上記のresearch.jspでは、入力フィールドの初期値を示すvalue属性の設定は行っていません。valueの設定は自動で行われるからです。例えば、「名前」の<s:textfield>の場合、JSPの表示時にActionクラスのgetName()が呼ばれ、その戻り値がvalueに設定されます。Research.actionの最初の表示で年齢フィールドにいきなり"0"と表示されるのは、getAge()の戻り値"0"がvalueに設定されているからなのです。
 

次のページ
基本のバリデーションとは

この記事は参考になりましたか?

  • X ポスト
  • このエントリーをはてなブックマークに追加
作りながら学ぶJavaアプリケーションフレームワーク連載記事一覧

もっと読む

この記事の著者

山田 祥寛(ヤマダ ヨシヒロ)

静岡県榛原町生まれ。一橋大学経済学部卒業後、NECにてシステム企画業務に携わるが、2003年4月に念願かなってフリーライターに転身。Microsoft MVP for Visual Studio and Development Technologies。執筆コミュニティ「WINGSプロジェクト」代表。主な著書に「独習シリーズ(Java・C#・Python・PHP・Ruby・JSP&サーブレットなど)」「速習シリーズ(ASP.NET Core・Vue.js・React・TypeScript・ECMAScript、Laravelなど)」「改訂3版JavaScript本格入門」「これからはじめるReact実践入門」「はじめてのAndroidアプリ開発 Kotlin編 」他、著書多数

※プロフィールは、執筆時点、または直近の記事の寄稿時点での内容です

WINGSプロジェクト 高江 賢(タカエ ケン)

WINGSプロジェクトについて> 有限会社 WINGSプロジェクトが運営する、テクニカル執筆コミュニティ(代表 山田祥寛)。主にWeb開発分野の書籍/記事執筆、翻訳、講演等を幅広く手がける。2018年11月時点での登録メンバは55名で、現在も執筆メンバを募集中。興味のある方は、どしどし応募頂きたい。著書記事多数。 RSS Twitter: @yyamada(公式)、@yyamada/wings(メンバーリスト) Facebook

※プロフィールは、執筆時点、または直近の記事の寄稿時点での内容です

この記事は参考になりましたか?

この記事をシェア

  • X ポスト
  • このエントリーをはてなブックマークに追加
CodeZine(コードジン)
https://codezine.jp/article/detail/2391 2008/08/19 19:58

おすすめ

アクセスランキング

アクセスランキング

イベント

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

新規会員登録無料のご案内

  • ・全ての過去記事が閲覧できます
  • ・会員限定メルマガを受信できます

メールバックナンバー

アクセスランキング

アクセスランキング