質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

90.32%

  • Struts 2

    141questions

    Apache Struts 2は、Apache Strutsプロジェクトにて開発されているオープンソースのJavaベースのWebアプリケーションフレームワークです。Sturts1に比べ、設定ファイルの削減、依存性の注入、POJO等の改善がなされています。

Struts2 プルダウンの入力保持について

受付中

回答 1

投稿

  • 評価
  • クリップ 0
  • VIEW 439

linemen

score 0

 前提・実現したいこと

Java(Struts2)でECサイトライクなWebアプリを作成しています。
実現したい動作は次の通りです。

1.ある選択肢をプルダウンから選択し、次ページの確認画面に遷移
2.誤った選択肢を選んだ場合、確認画面の「修正」ボタン等で前ページに戻る
3.戻った先のページで、1項で選択した選択肢を保持

 発生している問題

1項で選択した選択肢をsessionに格納したが、3項での保持がなされない。

 該当のソースコード jsp

           <s:if test="#session.containsKey('productDTO')">
                <s:form action="AddProductConfirmAction" >

                商品詳細:<s:textfield name="productDescription"
                        value="%{#session.addProductDTO.productDescription}"  />
                    <br>
                場所:<select name="countryId" >
                        <option value="1" <s:if test='%{#session.productDTO.countryId} == 1'> selected="selected"</s:if>>アメリカ</option>
                        <option value="2" <s:if test='%{#session.productDTO.countryId} == 2'> selected="selected"</s:if>>イギリス</option>
                        <option value="3" <s:if test='%{#session.productDTO.countryId} == 3'> selected="selected"</s:if>>フランス</option>
                        <option value="4" <s:if test='%{#session.productDTO.countryId} == 4'> selected="selected"</s:if>>イタリア</option>

            </s:if>

 試したこと

sessionのcountyIdに一致する選択肢をselected="selected"となるようにしたいのですが、うまく反映されません。
s:ifタグ内に、別のs:ifタグを記述しても無効という記事を見た記憶があるのですが、それが原因でしょうか?
ご教示ください。

  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 1

+1

特殊なセレクトボックスを使うのでなければ、Struts2のタグには <s:select> を使うと良いでしょう。初期値を設定する機能もありますので、それを使ったほうが非常に楽になります。

入力画面:(select.jsp)

<%@ page contentType="text/html; charset=UTF-8" isELIgnored="false"%>
<%@ taglib prefix="s" uri="/struts-tags" %>
<html>
<head>
    <title>Struts2 Formサンプル</title>
</head>
<body>
<s:form method="post" action="confirm">
    <s:label for="selectedValue" value="都道府県を選択"/>
    <s:select name="selectedValue" emptyOption="---" list="%{prefectures}" value="#session.selectedValue"></s:select>
    <s:submit value="送信する" />
</s:form>
</body>
</html>

セレクトボックスから送信される値は selectedValue の名前です。
valueに #session.selectedValue を記載していますので、これがセレクトボックスの初期値になります。HTTPセッションからselectecValueの値を取得し、それに合致した値ならば、それを初期選択します。

list属性にかかれている %{prefectures} は、ActionクラスないしはStruts2で扱っているサーブレット属性から参照する、セレクトボックスのラベルと値の一覧で、java.util.Map形式のものを入れます。

これを受けるActionクラスは、例えば以下のようになるでしょう。

package seren.sample.struts2.s2_convention.actions;

import java.util.HashMap;
import java.util.Map;

import org.apache.struts2.convention.annotation.Action;
import org.apache.struts2.convention.annotation.Namespace;
import org.apache.struts2.convention.annotation.Result;
import org.apache.struts2.convention.annotation.Results;
import org.apache.struts2.interceptor.SessionAware;

import com.opensymphony.xwork2.ActionSupport;

/**
 * @author A-pZ
 *
 */
@Namespace("/select")
@Results({
    @Result(name=ActionSupport.SUCCESS, location="select.jsp"),
    @Result(name="confirm", location="confirm.jsp")
})
public class SelectboxAction extends ActionSupport implements SessionAware {
    @Action("")
    public String display() throws Exception {
        return ActionSupport.SUCCESS;
    }

    @Action("confirm")
    public String confirm() throws Exception {
        session.put("selectedValue", selectedValue);
        return "confirm";
    }

    @Action("back")
    public String backScreen() throws Exception {
        return ActionSupport.SUCCESS;
    }

    @Override
    public void setSession(Map<String, Object> session) {
        this.session = session;
    }

    private Map<String, Object> session;

    private String selectedValue;

    public String getSelectedValue() {
        return selectedValue;
    }

    public void setSelectedValue(String selectedValue) {
        this.selectedValue = selectedValue;
    }

    private Map<String, String> prefectures = new HashMap<String, String>() {{
        put("01", "群馬");
        put("02", "栃木");
        put("03", "茨城");
        put("04", "さいたま");
        put("05", "東京");
        put("06", "千葉");
        put("07", "横浜");
    }};

    public Map<String, String> getPrefectures() {
        return this.prefectures;
    }

}

先程のprefecturesはこのActionクラスの末尾にて宣言しています。(この実装は、Actionクラスが実行されるたびにインスタンスが作られるものです。実際には静的に定義されたものを使うか、データベースやファイル化された一覧から得られるものが入るでしょう)

confirmメソッドが呼び出されると、session属性へ selectedValue の名前で選択した値が格納されます。

念の為、確認画面ですが、
入力画面:(confirm.jsp)

<%@ page contentType="text/html; charset=UTF-8" isELIgnored="false"%>
<%@ taglib prefix="s" uri="/struts-tags" %>
<html>
<head>
    <title>Struts2 Formサンプル</title>
</head>
<body>
<s:form method="post" action="back">
    選んだ値:<s:property value="selectedValue" />
    <s:submit value="戻る" />
</s:form>
</body>
</html>


特に変わったことはせず、backのAction、つまり backScreenメソッドを呼び出すだけです。

※このサンプルコードは、conventionプラグインを利用してActionクラスを書いています。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

同じタグがついた質問を見る

  • Struts 2

    141questions

    Apache Struts 2は、Apache Strutsプロジェクトにて開発されているオープンソースのJavaベースのWebアプリケーションフレームワークです。Sturts1に比べ、設定ファイルの削減、依存性の注入、POJO等の改善がなされています。