特殊なセレクトボックスを使うのでなければ、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
141517
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クラスを書いています。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。