JSPの定数にアクセスする(スクリプトレットなし) [重複]
質問
この質問にはすでに答えがあります:
- ELで定数を参照するにはどうすればよいですか? 12 件の回答
さまざまなセッション属性の名前を定義するクラスがあります。
class Constants {
public static final String ATTR_CURRENT_USER = "current.user";
}
JSP 内でこれらの定数を使用して、次のような属性の存在をテストしたいと考えています。
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<%@ page import="com.example.Constants" %>
<c:if test="${sessionScope[Constants.ATTR_CURRENT_USER] eq null}">
<%-- Do somthing --%>
</c:if>
しかし、構文を正しく理解できないようです。また、上記のかなり長いテストを複数の場所で繰り返すのを避けるために、結果をローカル (ページスコープ) 変数に代入し、代わりにそれを参照したいと思います。これならできると信じています <c:set>
, 、しかし、やはり正しい構文を見つけるのに苦労しています。
アップデート: 以下の提案に加えて、次のことを試しました。
<c:set var="nullUser" scope="session"
value="${sessionScope[Constants.ATTR_CURRENT_USER] eq null}" />
それはうまくいきませんでした。そこで代わりに、定数のリテラル値を代入してみました。また、ページのコンテンツに定数を追加したので、ページがレンダリングされるときに定数の値を確認できるようになりました。
<c:set var="nullUser" scope="session"
value="${sessionScope['current.user'] eq null}" />
<%= "Constant value: " + WebHelper.ATTR_CURRENT_PARTNER %>
これは正常に動作し、期待値「current.user」がページに出力されました。2 つの値が同じように見えるのに、String リテラルの使用は機能するのに、定数への参照は機能しない理由を説明するのに迷っています。ヘルプ.....
解決
あなたの例では機能しません。 ATTR_CURRENT_USER
定数は、ゲッター関数によってプロパティが公開されることを期待する JSTL タグには表示されません。私は試していませんが、定数を公開する最もクリーンな方法は次のとおりです。 非標準タグライブラリ.
到着予定時刻:私が提供した古いリンクは機能しませんでした。新しいリンクはこの回答にあります。 JSP の Java 定数
発生している動作を明確にするためのコード スニペット:サンプルクラス:
package com.example;
public class Constants
{
// attribute, visible to the scriptlet
public static final String ATTR_CURRENT_USER = "current.user";
// getter function;
// name modified to make it clear, later on,
// that I am calling this function
// and not accessing the constant
public String getATTR_CURRENT_USER_FUNC()
{
return ATTR_CURRENT_USER;
}
}
使用例を示す JSP ページのスニペット:
<%-- Set up the current user --%>
<%
session.setAttribute("current.user", "Me");
%>
<%-- scriptlets --%>
<%@ page import="com.example.Constants" %>
<h1>Using scriptlets</h1>
<h3>Constants.ATTR_CURRENT_USER</h3>
<%=Constants.ATTR_CURRENT_USER%> <br />
<h3>Session[Constants.ATTR_CURRENT_USER]</h3>
<%=session.getAttribute(Constants.ATTR_CURRENT_USER)%>
<%-- JSTL --%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<jsp:useBean id="cons" class="com.example.Constants" scope="session"/>
<h1>Using JSTL</h1>
<h3>Constants.getATTR_CURRENT_USER_FUNC()</h3>
<c:out value="${cons.ATTR_CURRENT_USER_FUNC}"/>
<h3>Session[Constants.getATTR_CURRENT_USER_FUNC()]</h3>
<c:out value="${sessionScope[cons.ATTR_CURRENT_USER_FUNC]}"/>
<h3>Constants.ATTR_CURRENT_USER</h3>
<c:out value="${sessionScope[Constants.ATTR_CURRENT_USER]}"/>
<%--
Commented out, because otherwise will error:
The class 'com.example.Constants' does not have the property 'ATTR_CURRENT_USER'.
<h3>cons.ATTR_CURRENT_USER</h3>
<c:out value="${sessionScope[cons.ATTR_CURRENT_USER]}"/>
--%>
<hr />
これにより次の出力が出力されます。
スクリプトレットの使用
定数.ATTR_CURRENT_USER
現在の使用者
セッション[定数.ATTR_CURRENT_USER]
自分
JSTLの使用
Constants.getATTR_CURRENT_USER_FUNC()
現在の使用者
セッション[Constants.getATTR_CURRENT_USER_FUNC()]
自分
定数.ATTR_CURRENT_USER
他のヒント
このトピックはかなり古いですが、とにかく..:)
JSTL を通じて定数を利用できるようにするという素晴らしい解決策を見つけました。リフレクションを使用したマップを準備し、好きな場所に配置する必要があります。
マップには、Constants クラスで定義したすべての定数が常に含まれます。リスナーを使用してそれを ServletContext に配置し、次のような JSTL の定数を楽しむことができます。
${CONSTANTS["CONSTANT_NAME_IN_JAVA_CLASS_AS_A_STRING"]}
ここの定数は、マップをコンテキストに入れるときに使用したキーです :-)
以下は、定数フィールドのマップを構築するコードの一部です。
Map<String, Object> map = new HashMap<String, Object>();
Class c = Constants.class;
Field[] fields = c.getDeclaredFields();
for (Field field : fields) {
int modifier = field.getModifiers();
if (Modifier.isPublic(modifier) && Modifier.isStatic(modifier) && Modifier.isFinal(modifier)) {
try {
map.put(field.getName(), field.get(null));//Obj param of get method is ignored for static fields
} catch (IllegalAccessException e) { /* ignorable due to modifiers check */ }
}
}
以下のように、c:set を使用して Constants.ATTR_CURRENT_USER を変数として定義できます。
<c:set var="ATTR_CURRENT_USER" value="<%=Constants.ATTR_CURRENT_USER%>" />
<c:if test="${sessionScope[ATTR_CURRENT_USER] eq null}">
<%-- Do somthing --%>
</c:if>
静的プロパティには EL ではアクセスできません。私が使用する回避策は、それ自体を静的な値に割り当てる非静的変数を作成することです。
public final static String MANAGER_ROLE = 'manager';
public String manager_role = MANAGER_ROLE;
lombok を使用してゲッターとセッターを生成するので、これで十分です。EL は次のようになります。
${bean.manager_role}
完全なコードは次のとおりです http://www.ninthavenue.com.au/java-static-constants-in-jsp-and-jsf-el
議論に遅れましたが、私のアプローチは少し異なります。カスタム タグ ハンドラーを使用して、JSP ページに必要な定数値 (数値または文字列) を与えます。私がやった方法は次のとおりです。
すべての定数を保持するクラスがあるとします。
public class AppJspConstants implements Serializable {
public static final int MAXLENGTH_SIGNON_ID = 100;
public static final int MAXLENGTH_PASSWORD = 100;
public static final int MAXLENGTH_FULLNAME = 30;
public static final int MAXLENGTH_PHONENUMBER = 30;
public static final int MAXLENGTH_EXTENSION = 10;
public static final int MAXLENGTH_EMAIL = 235;
}
次の非常に単純なカスタム タグもあります。
public class JspFieldAttributes extends SimpleTagSupport {
public void doTag() throws JspException, IOException {
getJspContext().setAttribute("maxlength_signon_id", AppJspConstants.MAXLENGTH_SIGNON_ID);
getJspContext().setAttribute("maxlength_password", AppJspConstants.MAXLENGTH_PASSWORD);
getJspContext().setAttribute("maxlength_fullname", AppJspConstants.MAXLENGTH_FULLNAME);
getJspContext().setAttribute("maxlength_phonenumber", AppJspConstants.MAXLENGTH_PHONENUMBER);
getJspContext().setAttribute("maxlength_extension", AppJspConstants.MAXLENGTH_EXTENSION);
getJspContext().setAttribute("maxlength_email", AppJspConstants.MAXLENGTH_EMAIL);
getJspBody().invoke(null);
}
}
次に、StringHelper.tld を作成します。中にはこれがあります:
<tag>
<name>fieldAttributes</name>
<tag-class>package.path.JspFieldAttributes</tag-class>
<body-content>scriptless</body-content>
<info>This tag provide HTML field attributes that CCS is unable to do.</info>
</tag>
JSP では、通常の方法で StringHelper.tld をインクルードします。
<%@ taglib uri="/WEB-INF/tags/StringHelper.tld" prefix="stringHelper" %>
最後に、タグを使用し、EL を使用して必要な値を適用します。
<stringHelper:fieldAttributes>
[snip]
<form:input path="emailAddress" cssClass="formeffect" cssErrorClass="formEffect error" maxlength="**${maxlength_email}**"/>
<form:errors path="emailAddress" cssClass="error" element="span"/>
[snip]
</stringHelper:fieldAttributes>
定数を解決するカスタム EL リゾルバーを EL リゾルバー チェーンにプラグインします。EL リゾルバーは Java クラスを拡張したものです javax.el.ELResolver クラス。
ありがとう、
まず、構文に余分な「]」があり、それがエラーの原因でした。
これを修正して変数を設定するには、次のようにします。
<c:set var="nullUser"
scope="session"
value="${sessionScope[Constants.ATTR_CURRENT_USER] eq null}" />
<c:if test="${nullUser}">
<h2>First Test</h2>
</c:if>
<c:if test="${nullUser}">
<h2>Another Test</h2>
</c:if>