W jaki sposób odwołujesz się do stałych za pomocą EL na stronie JSP?
Mam interfejs Addresses
ze stałą o nazwie URL
. Wiem, że mogę odwołać się do tego rysikiem, przechodząc: <%=Addresses.URL%>
ale jak to zrobić za pomocą EL?
Jeśli korzystasz już z języka Java EE 7 / EL 3.0, program @page import
zaimportuje również stałe klasy w zakresie EL.
<%@ page import="com.example.YourConstants" %>
Będzie to pod okładkami importowane przez ImportHandler#importClass()
i dostępne jako ${YourConstants.FOO}
.
Zauważ, że wszystkie java.lang.*
klasy są już niejawnie zaimportowane i dostępne, tak jak ${Boolean.TRUE}
i ${Integer.MAX_VALUE}
. Wymaga to tylko nowszego serwera kontenerów Java EE 7, ponieważ wczesne wersje miały w tym błędy. Np. Zawodzą GlassFish 4.0 i Tomcat 8.0.0-1x, ale GlassFish 4.1+ i Tomcat 8.0.2x + działają. I musisz mieć absolutną pewność, że web.xml
deklarowana jest zgodność z najnowszą wersją serwletu obsługiwaną przez serwer. Zatem w przypadku web.xml
deklaracji zgodności z serwletem 2.5 lub starszym żadna z funkcji Servlet 3.0+ nie będzie działać.
Należy również pamiętać, że ta funkcja jest dostępna tylko w JSP, a nie w Facelets. W przypadku JSF + Facelets najlepszym rozwiązaniem jest użycie OmniFaces,<o:importConstants>
jak poniżej:
<o:importConstants type="com.example.YourConstants" />
Lub dodanie odbiornika kontekstu EL, który wywołuje ImportHandler#importClass()
jak poniżej:
@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");
}
});
}
}
Nie jest to możliwe w EL 2.2 i starszych. Istnieje kilka alternatyw:
Umieść je w tym, Map<String, Object>
który umieścisz w zakresie aplikacji. W EL wartości map są dostępne w zwykły sposób w Javabean przez ${map.key}
lub ${map['key.with.dots']}
.
Korzystanie <un:useConstants>
z niestandardowego taglib ( tutaj repozytorium maven2 ):
<%@ taglib uri="http://jakarta.apache.org/taglibs/unstandard-1.0" prefix="un" %>
<un:useConstants className="com.example.YourConstants" var="constants" />
W ten sposób są one dostępne w zwykły sposób w Javabean przez ${constants.FOO}
.
Użyj CCC Javarancha, <ccc:constantsMap>
jak opisano gdzieś na dole tego artykułu .
<%@ taglib uri="http://bibeault.org/tld/ccc" prefix="ccc" %>
<ccc:constantsMap className="com.example.YourConstants" var="constants" />
W ten sposób są one również dostępne w zwykły sposób w Javabean ${constants.FOO}
.
Jeśli używasz JSF2, następnie można użyć <o:importConstants>
z OmniFaces .
<html ... xmlns:o="http://omnifaces.org/ui">
<o:importConstants type="com.example.YourConstants" />
W ten sposób są one również dostępne w zwykły sposób w Javabean #{YourConstants.FOO}
.
Utwórz klasę opakowującą, która zwraca je za pomocą metod pobierających w stylu Javabean.
Utwórz niestandardowy program rozpoznawania nazw EL, który najpierw skanuje obecność stałej, a jeśli jej nie ma, następnie deleguje do domyślnego programu rozpoznawania nazw, w przeciwnym razie zwraca stałą wartość.
unstandard-taglib
projekt Dżakarta wciąż żyje? czy jest jakaś alternatywa?Poniższe informacje nie odnoszą się ogólnie do EL, ale tylko do SpEL (Spring EL) (testowane z 3.2.2.RELEASE na Tomcat 7). Myślę, że warto o tym tutaj wspomnieć na wypadek, gdyby ktoś szukał JSP i EL (ale używa JSP ze Spring).
źródło
Zazwyczaj tego rodzaju stałe umieszcza się w
Configuration
obiekcie (który ma metody pobierające i ustawiające) w kontekście serwletu i uzyskuje do nich dostęp za pomocą${applicationScope.config.url}
źródło
url
właściwością String, nazwij jąConfiguration
, utwórz jej instancję i ustawurl
dowolną wartość. Następnie ustaw tenConfiguration
obiektServletContext
. Zrób coś takiego jakservletContext.setAttribute("config", config)
. I gotowe.ServletContext
? Czy po prostu możesz dokładniej klasyfikować stałe? npapplicationScope.config.url
vsapplicationScope.url
.Nie możesz. Jest zgodny z konwencją Java Bean. Więc musisz mieć do tego getter.
źródło
Właściwości statyczne nie są dostępne w EL. Sposób obejścia tego problemu polega na utworzeniu zmiennej niestatycznej, która przypisuje się do wartości statycznej.
Używam lomboka do generowania gettera i settera, więc to całkiem nieźle. Twój EL wygląda tak:
Pełny kod na http://www.ninthavenue.com.au/java-static-constants-in-jsp-and-jsf-el
źródło
Zrealizowałem tak:
-
W następnym kroku umieść instancję tej klasy w servlerContext
dodaj odbiornik do web.xml
dostęp w jsp
źródło
Na początku definiuję stałą w moim jsp:
Dołączam rdzeń taglib do mojej strony JSP:
Następnie udostępniam stałą EL, wykonując następujące oświadczenie:
Teraz mogę tego użyć później. Oto przykład, w którym wartość jest zapisywana jako komentarz HTML do celów debugowania:
Za pomocą swojej stałej klasy możesz po prostu zaimportować swoją klasę i przypisać stałe do zmiennych lokalnych. Wiem, że moja odpowiedź to rodzaj szybkiego hackowania, ale pytanie pojawia się również, gdy chce się zdefiniować stałe bezpośrednio na JSP.
źródło
<%=URI%>
: P<%=URI%>
nie działał, ale ta technika działała.Tak, możesz. Potrzebujesz niestandardowego tagu (jeśli nie możesz go znaleźć gdzie indziej). Zrobiłem to:
a tag nazywa się:
Wszystkie publiczne statyczne zmienne końcowe zostaną umieszczone w Mapie indeksowanej według ich nazwy w Javie, więc jeśli
wtedy tag zawinie to w liczbę całkowitą i możesz odwołać się do niego na stronie JSP:
i nie musisz pisać getters!
źródło
Możesz. Spróbuj naśladować
Przetestowano na TomCat 7 i java6
źródło
Nawet wiedząc, że jest trochę za późno, a nawet wiedząc, że to mały hack - zastosowałem następujące rozwiązanie, aby osiągnąć pożądany rezultat. Jeśli jesteś miłośnikiem konwencji nazewnictwa języka Java, radzę przestać czytać tutaj ...
Posiadanie takiej klasy, definiowanie stałych, pogrupowanych według pustych klas, aby stworzyć rodzaj hierarchii:
może być używany z poziomu java,
PERMISSION.PAGE.SEE
aby pobrać wartość1L
Aby uzyskać podobną możliwość dostępu z poziomu EL-Expressions, zrobiłem to: (Jeśli istnieje bóg kodujący - mam nadzieję, że może mi wybaczyć: D)
na koniec EL-Expression, aby uzyskać dostęp do tego samego,
Long
staje się:#{PERMISSION.PAGE.SEE}
- równością dla Java i EL-Access. Wiem, że to jest poza jakąkolwiek konwencją, ale działa doskonale.źródło
@Bozho już udzielił świetnej odpowiedzi
Uważam jednak, że potrzebny jest przykład, który daje trochę więcej klarowności i oszczędza komuś czas
źródło
Istnieje obejście, które nie jest dokładnie tym, czego chcesz, ale pozwala na prawie takie samo działanie z dotykaniem skryptów w dość minimalny sposób. Możesz użyć skryptletu, aby umieścić wartość w zmiennej JSTL i użyć czystego kodu JSTL w dalszej części strony.
źródło