Frage

    

Diese Frage bereits eine Antwort hier:

    
            
  •              Wie Konstanten in EL verweisen?                                      12 Antworten                          
  •     
    

Ich habe eine Klasse, die die Namen verschiedenen Sitzungsattribute definiert, z.

class Constants {
    public static final String ATTR_CURRENT_USER = "current.user";
}

Ich mag diese Konstanten innerhalb einer JSP verwenden, um das Vorhandensein dieser Attribute zu testen, so etwas wie:

<%@ 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>

Aber ich kann nicht scheinen, die sytax korrekt zu erhalten. Auch zu vermeiden, dass die recht langen Tests oben an mehreren Stellen zu wiederholen, würde Ich mag das Ergebnis einer lokalen (page-scoped) Variablen zugewiesen und beziehen sich auf, dass statt. Ich glaube, ich kann dies tun mit <c:set>, aber auch hier ist ich kämpfen, um die korrekte Syntax zu finden.

UPDATE: Im Anschluss an den Vorschlag unten, habe ich versucht:

<c:set var="nullUser" scope="session"
value="${sessionScope[Constants.ATTR_CURRENT_USER] eq null}" />

, die nicht funktionierten. Anstatt also habe ich versucht, den wörtlichen Wert der Konstante ersetzt wird. Ich habe auch die Konstante zum Inhalt der Seite, so kann ich die Konstante des Wert überprüfen, wenn die Seite wird gerendert wird

<c:set var="nullUser" scope="session"
value="${sessionScope['current.user'] eq null}" />
<%= "Constant value: " + WebHelper.ATTR_CURRENT_PARTNER %>

Das hat gut funktioniert und es gedruckt, um den erwarteten Wert „current.user“ auf der Seite. Ich bin ratlos, zu erklären, warum die Stringliteral Arbeiten verwendet wird, sondern ein Verweis auf die Konstante nicht der Fall, wenn die beiden den gleichen Wert zu haben scheinen. Hilfe .....

War es hilfreich?

Lösung

Es ist nicht in Ihrem Beispiel zu arbeiten, weil der ATTR_CURRENT_USER Konstante nicht sichtbar für die JSTL-Tags, die von Getter Funktionen ausgesetzt Eigenschaften zu erwarten. Ich habe es nicht ausprobiert, aber der sauberste Weg, um Ihre Konstanten zu belichten erscheint die unstandard Tagbibliothek .

ETA: Alter Link Ich habe nicht funktioniert. Neue Links können in dieser Antwort zu finden: Java Konstanten in JSP

Code-Schnipsel, das Verhalten zu klären Sie sehen: Sample-Klasse:

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;
    }


}    

Snippet von der JSP-Seite, zeigt Probe Nutzung:

<%-- 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 />

Diese Ausgänge:

Mit Scriptlets

Constants.ATTR_CURRENT_USER

current.user

Session [Constants.ATTR_CURRENT_USER]

Me


Mit JSTL

Constants.getATTR_CURRENT_USER_FUNC ()

current.user

Session [Constants.getATTR_CURRENT_USER_FUNC ()]

Me

Constants.ATTR_CURRENT_USER



Andere Tipps

ist das Thema ziemlich alt, aber trotzdem ..:)

fand ich schöne Lösung Konstanten durch JSTL zur Verfügung zu haben. Sie sollten eine Karte mit Reflektion vorbereiten und setzen wo immer Sie wollen.

Die Karte enthält immer alle Konstanten, die Sie in Constants Klasse definieren. Sie können es in ServletContext setzen Zuhörer mit und genießen Sie Konstanten in JSTL mögen:

${CONSTANTS["CONSTANT_NAME_IN_JAVA_CLASS_AS_A_STRING"]}


KONSTANTEN hier ist ein Schlüssel, den Sie Karte in Zusammenhang verwendet setzen :-)


Das folgende ist ein Stück von meinem Code, um eine Karte der konstanten Felder Aufbau:

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 */ }
   }
}

Sie können Constants.ATTR_CURRENT_USER als Variable mit c definieren: set, wie unten:

<c:set var="ATTR_CURRENT_USER" value="<%=Constants.ATTR_CURRENT_USER%>" />
<c:if test="${sessionScope[ATTR_CURRENT_USER] eq null}">     
    <%-- Do somthing --%> 
</c:if> 

Statische Objekte sind in EL nicht zugänglich. Die Abhilfe, die ich verwenden, ist eine nicht-statische Variable zu erzeugen, die sich auf den statischen Wert zuweist.

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

Ich verwende lombok den Getter und Setter zu erzeugen, so dass es ziemlich gut ist. Ihre EL sieht wie folgt aus:

${bean.manager_role}

Voll Code unter http: // www .ninthavenue.com.au / java-static-Konstanten-in-jsp-and-JSF-el

Ich bin spät, um die Diskussion, aber mein Ansatz ist ein wenig anders. Ich benutze einen Handler benutzerdefinierten Tages JSP-Seiten, die konstanten Werte (numerisch oder String) es muss zu geben. Hier ist, wie ich es getan hätte:

Vermeintliche Ich habe eine Klasse, die alle Konstanten hält:

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;
}

Ich habe auch diesen extrem einfachen benutzerdefinierten Tag:

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);
    }
}

Dann habe ich eine StringHelper.tld. Im Innern, ich habe dies:

<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>

Auf der JSP, ich schließe die StringHelper.tld die normale Art und Weise:

<%@ taglib uri="/WEB-INF/tags/StringHelper.tld" prefix="stringHelper" %>

Schließlich verwende ich den Tag und anwenden, um die benötigten Werte mit 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>

Plugin einen benutzerdefinierten EL Resolver an die EL-Resolver-Kette, die die Konstanten lösen wird. Ein EL-Resolver ist Java-Klasse erweitern javax.el.ELResolver Klasse.

Danke,

Zuerst Ihre Syntax hatte eine extra „]“, die einen Fehler verursacht wurden.

Um das zu beheben, und eine Variable setzen Sie dies tun würden:

<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>
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top