Comment référencer une constante avec EL sur une page JSP?
J'ai une interface Addresses
avec une constante nommée URL
. Je sais que je peux le référencer avec un scriplet en allant:, <%=Addresses.URL%>
mais comment faire cela en utilisant EL?
Si vous êtes déjà sur Java EE 7 / EL 3.0, alors @page import
importera également les constantes de classe dans la portée EL.
<%@ page import="com.example.YourConstants" %>
Ce sera sous les couvertures importé via ImportHandler#importClass()
et disponible en tant que ${YourConstants.FOO}
.
Notez que toutes les java.lang.*
classes sont déjà implicitement importées et disponibles comme tel ${Boolean.TRUE}
et tel ${Integer.MAX_VALUE}
. Cela ne nécessite qu'un serveur de conteneur Java EE 7 plus récent car les premières versions présentaient des bogues. Par exemple, GlassFish 4.0 et Tomcat 8.0.0-1x échouent, mais GlassFish 4.1+ et Tomcat 8.0.2x + fonctionnent. Et vous devez absolument vous assurer que votre web.xml
est déclaré conforme à la dernière version de servlet prise en charge par le serveur. Ainsi, avec un web.xml
qui est déclaré conforme Servlet 2.5 ou plus ancien, aucune des fonctionnalités Servlet 3.0+ ne fonctionnera.
Notez également que cette fonctionnalité n'est disponible que dans JSP et non dans Facelets. Dans le cas de JSF + Facelets, votre meilleur pari est d'utiliser OmniFaces<o:importConstants>
comme ci-dessous:
<o:importConstants type="com.example.YourConstants" />
Ou en ajoutant un écouteur de contexte EL qui appelle ImportHandler#importClass()
comme ci-dessous:
@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");
}
});
}
}
Cela n'est pas possible dans EL 2.2 et les versions antérieures. Il existe plusieurs alternatives:
Mettez-les dans un Map<String, Object>
que vous mettez dans la portée de l'application. En EL, les valeurs de la carte sont accessibles de la manière javanaise habituelle par ${map.key}
ou ${map['key.with.dots']}
.
Utilisation <un:useConstants>
du Unstandard taglib (maven2 repo ici ):
<%@ taglib uri="http://jakarta.apache.org/taglibs/unstandard-1.0" prefix="un" %>
<un:useConstants className="com.example.YourConstants" var="constants" />
De cette façon, ils sont accessibles de la manière javanaise habituelle ${constants.FOO}
.
Utilisez le CCC de Javaranch <ccc:constantsMap>
comme décrit quelque part au bas de cet article .
<%@ taglib uri="http://bibeault.org/tld/ccc" prefix="ccc" %>
<ccc:constantsMap className="com.example.YourConstants" var="constants" />
De cette façon, ils sont également accessibles de la manière javanaise habituelle ${constants.FOO}
.
Si vous utilisez JSF2, vous pouvez utiliser <o:importConstants>
des OmniFaces .
<html ... xmlns:o="http://omnifaces.org/ui">
<o:importConstants type="com.example.YourConstants" />
De cette façon, ils sont également accessibles de la manière javanaise habituelle #{YourConstants.FOO}
.
Créez une classe wrapper qui les retourne via des méthodes getter de style javanais.
Créez un résolveur EL personnalisé qui scanne d'abord la présence d'une constante et s'il est absent, déléguez ensuite au résolveur par défaut, sinon renvoie la valeur de la constante à la place.
unstandard-taglib
projet jakarta est-il toujours en vie? y a-t-il une alternative?Ce qui suit ne s'applique pas à EL en général, mais plutôt à SpEL (Spring EL) uniquement (testé avec 3.2.2.RELEASE sur Tomcat 7). Je pense qu'il vaut la peine de le mentionner ici au cas où quelqu'un chercherait JSP et EL (mais utilise JSP avec Spring).
la source
Vous placez généralement ces types de constantes dans un
Configuration
objet (qui a des getters et des setters) dans le contexte de servlet, et y accédez avec${applicationScope.config.url}
la source
url
comme propriété String, nommez-laConfiguration
, instanciez-la et définissez leurl
sur ce que vous voulez. Après cela, définissez cetConfiguration
objetServletContext
. Faites quelque chose comme,servletContext.setAttribute("config", config)
. Et voilà.ServletContext
? Est-ce simplement que vous pouvez classer les constantes plus précisément? par exemple:applicationScope.config.url
vsapplicationScope.url
.Vous ne pouvez pas. Il suit la convention Java Bean. Vous devez donc avoir un getter pour cela.
la source
Les propriétés statiques ne sont pas accessibles dans EL. La solution de contournement que j'utilise est de créer une variable non statique qui s'attribue à la valeur statique.
J'utilise lombok pour générer le getter et le setter donc c'est plutôt bien ça. Votre EL ressemble à ceci:
Code complet sur http://www.ninthavenue.com.au/java-static-constants-in-jsp-and-jsf-el
la source
J'ai implémenté comme:
-
Étape suivante, placez l'instance de cette classe dans servlerContext
ajouter un écouteur à web.xml
accès dans jsp
la source
Je définis une constante dans mon jsp dès le début:
J'inclus le taglib de base dans ma JSP:
Ensuite, je mets la constante à la disposition d'EL en suivant la déclaration:
Maintenant, je peux l'utiliser plus tard. Voici un exemple, où la valeur est simplement écrite sous forme de commentaire HTML à des fins de débogage:
Avec votre classe constante, vous pouvez simplement importer votre classe et affecter les constantes à des variables locales. Je sais que ma réponse est une sorte de hack rapide, mais la question se pose également lorsque l'on veut définir des constantes directement dans la JSP.
la source
<%=URI%>
: P<%=URI%>
ne fonctionnait pas, mais cette technique fonctionnait.Oui, vous pouvez. Vous avez besoin d'une balise personnalisée (si vous ne la trouvez pas ailleurs). J'ai fait ceci:
et la balise s'appelle:
Toutes les variables finales statiques publiques seront placées dans une carte indexée par leur nom Java, donc si
alors la balise encapsulera ceci dans un entier et vous pourrez le référencer dans un JSP:
et vous n'êtes pas obligé d'écrire des getters!
la source
Vous pouvez. Essayez de la manière suivante
Testé sur TomCat 7 et java6
la source
Même en sachant que c'est un peu tard, et même en sachant que c'est un petit hack - j'ai utilisé la solution suivante pour obtenir le résultat souhaité. Si vous êtes un amateur de Java-Naming-Conventions, mon conseil est d'arrêter de lire ici ...
Avoir une classe comme celle-ci, définir des constantes, regroupées par classes vides pour créer une sorte de hiérarchie:
peut être utilisé à partir de java
PERMISSION.PAGE.SEE
pour récupérer la valeur1L
Pour obtenir une possibilité d'accès similaire à partir des expressions EL, j'ai fait ceci: (S'il y a un dieu du codage - il pourrait me pardonner avec un peu de chance: D)
enfin, l'expression EL pour accéder à la même chose
Long
devient:#{PERMISSION.PAGE.SEE}
- l'égalité pour Java et EL-Access. Je sais que c'est hors de toute convention, mais cela fonctionne parfaitement bien.la source
@Bozho a déjà fourni une excellente réponse
Cependant, je pense qu'un exemple est nécessaire, donc cela apporte un peu plus de clarté et fait gagner du temps à quelqu'un
la source
Il existe une solution de contournement qui n'est pas exactement ce que vous voulez, mais qui vous permet d'activer presque de la même manière avec des scriptlets touchants d'une manière assez minimale. Vous pouvez utiliser un scriptlet pour mettre une valeur dans une variable JSTL et utiliser du code JSTL propre plus tard dans la page.
la source