28

さまざまなセッション属性の名前を定義するクラスがあります。

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」をページに出力しました。String リテラルの使用が機能する理由を説明するのに途方に暮れていますが、2 つが同じ値を持っているように見える場合、定数への参照は機能しません。ヘルプ.....

4

7 に答える 7

13

ATTR_CURRENT_USERプロパティが getter 関数によって公開されることを期待する JSTL タグには定数が表示されないため、この例では機能しません。試したことはありませんが、定数を公開する最もクリーンな方法は、標準外のタグ ライブラリのようです。

ETA: 私が提供した古いリンクが機能しませんでした。この回答で新しいリンクを見つけることができます: 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

現在の使用者

セッション[Constants.ATTR_CURRENT_USER]

自分


JSTL の使用

Constants.getATTR_CURRENT_USER_FUNC()

現在の使用者

セッション[Constants.getATTR_CURRENT_USER_FUNC()]

自分

定数.ATTR_CURRENT_USER



于 2008-09-24T02:58:00.967 に答える
5

次のように、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> 
于 2012-07-15T03:19:04.000 に答える
4

トピックはかなり古いですが、とにかく.. :)

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 */ }
   }
}
于 2011-08-19T09:32:04.537 に答える
1

議論に遅れましたが、私のアプローチは少し異なります。カスタム タグ ハンドラーを使用して、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}**"/>&nbsp;
            <form:errors path="emailAddress" cssClass="error" element="span"/>
[snip]
        </stringHelper:fieldAttributes>
于 2013-08-28T20:34:26.000 に答える
1

EL では静的プロパティにアクセスできません。私が使用する回避策は、静的な値に自分自身を割り当てる非静的変数を作成することです。

public final static String MANAGER_ROLE = 'manager';
public String manager_role = MANAGER_ROLE;

私は lombok を使用してゲッターとセッターを生成しているので、それで十分です。EL は次のようになります。

${bean.manager_role}

https://rogerkeays.com/access-java-static-methods-and-constants-from-elの完全なコード

于 2012-07-16T20:53:47.687 に答える
1

カスタム EL リゾルバーを EL リゾルバー チェーンにプラグインすると、定数が解決されます。EL Resolver はjavax.el.E​​LResolverクラスを拡張した Java クラスです。

ありがとう、

于 2011-05-19T09:15:09.397 に答える
-2

まず、構文に余分な「]」があり、エラーが発生していました。

これを修正して変数を設定するには、次のようにします。

<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>
于 2008-09-23T18:33:41.430 に答える