Como você faz referência a constantes com EL em uma página JSP?
Eu tenho uma interface Addresses
com uma constante chamada URL
. Eu sei que posso referenciá-lo com um scriplet indo:, <%=Addresses.URL%>
mas como faço isso usando EL?
Se você já estiver no Java EE 7 / EL 3.0, o @page import
também importará constantes de classe no escopo EL.
<%@ page import="com.example.YourConstants" %>
Isso estará sob as capas importado por ImportHandler#importClass()
e estará disponível como ${YourConstants.FOO}
.
Observe que todas as java.lang.*
classes já foram importadas implicitamente e estão disponíveis como ${Boolean.TRUE}
e ${Integer.MAX_VALUE}
. Isso requer apenas um servidor de contêiner Java EE 7 mais recente, pois as versões anteriores apresentavam bugs. Por exemplo, GlassFish 4.0 e Tomcat 8.0.0-1x falham, mas GlassFish 4.1+ e Tomcat 8.0.2x + funcionam. E você precisa ter certeza absoluta de que web.xml
está em conformidade com a versão mais recente do servlet suportada pelo servidor. Assim, com um web.xml
Servlet 2.5 ou anterior declarado conforme, nenhum dos recursos do Servlet 3.0+ funcionará.
Observe também que esse recurso está disponível apenas em JSP e não em Facelets. No caso de JSF + Facelets, sua melhor aposta é usar OmniFaces<o:importConstants>
conforme abaixo:
<o:importConstants type="com.example.YourConstants" />
Ou adicionando um ouvinte de contexto EL que chama ImportHandler#importClass()
conforme abaixo:
@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");
}
});
}
}
Isso não é possível no EL 2.2 e anteriores. Existem várias alternativas:
Coloque-os em um Map<String, Object>
que você colocou no escopo do aplicativo. Em EL, os valores do mapa são acessíveis da maneira usual de Javabean por ${map.key}
ou ${map['key.with.dots']}
.
Uso <un:useConstants>
do taglib Unstandard (maven2 repo aqui ):
<%@ taglib uri="http://jakarta.apache.org/taglibs/unstandard-1.0" prefix="un" %>
<un:useConstants className="com.example.YourConstants" var="constants" />
Desta forma, eles são acessíveis da maneira usual de Javabean ${constants.FOO}
.
Use o CCC de Javaranch <ccc:constantsMap>
conforme descrito em algum lugar no final deste artigo .
<%@ taglib uri="http://bibeault.org/tld/ccc" prefix="ccc" %>
<ccc:constantsMap className="com.example.YourConstants" var="constants" />
Desta forma, eles também são acessíveis da maneira usual de Javabean ${constants.FOO}
.
Se você estiver usando JSF2, então você poderia usar <o:importConstants>
de OmniFaces .
<html ... xmlns:o="http://omnifaces.org/ui">
<o:importConstants type="com.example.YourConstants" />
Desta forma, eles também são acessíveis da maneira usual de Javabean #{YourConstants.FOO}
.
Crie uma classe de wrapper que os retorne por meio de métodos getter no estilo javabeano.
Crie um resolvedor EL personalizado que primeiro verifica a presença de uma constante e, se ausente, delega ao resolvedor padrão; caso contrário, retorna o valor da constante.
unstandard-taglib
projeto de Jacarta ainda está vivo? existe alguma alternativa?O seguinte não se aplica ao EL em geral, mas ao invés do SpEL (Spring EL) somente (testado com 3.2.2.RELEASE no Tomcat 7). Acho que vale a pena mencioná-lo aqui caso alguém procure por JSP e EL (mas usa JSP com Spring).
fonte
Você geralmente coloca esses tipos de constantes em um
Configuration
objeto (que tem getters e setters) no contexto do servlet e os acessa com${applicationScope.config.url}
fonte
url
uma propriedade String, nomeie-aConfiguration
, instancie-a e definaurl
como quiser. Depois disso, coloque esseConfiguration
objeto emServletContext
. Faça algo comoservletContext.setAttribute("config", config)
,. E aí está.ServletContext
? É só que você pode classificar as constantes de maneira mais precisa? por exemplo:applicationScope.config.url
vsapplicationScope.url
.Você não pode. Ele segue a convenção Java Bean. Portanto, você deve ter um getter para isso.
fonte
As propriedades estáticas não são acessíveis em EL. A solução alternativa que uso é criar uma variável não estática que se atribui ao valor estático.
Eu uso o lombok para gerar o getter e o setter, então é isso. Seu EL é parecido com este:
Código completo em http://www.ninthavenue.com.au/java-static-constants-in-jsp-and-jsf-el
fonte
Eu implementei como:
-
Próxima etapa colocar a instância desta classe em servlerContext
adicionar ouvinte a web.xml
acesso em jsp
fonte
Estou definindo uma constante em meu jsp logo no início:
Incluo o taglib principal em meu JSP:
Em seguida, disponibilizo a constante para EL seguindo a seguinte declaração:
Agora, posso usá-lo mais tarde. Aqui está um exemplo, onde o valor é escrito apenas como comentário HTML para fins de depuração:
Com sua classe constante, você pode simplesmente importar sua classe e atribuir as constantes às variáveis locais. Eu sei que minha resposta é uma espécie de hack rápido, mas a questão também surge quando se quer definir constantes diretamente no JSP.
fonte
<%=URI%>
: P<%=URI%>
não funcionava, mas essa técnica funcionava.Sim você pode. Você precisa de uma tag personalizada (se não conseguir encontrá-la em outro lugar). Eu fiz isso:
e a tag é chamada:
Todas as variáveis finais estáticas públicas serão colocadas em um mapa indexado por seu nome Java, portanto, se
então a tag envolverá isso em um inteiro e você pode referenciá-lo em um JSP:
e você não precisa escrever getters!
fonte
Você pode. Tente seguir o caminho
Testado em TomCat 7 e java6
fonte
Mesmo sabendo que é um pouco tarde, e mesmo sabendo que isso é um pequeno hack - usei a seguinte solução para alcançar o resultado desejado. Se você é um amante de Java-Naming-Conventions, meu conselho é parar de ler aqui ...
Ter uma classe como essa, definindo constantes, agrupadas por classes vazias para criar uma espécie de hierarquia:
pode ser usado de dentro de java
PERMISSION.PAGE.SEE
para recuperar o valor1L
Para conseguir uma possibilidade de acesso semelhante de dentro de EL-Expressions, eu fiz o seguinte: (Se houver um deus da codificação - espero que ele me perdoe: D)
finalmente, a EL-Expression para acessar o mesmo
Long
torna-se:#{PERMISSION.PAGE.SEE}
- igualdade para Java e EL-Access. Eu sei que isso está fora de qualquer convenção, mas funciona perfeitamente bem.fonte
@Bozho já deu uma ótima resposta
No entanto, sinto que é necessário um exemplo para trazer um pouco mais de clareza e poupar o tempo de alguém
fonte
Há uma solução alternativa que não é exatamente o que você deseja, mas permite que você ative quase da mesma forma, tocando scriptlets de uma maneira mínima. Você pode usar o scriptlet para colocar o valor em uma variável JSTL e usar o código JSTL limpo posteriormente na página.
fonte