SHOEISHA iD

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

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

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

Struts 2入門(5)~Viewレイヤーの仕組み~

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

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

今回のサンプルコード

 今回は、HTMLを返さないResult Typeと、汎用タグとUIタグを組み合わせたかんたんなサンプルを紹介します。

 次の図のメニューのアンケート3をクリックすると、サンプル画面に遷移します。ログイン画面では、前回同様、ユーザーIDには「part4」、パスワードには「wings」を入力します。

index.jspのメニュー表示
index.jspのメニュー表示

 今回のアンケート画面はチェックボックスを選択するものです。

アンケート3から遷移した画面
アンケート3から遷移した画面

 チェックボックスの表示には、<s:checkboxlist>タグを用いています。質問が2つあり、それぞれ複数のチェックボックスで該当するものを選択します。確認ボタンをクリックすると、同じ画面で、選択した項目が表示されます。

確認ボタンをクリックした画面
確認ボタンをクリックした画面

 回答のなかに「ワイン」の文字が含まれていると、ダウンロードボタンが表示され、ちょっとしたテキストがダウンロードできるようになります。

ダウンロードのリンクが表示された画面
ダウンロードのリンクが表示された画面
ファイル構造

 ファイル構造は、次のようになります。

 <ContextRoot>
 ├ /WEB-INF
 │ ├ /classes
 │ │ ├ /part5
 │ │ │ └ ViewSample.class(新規追加)
 │ │ └ struts.xml(変更)
 │ ├ /lib
 │ └ web.xml(変更なし)
 ├ /part5
 │ └ viewsample.jsp(新規追加)
 └ index.jsp(変更なし)

 以下が、追加・変更するソース・設定ファイルで、順に説明していくことにしましょう。

  • struts.xml
  • ViewSample.jsp(アンケート画面)
  • ViewSample.java(submit処理、ダウンロード処理)
struts.xml

 struts.xmlには、次の定義を追加します。メニューから呼ばれるActionメソッド、submitで呼ばれるActionメソッド、ダウンロードで利用するActionメソッドの3つです。これは説明するまでもないでしょう。

[リストXX]struts.xmlに追加
<action name="ViewSample" class="part5.ViewSample">
  <result name="success">/part5/viewsample.jsp</result>
</action>

<action name="ViewSampleSubmit" method="submit" class="part5.ViewSample">
  <result name="success">/part5/viewsample.jsp</result>
</action>

<action name="Download"  method="download" class="part5.ViewSample">
  <result name="success" type="stream">
    <param name="contentType">text/plain</param>
    <param name="contentDisposition">attachment; filename="sample.txt"</param>
  </result>
</action>
ViewSample.jsp

 ViewSample.jspは、次のようになります。

[リストXX]ViewSample.jspの一部
<s:form action="ViewSample">
<s:checkboxlist label="あなたの好きなお酒は?(複数可)" name="items1"
list="#{ '1':'日本酒', '2':'焼酎', '3':'ワイン','4':'ビール','5':'ウイスキー'}" />
<s:checkboxlist label="どこでお酒を買うことが多いですか?(複数可)" name="items2"
list="#{'スーパー':'スーパー', 'コンビニ':'コンビニ', 'ディスカウントストア':'ディスカウントストア',
 '自動販売機':'自動販売機', 'その他':'その他'}" />
<s:submit value="確認" action="ViewSampleSubmit" />
</s:form>

回答:<br />

<s:append id="allItems">
<s:param value="items1" />
<s:param value="items2" />
</s:append>

<s:iterator value="allItems">
<s:property /><br />
</s:iterator>

<s:if test="%{downok}">
<a href="Download.action">ダウンロード</a>
</s:if>

 <s:checkboxlist>は、複数のチェックボックスを表示するタグで、ボタンに表示する名称と送信されるデータは、OGNL式のmapオブジェクトで指定します。items1では、submitで数字が送信されることになります。

 <s:append>タグは、指定したリスト要素を連結するタグです。この例では、選択されたチェックボックスの値が入ったitems1と items2を連結しています。そして、<s:iterator>タグで、連結したリストから要素を取り出し、<s:property>タグで出力しています。

 <s:if>タグは、testで指定した値がtrueかどうかで制御を分岐します。ここでは、downokプロパティがtrueなら、ダウンロードの<a>タグを表示するようにしています。

ViewSample.java

 ViewSampleクラスが今回作成するActionクラスです。このクラスのフィールドは、次のとおりです。

[リストXX]ViewSample.javaの一部
// チェックボックス用
private ArrayList<Integer> items1;
private ArrayList<String> items2;

// ダウンロード用
private InputStream inputStream;

// ダウンロードの文字表示フラグ
private boolean downok;

 <s:checkboxlist>タグのデータ用に、ArrayListを2つ設定しています。ダウンロードの文字表示フラグは、前述したように回答に「ワイン」(送信される値は3)が含まれているとtrueになる変数です。フィールドそれぞれに、ゲッターとセッターを用意しています。

 ダウンロードとsubmitのActionメソッドは、次のようになります。

[リストXX]ViewSample.javaの一部
// ダウンロード処理
public String download() {
    String tmp = "ワインは...";
    this.inputStream = new ByteArrayInputStream(tmp.getBytes());
    return "success";
}

public String submit() {

    setDownok(false);

    try {
        // ワインがあるかどうか
        for ( Integer i : this.items1 ) {
            if ( i == 3 ) {
                setDownok(true);
                break;
            }
        }
    }
    catch(Exception e){
    }

    return "success";
}

 ダウンロード処理では、文字列をByteArrayInputStreamに変換してinputStreamに設定しています。submitの処理は、items1リストに3があるかどうかを判定して、downokに結果を設定しています。

まとめ

 今回は、Viewレイヤーの仕組みとして、Result処理とStrutsタグの概要を説明しました。これらは、過去の記事中にもふれていましたので、やや重複する内容だったかもしれません。次回は、Zero Configuration(ゼロ・コンフィグレーション)と呼ばれる機能を中心に解説することにしましょう。

参考資料

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

  • 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/3565 2009/03/04 14:00

おすすめ

アクセスランキング

アクセスランキング

イベント

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

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

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

メールバックナンバー

アクセスランキング

アクセスランキング