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

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

新規登録して質問してみよう
ただいま回答率
85.48%
Struts 2

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

Q&A

1回答

3711閲覧

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

linemen

総合スコア4

Struts 2

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

0グッド

0クリップ

投稿2018/07/15 04:35

前提・実現したいこと

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タグを記述しても無効という記事を見た記憶があるのですが、それが原因でしょうか?
ご教示ください。

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

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

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

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

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

入力画面:(select.jsp)

html

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

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

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

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

java

1package seren.sample.struts2.s2_convention.actions; 2 3import java.util.HashMap; 4import java.util.Map; 5 6import org.apache.struts2.convention.annotation.Action; 7import org.apache.struts2.convention.annotation.Namespace; 8import org.apache.struts2.convention.annotation.Result; 9import org.apache.struts2.convention.annotation.Results; 10import org.apache.struts2.interceptor.SessionAware; 11 12import com.opensymphony.xwork2.ActionSupport; 13 14/** 15 * @author A-pZ 16 * 17 */ 18@Namespace("/select") 19@Results({ 20 @Result(name=ActionSupport.SUCCESS, location="select.jsp"), 21 @Result(name="confirm", location="confirm.jsp") 22}) 23public class SelectboxAction extends ActionSupport implements SessionAware { 24 @Action("") 25 public String display() throws Exception { 26 return ActionSupport.SUCCESS; 27 } 28 29 @Action("confirm") 30 public String confirm() throws Exception { 31 session.put("selectedValue", selectedValue); 32 return "confirm"; 33 } 34 35 @Action("back") 36 public String backScreen() throws Exception { 37 return ActionSupport.SUCCESS; 38 } 39 40 @Override 41 public void setSession(Map<String, Object> session) { 42 this.session = session; 43 } 44 45 private Map<String, Object> session; 46 47 private String selectedValue; 48 49 public String getSelectedValue() { 50 return selectedValue; 51 } 52 53 public void setSelectedValue(String selectedValue) { 54 this.selectedValue = selectedValue; 55 } 56 57 private Map<String, String> prefectures = new HashMap<String, String>() {{ 58 put("01", "群馬"); 59 put("02", "栃木"); 60 put("03", "茨城"); 61 put("04", "さいたま"); 62 put("05", "東京"); 63 put("06", "千葉"); 64 put("07", "横浜"); 65 }}; 66 67 public Map<String, String> getPrefectures() { 68 return this.prefectures; 69 } 70 71}

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

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

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

html

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

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

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

投稿2018/07/15 05:30

A-pZ

総合スコア12011

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問