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

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

ただいまの
回答率

90.12%

プルダウンの表示について。

解決済

回答 1

投稿

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

naotaro0704

score 12

前提・実現したいこと

SpringMVCフレームワークを使用しています。

初期画面と明細追加画面があり、初期画面の「商品」プルダウンでiteratorを使って表示したいと考えています。現在は、<form:select name="id" path="name" items="${nameList}" />のように表示させています。、SalesSystemController.javaで呼び出しをし、商品を選択して明細追加画面に行くのですがSystem.out.println(form.getId());で取得したidがnullとなってしまいます。

希望する動作としては、
1、itaretorでプルダウンを表示する。
2、取得するidがnullにならないようにする。

です。わかる方がいましたらご教授お願いします。

該当のソースコード

SalesSystemController.java

package jp.practice.sales;

@Controller
@RequestMapping(value = "/system")
public class SalesSystemController {

    // private MessageSource messageSource;
    private static final Logger logger = LoggerFactory.getLogger(SalesSystemController.class);

    private static final String INIT = "init";
    private static final String ADD = "add";
    private static final String FIX = "fix";

    private static final String ERRMSG = "1以上の数字を入力してください";

    @RequestMapping(value = "/start")
    public String init(SalesForm form, Model model) {
//        RecordManagerにItemListを格納する
        model.addAttribute("ItemList", RecordManager.getItemList());
//        RecordManagerにNameListを作成する
        model.addAttribute("nameList", RecordManager.makeNameList());
        return INIT;
    }

    @RequestMapping(params = "add", method = RequestMethod.POST)
    public String add(@Valid SalesForm form, BindingResult result, Model model) {

        logger.info("Post : " + form.getQuantity());
System.out.println(form.getId());

        model.addAttribute("allList", RecordManager.selectItem(form.getName()));
//        RecordManagerにNameListを作成する
        model.addAttribute("nameList", RecordManager.makeNameList());
        if (result.hasErrors()) {
            model.addAttribute("message", ERRMSG);
            return INIT;
        } else {
            model.addAttribute("addData", form.getQuantity());
            return ADD;
        }

    }
}


SalesForm.java

package jp.practice.sales;

public class SalesForm implements Serializable {
    private static final long serialVersionUID = 1L;

    /** 商品id */
    private String id;
    /** 商品名 */
    private String name;
    /** 単価 */
    private int price;
    /** 個数 */
    @Min(1)
    //@Pattern(regexp = "\\d")
    @NotNull
    private int quantity;
    /** 小計 */
    private int subtotal;
以下、上記のコンストラクタとgetterとsetterがあります


Item.java

package jp.practice.sales;



/**
 * 売上明細1件分のデータを保持するクラス
 */
public class Item {

    /** 商品id */
    private String id;
    /** 商品名 */
    private String name;
    /** 単価 */
    private int price;

    /** 個数 */

    private int quantity;
    /** 小計 */
    private int subtotal;
    /*
     * (非 Javadoc)
     *
     * @see java.lang.Object#hashCode()
     */
    @Override
    public int hashCode() {
        final int prime = 31;
        int result = 1;
        result = prime * result + quantity;
        return result;
    }

    /*
     * (非 Javadoc)
     *
     * @see java.lang.Object#equals(java.lang.Object)
     */
    @Override
    public boolean equals(Object obj) {
        if (this == obj) {
            return true;
        }
        if (obj == null) {
            return false;
        }
        if (!(obj instanceof Item)) {
            return false;
        }
        Item other = (Item) obj;
        if (quantity != other.quantity) {
            return false;
        }
        return true;
    }

    /**
     * @return id
     */
    public String getId() {
        return id;
    }

    /**
     * @param id
     *            セットする id
     */
    public void setId(String id) {
        this.id = id;
    }

    /**
     * @return name
     */
    public String getName() {
        return name;
    }

    /**
     * @param name
     *            セットする name
     */
    public void setName(String name) {
        this.name = name;
    }

    /**
     * @return price
     */
    public int getPrice() {
        return price;
    }

    /**
     * @param price
     *            セットする price
     */
    public void setPrice(int price) {
        this.price = price;
    }

    /**
     * @return quantity
     */
    public int getQuantity() {
        return quantity;
    }

    /**
     * @param quantity
     *            セットする quantity
     */
    public void setQuantity(int quantity) {
        this.quantity = quantity;
    }

    /**
     * @return subtotal
     */
    public int getSubtotal() {
        return subtotal;
    }

    /**
     * @param subtotal
     *            セットする subtotal
     */
    public void setSubtotal(int subtotal) {
        this.subtotal = subtotal;
    }



    /**
     * コンストラクターです。
     *
     * @param id
     *            商品id
     * @param name
     *            商品名
     * @param price
     *            単価
     * @param quantity
     *            個数
     * @param subtotal
     *            小計
     */
    public Item(String id, String name, int price, int quantity, int subtotal) {
        this.id = id;
        this.name = name;
        this.price = price;
        this.quantity = quantity;
        this.subtotal = subtotal;
    }

}
// Copyright 2015 FUJITSU APPLICATIONS LIMITED


RecordManager.java

//商品一覧
/**
 * 商品データ全体を保持するクラス
 */
public final class RecordManager {

    /** 商品データ */
    private static List<Item> list = new ArrayList<>();
    private static List<Item> selectList = new ArrayList<>();
    private static Item item;

    static {
        list.add(new Item("A00101", "油性ボールペン", 60, 0, 0));
        list.add(new Item("A00201", "極細ボールペン", 120, 0, 0));
        list.add(new Item("A00301", "蛍光ペン6色セット", 420, 0, 0));
        list.add(new Item("A00401", "シャープペンシル", 100, 0, 0));

    }
    public static List<Item> selectItem(String name) {
        Item item = new Item("",name, 0, 0, 0);
        selectList.add(list.get(list.indexOf(item)));
        return selectList;
    }

    public static String[] makeNameList() {
        String[] idList = new String[list.size()];
        for (int i = 0; i < list.size(); i++) {
            idList[i] = (list.get(i)).getName();
        }
        return idList;
    }

    public static List<Item> getItemList() {
        return list;
    }

    public static void setItemList() {
        list.set(list.indexOf(item), item);
    }
}


init.jsp

<body>
    <form:form modelAttribute="salesForm" action="/sales/system">
        <div class="header">
            <span class="titleName">直太郎オンラインショップ</span>
            <div class="date"><%=LocalDate.now()%></div>
        </div>

        <div class="main">
            <div>
                商品:
                <form:select path="name">
                    <form:option value="${ idList}" items=" ${ nameList}"/>
                </form:select>
                <br/>
            </div>
            <div>
                <span class="itemQuantity">点数:</span>
                <form:input path="quantity" size="20" />
            </div>
        </div>

        <div class="footer">
            <input type="submit" name="add" value="明細追加" />
        </div>

        <div class="message">
            <c:out value="${message}" />
        </div>
    </form:form>
</body>


add.jsp

<body>
    <form:form modelAttribute="salesForm" action="/sales/system">
        <div class="header">
            <span class="titleName">直太郎オンラインショップ</span>
            <div class="date"><%=LocalDate.now()%></div>
        </div>
        <div class="main">
            <div>
                商品:
                <form:select name="id" path="name" items="${nameList}" />
                <br />
            </div>
            <div>
                <span class="itemQuantity">点数:</span>
                <form:input path="quantity" size="20" />
                <form:errors path="quantity" />
            </div>

            <div class="add">
                <div>
                    <input type="submit" name="add" value="明細追加" />
                </div>
            </div>
        </div>
    </form:form>
    <form:form modelAttribute="salesForm" action="/sales/system">
        <div class="main2">
            <div class="message">
                <c:out value="${message}" />
            </div>
            <div class="">
                <span class="details">売上明細</span>

                <table class="product">

                    <tr>
                        <th>削除</th>
                        <th>商品ID</th>
                        <th>商品名</th>
                        <th>単価</th>
                        <th>点数</th>
                        <th>小計</th>
                    </tr>
                    <c:forEach items="${allList}" var="allList" varStatus="status">
                        <tr>
                            <th><form:radiobutton path="name" label=""
                                    value="radiobtn" /></th>
                            <th>${allList.id}</th>
                            <th>${allList.name}</th>
                            <th>${allList.price}</th>
                            <th>${allList.quantity}</th>
                            <th>${allList.subtotal}</th>
                        </tr>
                    </c:forEach>
                </table>
            </div>

            <div class="total">
                合計:
                <fmt:formatNumber value="${total}" groupingUsed="true" /></div>
        </div>


        <div class="footer">
            <script type="text/javascript">
                function remove_row(target) {
                    var TR = target.parentNode.parentNode;
                    TR.parentNode.deleteRow(TR.rowIndex - 1);
                }
            </script>
            <input type="submit" name="remove" value="削除"
                onclick="remove_row(this)" /> <input type="submit" name="firm"
                value="確定" />
        </div>

    </form:form>

</body>
</html>

試したこと

<select><option/><select>でもプルダウン表示をしてみましたが値の変更に苦労すると思いやめました。

補足情報(FW/ツールのバージョンなど)

Eclipse Java EE IDE for Web Developers.
Version: Mars.2 Release (4.5.2)
ローカルホストTomcat8

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

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

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

    クリップを取り消します

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

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

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

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

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

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

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

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

    質問の評価を下げる

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

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

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

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

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

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

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

    詳細な説明はこちら

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

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

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

回答 1

checkベストアンサー

0

1、itaretorでプルダウンを表示する。

init.jspの商品プルダウンは

<form:select path="name">
  <form:option value="${idList}" items="${nameList}"/>
</form:select>

のようになっていますが、<form:option>にitemsはありません。
<c:forEach><form:option>で実装するか、
コントローラーの戻り値を変更して<form:options>で実装すると良いと思います。

2、取得するidがnullにならないようにする。

コントローラーのadd()メソッドに@ModelAttributeが足りない気がします。

public String add(@Valid @ModelAttribute("salesForm") SalesForm form, BindingResult result, Model model) {

なかなか見ごたえのあるコードなので、他にも問題があるかもしれません...

投稿

編集

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

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

  • ただいまの回答率 90.12%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

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