Pergunta

Esta questão já tem uma resposta aqui:

Eu tenho uma classe que define os nomes de vários atributos de sessão, por exemplo.

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

Eu gostaria de usar essas constantes dentro de uma JSP para teste para a presença desses atributos, algo como:

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

Mas eu não consigo obter o sytax correta. Além disso, para evitar a repetição dos testes em vez longas acima em vários lugares, eu gostaria de atribuir o resultado a uma variável local (páginas escopo), e referem-se a que, em vez. Eu acredito que posso fazer isso com <c:set>, mas mais uma vez eu estou lutando para encontrar a sintaxe correta.

UPDATE: Na sequência da sugestão abaixo, eu tentei:

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

que não funcionou. Então, ao invés, eu tentei substituindo o valor literal da constante. Eu também acrescentou a constante com o conteúdo da página, para que eu pudesse verificar o valor da constante quando a página está sendo processado

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

Esta funcionou bem e é impresso o valor "current.user" esperado na página. Eu estou em uma perda para explicar por que usando a seqüência de trabalhos literais, mas uma referência para a constante não faz, quando os dois parecem ter o mesmo valor. Ajuda .....

Foi útil?

Solução

Não está funcionando no seu exemplo porque a constante ATTR_CURRENT_USER não está visível para as tags JSTL, que esperam propriedades para ser exposto por funções getter. Eu não tentei isso, mas a maneira mais limpa para expor suas constantes parece ser o unstandard biblioteca tag .

ETA: Link Old dei não funcionou. Novas ligações podem ser encontrados nesta resposta: Java constantes em JSP

trechos de código para esclarecer o comportamento que você está vendo: classe de exemplo:

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


}    

trechos da página JSP, mostrando uso de amostra:

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

Esta saídas:

Usando scriptlets

Constants.ATTR_CURRENT_USER

current.user

Session [Constants.ATTR_CURRENT_USER]

Me


Usando JSTL

Constants.getATTR_CURRENT_USER_FUNC ()

current.user

Session [Constants.getATTR_CURRENT_USER_FUNC ()]

Me

Constants.ATTR_CURRENT_USER



Outras dicas

o tema é bastante antiga, mas de qualquer maneira ..:)

Eu encontrei solução bom ter Constantes disponíveis através JSTL. Você deve preparar um mapa usando a reflexão e colocá-lo onde quiser.

O mapa sempre conterá todas as constantes definidas na classe Constantes. Você pode colocá-lo em ServletContext usando ouvinte e desfrutar de constantes em JSTL como:

${CONSTANTS["CONSTANT_NAME_IN_JAVA_CLASS_AS_A_STRING"]}


CONSTANTES aqui é uma chave que você usou colocando mapa em Contexto :-)


O seguinte é um pedaço do meu código de construção de um mapa dos campos constantes:

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

Você pode definir Constants.ATTR_CURRENT_USER como uma variável com c: set, assim como abaixo:

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

estáticas não são acessíveis em EL. O uso solução I é criar uma variável não-estático que se atribui ao valor estático.

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

Eu uso Lombok para gerar o getter e setter de modo que é muito bem-lo. Seu EL parece com isso:

${bean.manager_role}

código completo em http: // www .ninthavenue.com.au / java-static-constantes-em-jsp-and-jsf-el

Eu estou atrasado para a discussão, mas a minha abordagem é um pouco diferente. Eu uso um manipulador de tag personalizado para dar páginas JSP os valores constantes (numéricas ou string) de que necessita. Aqui está como eu fiz isso:

Suposto Eu tenho uma classe que mantém todas as constantes:

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

Eu também tenho essa tag personalizado extremamente simples:

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

Então eu tenho um StringHelper.tld. No interior, eu tenho este:

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

No JSP, eu incluo o StringHelper.tld da maneira normal:

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

Finalmente, eu uso o tag e aplicar os valores necessários usando 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 um EL resolvedor personalizado para a cadeia resolver EL, que irá resolver os constantes. Um EL Resolver é de classe Java estendendo javax.el.ELResolver classe.

Obrigado,

Em primeiro lugar, sua sintaxe teve um extra "]", que estava causando um erro.

Para corrigir isso, e para definir uma variável que você faria isso:

<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>
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top