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

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

新規登録して質問してみよう
ただいま回答率
85.49%
JSP

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

Java

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

Q&A

解決済

1回答

14769閲覧

(Java)jspでEL式(JSTL)を使用してEnumや定数クラスを呼び出す方法

takuya_am

総合スコア16

JSP

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

Java

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

1グッド

2クリップ

投稿2018/10/04 15:14

前提・実現したいこと

Javaを学習し始めてまだ半年ぐらいの初心者です。

1.jspでEL式(JSTL)を使用して列挙型や定数クラスのフィールドを参照したい。
※下記コードのようにスクリプトレットを使用すると動作はしますが、スクリプトレットを使用しない方法がわかりません。
2・下記コードで正常に動作するが、列挙型をjspで参照する方法はこれが最適解なのか。

EL式では可能かどうかさえ分からない状況 + 列挙型の使用方法についても自信の持てない状態です。
どなたかご指摘頂けると幸いです。。

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

エラーメッセージ

該当のソースコード

JAVA

1public class Constant { 2 3 /* アドレス */ 4 public static final String LOGIN_SERVLET = "./login"; //ログインサーブレット

jsp

1<form action=<%=Constants.LOGIN_SERVLET %> method="post"> 2 <input type="text" name="loginId">ログインID 3 <input type="password" name="password">パスワード 4 <input type="submit" value="送信"> 5</form>

JAVA

1session.setAttribute("gender",Gender.values());

JAVA

1public enum Gender { 2 3 MAN("男","0"), //男 4 FEMALE("女","1"); //女 5 6 private String label; //コード名 7 private String num; //コード値 8 9 private Gender(String label,String num) { 10 this.label = label; 11 this.num = num; 12 } 13 14 public String getLabel() { 15 return this.label; 16 } 17 18 public String getNum() { 19 return this.num; 20 } 21 public static String getLabelByNum(String num) { 22 for (Gender g : Gender.values()) { 23 if (g.getNum().equals(num)) { 24 return g.getLabel(); 25 } 26 } 27 return null; 28 } 29}

jsp

1<c:forEach var="gender" items="${gender}"> 2 <label for=<c:out value="${gender.name()}"/> 3 <input type="radio" 4 name="sex" id=<c:out value="${gender.name()}"/> value=<c:out value="${gender.getNum()}"/>> 5 <c:out value="${gender.getLabel()}" /> 6 </label> 7</c:forEach>

試したこと

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

ここにより詳細な情報を記載してください。

A-pZ👍を押しています

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

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

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

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

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

guest

回答1

0

ベストアンサー

EL式では定数クラスや列挙型には直接参照できない仕様になっています(意外ではありますが、EL式はサーブレットの属性から値を取得することに特化した機能だけなので、そうでしかありません。)

なので、JSPから定数参照するときは、スクリプトレットの宣言部で定数値をリクエスト属性へバインドするか、
もしくはもっと汎用的にするならば、サーブレットコンテキストにあらかじめ定数値を格納するリスナーを用意しておいて、サーブレットコンテキストに格納しておけばELからでも参照できます。

java

1import javax.servlet.ServletContext; 2import javax.servlet.ServletContextEvent; 3import javax.servlet.ServletContextListener; 4import javax.servlet.annotation.WebListener; 5 6import sample.Constant; 7 8@WebListener 9public class ConstanceBindContextListener implements ServletContextListener { 10 @Override 11 public void contextInitialized(ServletContextEvent sce) { 12 ServletContext context = sce.getServletContext(); 13 context.setAttribute("ACTION", Constant.ACTION); 14 } 15}

さらに汎用的にするならば、リフレクションを使って取得先定数クラスを取得し、フィールドにアクセサ(getメソッド)があれば参照できるような機能を作ることも可能です。

投稿2018/10/05 16:31

A-pZ

総合スコア12011

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

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

takuya_am

2018/10/06 14:17

ありがとうございます。 私のような初心者だと、まず出来るか出来ないかがわからず、そこに時間を費やす事が多くあります。 その中で、出来ないとはっきり教えて頂ける事は曖昧な言葉よりもとても理解に繋がります。 また参照する手段の例として挙げてもらったものが、自身が調べて確証の持たなかった答えとほぼ一致していましたので、学習の調べ方にも自信が持てました。 ベストアンサーとさせて頂きます。ありがとうございました。
A-pZ

2018/10/06 16:09

d(・ω・
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.49%

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

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

質問する

関連した質問