EL 3.0 oder neuer
Wenn Sie bereits mit Java EE 7 / EL 3.0 arbeiten, @page import
importiert das auch Klassenkonstanten im EL-Bereich.
<%@ page import="com.example.YourConstants" %>
Dies wird unter der Decke über importiert ImportHandler#importClass()
und ist verfügbar als ${YourConstants.FOO}
.
Beachten Sie, dass alle java.lang.*
Klassen sind bereits implizit importiert und verfügbar wie so ${Boolean.TRUE}
und ${Integer.MAX_VALUE}
. Dies erfordert nur einen neueren Java EE 7-Containerserver, da frühere Versionen Fehler aufwiesen. ZB GlassFish 4.0 und Tomcat 8.0.0-1x schlagen fehl, aber GlassFish 4.1+ und Tomcat 8.0.2x + funktionieren. Und Sie müssen unbedingt sicherstellen, dass Ihr web.xml
Konto der neuesten vom Server unterstützten Servlet-Version entspricht. Daher web.xml
funktioniert mit einem Servlet 2.5 oder älter, das als konform deklariert ist, keine der Servlet 3.0+ Funktionen.
Beachten Sie auch, dass diese Funktion nur in JSP und nicht in Facelets verfügbar ist. Im Fall von JSF + Facelets verwenden Sie OmniFaces am<o:importConstants>
besten wie folgt :
<o:importConstants type="com.example.YourConstants" />
Oder fügen Sie einen EL-Kontext-Listener hinzu, der ImportHandler#importClass()
wie folgt aufruft :
@ManagedBean(eager=true)
@ApplicationScoped
public class Config {
@PostConstruct
public void init() {
FacesContext.getCurrentInstance().getApplication().addELContextListener(new ELContextListener() {
@Override
public void contextCreated(ELContextEvent event) {
event.getELContext().getImportHandler().importClass("com.example.YourConstants");
}
});
}
}
EL 2.2 oder älter
Dies ist in EL 2.2 und älter nicht möglich. Es gibt verschiedene Alternativen:
Fügen Sie sie in ein Feld ein, Map<String, Object>
das Sie in den Anwendungsbereich aufgenommen haben. In EL sind Kartenwerte auf die übliche javabäische Weise über ${map.key}
oder zugänglich ${map['key.with.dots']}
.
Verwendung <un:useConstants>
der Unstandard taglib (maven2 repo hier ):
<%@ taglib uri="http://jakarta.apache.org/taglibs/unstandard-1.0" prefix="un" %>
<un:useConstants className="com.example.YourConstants" var="constants" />
Auf diese Weise sind sie auf die übliche javabäische Weise zugänglich ${constants.FOO}
.
Verwenden Sie Javaranch's CCC, <ccc:constantsMap>
wie irgendwo am Ende dieses Artikels beschrieben .
<%@ taglib uri="http://bibeault.org/tld/ccc" prefix="ccc" %>
<ccc:constantsMap className="com.example.YourConstants" var="constants" />
Auf diese Weise sind sie auch auf die übliche javabäische Weise zugänglich ${constants.FOO}
.
Wenn Sie JSF2 verwenden, dann könnten Sie <o:importConstants>
von OmniFaces .
<html ... xmlns:o="http://omnifaces.org/ui">
<o:importConstants type="com.example.YourConstants" />
Auf diese Weise sind sie auch auf die übliche javabäische Weise zugänglich #{YourConstants.FOO}
.
Erstellen Sie eine Wrapper-Klasse, die sie über Getter-Methoden im Javabean-Stil zurückgibt.
Erstellen Sie einen benutzerdefinierten EL-Resolver, der zuerst das Vorhandensein einer Konstante überprüft und bei Abwesenheit an den Standard-Resolver delegiert. Andernfalls wird stattdessen der Konstantenwert zurückgegeben.
unstandard-taglib
Projekt noch? Gibt es eine Alternative?Das Folgende gilt nicht für EL im Allgemeinen, sondern nur für SpEL (Spring EL) (getestet mit 3.2.2.RELEASE unter Tomcat 7). Ich denke, es ist erwähnenswert, wenn jemand nach JSP und EL sucht (aber JSP mit Spring verwendet).
quelle
Normalerweise platzieren Sie diese Art von Konstanten in einem
Configuration
Objekt (das Getter und Setter enthält) im Servlet-Kontext und greifen mit darauf zu${applicationScope.config.url}
quelle
url
einer String-Eigenschaft, benennen Sie sieConfiguration
, instanziieren Sie sie und setzenurl
Sie sie auf das , was Sie möchten. Danach setzen Sie dasConfiguration
Objekt inServletContext
. Mach so etwas wie ,servletContext.setAttribute("config", config)
. Und los geht's.ServletContext
? Können Sie die Konstanten nur ordentlicher klassifizieren? zB:applicationScope.config.url
vsapplicationScope.url
.Das kannst du nicht. Es folgt der Java Bean-Konvention. Sie müssen also einen Getter dafür haben.
quelle
Auf statische Eigenschaften kann in EL nicht zugegriffen werden. Die Problemumgehung, die ich verwende, besteht darin, eine nicht statische Variable zu erstellen, die sich dem statischen Wert zuweist.
Ich benutze Lombok, um den Getter und Setter zu generieren, also ist es ziemlich gut. Ihre EL sieht so aus:
Vollständiger Code unter http://www.ninthavenue.com.au/java-static-constants-in-jsp-and-jsf-el
quelle
Ich implementierte wie:
- -
Im nächsten Schritt fügen Sie die Instanz dieser Klasse in servlerContext ein
Listener zu web.xml hinzufügen
Zugriff in jsp
quelle
Ich definiere gleich zu Beginn eine Konstante in meinem JSP:
Ich füge die Core-Taglib in meine JSP ein:
Dann stelle ich EL die Konstante mit folgender Anweisung zur Verfügung:
Jetzt kann ich es später verwenden. Hier ein Beispiel, in dem der Wert nur als HTML-Kommentar für Debugging-Zwecke geschrieben wird:
Mit Ihrer konstanten Klasse können Sie einfach Ihre Klasse importieren und die Konstanten lokalen Variablen zuweisen. Ich weiß, dass meine Antwort eine Art schneller Hack ist, aber die Frage taucht auch auf, wenn man Konstanten direkt in der JSP definieren möchte.
quelle
<%=URI%>
: P<%=URI%>
nicht funktionierte, aber diese Technik tat es.Ja, du kannst. Sie benötigen ein benutzerdefiniertes Tag (wenn Sie es nicht woanders finden können). Ich habe das getan:
und das Tag heißt:
Alle öffentlichen statischen endgültigen Variablen werden in eine Map eingefügt, die durch ihren Java-Namen indiziert ist
dann wird das Tag dies in eine Ganzzahl einschließen und Sie können es in einer JSP referenzieren:
und du musst keine Getter schreiben!
quelle
Sie können. Versuchen Sie es auf folgende Weise
Getestet auf TomCat 7 und Java6
quelle
Selbst wenn ich weiß, dass es etwas spät ist und wenn ich weiß, dass dies ein kleiner Hack ist, habe ich die folgende Lösung verwendet, um das gewünschte Ergebnis zu erzielen. Wenn Sie ein Liebhaber von Java-Namenskonventionen sind, ist mein Rat, hier nicht mehr zu lesen ...
Eine solche Klasse haben, Konstanten definieren, nach leeren Klassen gruppiert, um eine Art Hierarchie zu erstellen:
kann aus Java heraus verwendet werden
PERMISSION.PAGE.SEE
, um den Wert abzurufen1L
Um eine ähnliche Zugriffsmöglichkeit innerhalb von EL-Expressions zu erreichen, habe ich Folgendes getan: (Wenn es einen Codierungsgott gibt - er könnte mir hoffentlich vergeben: D)
Schließlich wird der EL-Ausdruck für den Zugriff auf dasselbe
Long
:#{PERMISSION.PAGE.SEE}
- Gleichheit für Java und EL-Access. Ich weiß, dass dies keine Konvention ist, aber es funktioniert einwandfrei.quelle
@Bozho lieferte bereits eine gute Antwort
Ich bin jedoch der Meinung, dass ein Beispiel benötigt wird, um ein bisschen mehr Klarheit zu schaffen und jemandem Zeit zu sparen
quelle
Es gibt eine Problemumgehung, die nicht genau Ihren Wünschen entspricht, mit der Sie jedoch fast genauso aktiv werden können, indem Sie Scriptlets auf sehr minimale Weise berühren. Sie können das Scriptlet verwenden, um einen Wert in eine JSTL-Variable einzufügen und später auf der Seite sauberen JSTL-Code zu verwenden.
quelle