110 votes

Comment constantes de référence en EL?

Comment faites-vous référence à une des constantes 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 par: <%=Addresses.URL%>, mais comment dois-je faire cela à l'aide de EL?

162voto

BalusC Points 498232

Ce n'est pas possible en utilisant la norme EL dans sa version actuelle, la version 2.2. Il y a cependant plusieurs façons d'atteindre l'exigence:

  1. Les mettre dans un Map<String, Object> ce que vous mettez dans le champ d'application. En EL, les valeurs de la carte sont accessibles à l'habitude Javabean moyen en ${map.key} ou ${map['key.with.dots']}.

  2. Utiliser <un:useConstants> de la 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 à l'habitude Javabean moyen en ${constants}.

  3. Utilisation Javaranch du CCC <ccc:constantsMap> comme décrit plus quelque part en 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 accessibles à l'habitude Javabean moyen en ${constants} .

  4. Si vous utilisez JSF2, alors vous pouvez utiliser <o:importConstants> de OmniFaces.

     <html ... xmlns:o="http://omnifaces.org/ui">
     <o:importConstants type="com.example.YourConstants" />
    

    De cette façon, ils sont accessibles à l'habitude Javabean moyen en #{YourConstants} .

  5. Créer une classe wrapper qui les renvoie par le biais de Javabean de style méthodes de lecture.

  6. Créer un personnalisé EL résolveur qui balaye d'abord la présence d'une constante et, si l'absence, puis délégué à la résolution par défaut, sinon renvoie la valeur de la constante à la place.


Mise à jour: depuis EL 3.0 (JSR-341, une partie de Java EE 7), il est possible de constantes de référence dans EL à peu près de la même façon que <o:importConstants>. Pour tous java.lang.* classes, ils sont implicitement déjà importé et disponible comme ${Boolean.TRUE} et ${Integer.MAX_VALUE}. Pour les constantes personnalisées, vous devez utiliser ImportHandler#importClass() ou peut - #importPackage().

Pour les JSP, vous pouvez configurer ce applicationwide dans un servlet contexte d'écoute comme suit:

@WebListener
public class Config implements ServletContextListener {

    @Override
    public void contextInitialized(ServletContextEvent event) {
        JspFactory.getDefaultFactory().getJspApplicationContext(event.getServletContext()).addELContextListener(new ELContextListener() {
            @Override
            public void contextCreated(ELContextEvent event) {
                event.getELContext().getImportHandler().importClass("com.example.YourConstants");
            }
        });
    }

    // ...
}

Pour JSF, vous pouvez configurer ce applicationwide dans une application étendue de haricot comme suit:

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

}

A noté que la première version de l'actuel seulement "prêt pour la production" Java EE 7 mise en œuvre, GlassFish 4.0, a un bogue dans lequel ce ne parvient toujours pas à travailler. Voir aussi cette réponse: Constantes dans EL 3.0 - Fonction " T " est introuvable.

11voto

anre Points 682

Ce qui suit ne s'applique pas aux EL en général, mais au lieu de le SpEL (Printemps EL) seul (testé avec 3.2.2.COMMUNIQUÉ de Tomcat 7). Je pense qu'il vaut la peine de mentionner ici au cas où quelqu'un des recherches pour les JSP et EL (mais qui utilise des JSP avec le Printemps).

<%@ taglib prefix="spring" uri="http://www.springframework.org/tags"%>
<spring:eval var="constant" expression="T(com.example.Constants).CONSTANT"/>

9voto

Bozho Points 273663

Vous habituellement, ces types de constantes en Configuration objet (qui a getters et setters) dans le contexte de servlet, et d'y accéder avec ${applicationScope.config.url}

8voto

Adeel Ansari Points 24434

Vous ne pouvez pas. Il suit la Java Bean convention. Donc, vous devez disposer d'un getter pour elle.

5voto

SergeyB Points 596

J'ai mis en place comme:

public interface Constants{
    Integer PAGE_SIZE = 20;
}

-

public class JspConstants extends HashMap<String, String> {

        public JspConstants() {
            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 {
                        put(field.getName(), (String)field.get(null));
                    } catch(IllegalAccessException ignored) {
                    }
                }
            }
        }

        @Override
        public String get(Object key) {
            String result = super.get(key);
            if(StringUtils.isEmpty(result)) {
                throw new IllegalArgumentException("Check key! The key is wrong, no such constant!");
            }
            return result;
        }
    }

Prochaine étape, mettre instance de cette classe dans servlerContext

public class ApplicationInitializer implements ServletContextListener {


    @Override
    public void contextInitialized(ServletContextEvent sce) {
        sce.getServletContext().setAttribute("Constants", new JspConstants());
    }

    @Override
    public void contextDestroyed(ServletContextEvent sce) {
    }
}

l'accès en jsp

${Constants.PAGE_SIZE}

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X