🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
foreach

foreachは、List・Collection・Arrayといったデータ構造の各要素に対して繰り返し処理を実行するために扱われる、制御構造の構文です。

if

if文とは様々なプログラミング言語で使用される制御構文の一種であり、条件によって処理の流れを制御します。

JSP

JSP(Java Server Pages)とは、ウェブアプリケーションの表示レイヤーに使われるサーバーサイドの技術のことです。

Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

servlet

Servletとは、Webページの動的な生成やデータ処理などをサーバ上で実行するために、Javaで作成されたプログラムです。 ショッピングサイトやオンラインバンキングといった、動的なウェブサイトの構築に用いられています。

Q&A

解決済

1回答

4321閲覧

jsp セレクトボックスのC:ifについて

tyai

総合スコア5

foreach

foreachは、List・Collection・Arrayといったデータ構造の各要素に対して繰り返し処理を実行するために扱われる、制御構造の構文です。

if

if文とは様々なプログラミング言語で使用される制御構文の一種であり、条件によって処理の流れを制御します。

JSP

JSP(Java Server Pages)とは、ウェブアプリケーションの表示レイヤーに使われるサーバーサイドの技術のことです。

Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

servlet

Servletとは、Webページの動的な生成やデータ処理などをサーバ上で実行するために、Javaで作成されたプログラムです。 ショッピングサイトやオンラインバンキングといった、動的なウェブサイトの構築に用いられています。

0グッド

2クリップ

投稿2020/12/02 14:01

編集2020/12/03 01:50

前提・実現したいこと

jspにて、セレクトボックスにenumを使用してプルダウンを入れたいです。
最終的にはプルダウンで選択されたものをenumでコードから名前を取得してDBに格納します。

発生している問題・エラーメッセージ

HTTPステータス 500 – Internal Server Errorがでます。

enum側ではintを指定していますが、どこでString型に変換されているのでしょうか?
jsp側でparseでくくってみましたがint型に変換できませんでした。

メッセージ [/WEB-INF/jsp/ProductInfo.jsp] の処理中に行番号 [23] で例外が発生しました。 説明 サーバーは予期しない条件に遭遇しました。それはリクエストの実行を妨げます。 例外 org.apache.jasper.JasperException: [/WEB-INF/jsp/ProductInfo.jsp] の処理中に行番号 [23] で例外が発生しました。 20: <select name="genre"> 21: <c:forEach var="genre" items="${ProductGenre}"> 22: <option value="${genre.genreCode}" 23: <c:if test="${ProductGenre.genreCode == genre.genreCode}">selected</c:if>> 24: ${genre.genreName}</option> 25: </c:forEach> 26: </select> 根本原因 java.lang.NumberFormatException: For input string: "genreCode" java.lang.NumberFormatException.forInputString(NumberFormatException.java:65)

該当のソースコード

enum

1public enum ProductGenre { 2 /** 「商品ジャンル」指定なし。コード値は0です。 */ 3 UNSPECIFIED(0, "指定なし"), 4 /** 「商品ジャンル」時計。コード値は1です。 */ 5 CLOCK(1, "時計"), 6 /** 「商品ジャンル」電子機器。コード値は2です。 */ 7 ELECTRONICS(2, "電子機器"), 8 /** 「商品ジャンル」携帯。コード値は3です。 */ 9 MOBILE_PHONE(3, "携帯"); 10 11 /** 商品ジャンルコード */ 12 private int genreCode; 13 /** 商品ジャンル名 */ 14 private String genreName; 15 16 /** 17 * 商品ジャンルコードと商品ジャンル名を基に商品ジャンルを生成します。 18 * @param genreCode 商品ジャンルコード 19 * @param genreName 商品ジャンル名 20 */ 21 private ProductGenre(int genreCode, String genreName) { 22 this.genreCode = genreCode; 23 this.genreName = genreName; 24 } 25 26 /** 27 * 商品ジャンルコードを取得します。 28 * @return 商品ジャンルコード 29 */ 30 public int getGenreCode() { 31 return this.genreCode; 32 } 33 34 /** 35 * 商品ジャンル名を取得します。 36 * @return 商品ジャンル名 37 */ 38 public String getGenreName() { 39 return this.genreName; 40 } 41 42 public static String getNameByCode(int genreCode) { 43 for (ProductGenre pg : ProductGenre.values()) { 44 if (pg.getGenreCode() == genreCode) { 45 return pg.getGenreName(); 46 } 47 } 48 return null; 49 } 50}

Servlet

1 protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { 2 response.setCharacterEncoding("UTF-8"); 3 response.setContentType("text/html; charset=UTF-8"); 4 5 request.setAttribute("ProductGenre", ProductGenre.values()); 6 7 RequestDispatcher dispatch = request.getRequestDispatcher("WEB-INF/jsp/ProductInfo.jsp"); 8 dispatch.forward(request, response); 9 }

jsp

1 <div class="genre"> 2 ジャンル<br> 3 <select name="genre"> 4 <c:forEach var="genre" items="${ProductGenre}"> 5 <option value="${genre.genreCode}" 6 <c:if test="${ProductGenre.genreCode == genre.genreCode}">selected</c:if>> 7 ${genre.genreName}</option> 8 </c:forEach> 9 </select> 10 </div>

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

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

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

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

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

moromon

2020/12/03 00:44

c:if文を取ると、文字は表示されますか?
tyai

2020/12/03 01:49

申し訳ありません。できなかったので、itemsを見直したら文字が表示されるようになりました。 ですがif文は使いたいため、質問を編集させていただきました。 よろしくお願いします。
guest

回答1

0

ベストアンサー

一旦、回答しますが。。

<c:if test="${ProductGenre.genreCode == genre.genreCode}">selected</c:if>>

このif文の左辺、ProductGenre.genreCodeは何が入っているのでしょうか。

selectedしているということは、初期表示であれば、初期に選択されていてほしい値。
そうでなければ、画面で選択していた値です。
その情報は、どこで編集してますか?

ProductGenre.genreCodeの値になにが入っているのか、まず確認すべきでしょう。

投稿2020/12/03 04:31

Takeshi_Ueda

総合スコア183

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

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

tyai

2020/12/04 08:52

肝心なその情報を定義できておりませんでした。 サーブレットで定義すればよかったんですね。ありがとうございました。
Takeshi_Ueda

2020/12/05 23:44

その通りです。(サーブレットで定義) 「値」の流れを意識しておくのが重要です。 あと、変数名もenumの変数なのか、画面の値の変数なのか工夫しておくと このような見落としは少なくなります。 ソースの視認性も上がりますし、このように質問サイトに載せる際にも 回答が付きやすいと思います。 今回、回答に時間かかったのは、そこが不十分なので読み解くのに手間がかかって しまいました。(たぶん、ご自身もそのせいで見落としされたんだと思います) 後で、見直す時にも有益ですので、ぜひ工夫してみてください。 頑張ってくださいね。
tyai

2020/12/08 06:38

なるほど…勉強になります!がんばります!ありがとうございましたm(__)m
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.36%

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

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

質問する

関連した質問