Как ссылаться на константы с помощью EL на странице JSP?
У меня есть интерфейс Addresses
с константой с именем URL
. Я знаю, что могу сослаться на это с помощью скрипта, перейдя:, <%=Addresses.URL%>
но как мне это сделать с помощью EL?
Если вы уже используете Java EE 7 / EL 3.0, тогда также @page import
будут импортированы константы классов в области EL.
<%@ page import="com.example.YourConstants" %>
Он будет импортирован через ImportHandler#importClass()
и будет доступен как ${YourConstants.FOO}
.
Обратите внимание, что все java.lang.*
классы уже неявно импортированы и доступны как так ${Boolean.TRUE}
и ${Integer.MAX_VALUE}
. Для этого требуется только более свежий контейнерный сервер Java EE 7, поскольку в ранних версиях были ошибки. Например, GlassFish 4.0 и Tomcat 8.0.0-1x не работают, но GlassFish 4.1+ и Tomcat 8.0.2x + работают. И вам нужно быть абсолютно уверенным в том, что ваш web.xml
объявленный соответствует последней версии сервлета, поддерживаемой сервером. Таким образом, если web.xml
заявлено, что сервер соответствует сервлету 2.5 или более ранней версии, ни одна из функций Servlet 3.0+ не будет работать.
Также обратите внимание, что эта возможность доступна только в JSP, но не в Facelets. В случае JSF + Facelets лучше всего использовать OmniFaces,<o:importConstants>
как показано ниже:
<o:importConstants type="com.example.YourConstants" />
Или добавьте слушателя контекста EL, который вызывает, ImportHandler#importClass()
как показано ниже:
@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");
}
});
}
}
Это не возможно в EL 2.2 и старше. Есть несколько альтернатив:
Поместите их в то, Map<String, Object>
что вы поместили в область применения. В EL значения карты доступны обычным способом Javabean с помощью ${map.key}
или ${map['key.with.dots']}
.
Использование <un:useConstants>
в нестандартном TagLib (Maven2 репо здесь ):
<%@ taglib uri="http://jakarta.apache.org/taglibs/unstandard-1.0" prefix="un" %>
<un:useConstants className="com.example.YourConstants" var="constants" />
Таким образом, они доступны обычным для Джавабея способом ${constants.FOO}
.
Используйте CCC <ccc:constantsMap>
Javaranch, как описано где-то в конце этой статьи .
<%@ taglib uri="http://bibeault.org/tld/ccc" prefix="ccc" %>
<ccc:constantsMap className="com.example.YourConstants" var="constants" />
Таким образом, они также доступны обычным способом Javabean ${constants.FOO}
.
Если вы используете JSF2, то вы могли бы использовать <o:importConstants>
в OmniFaces .
<html ... xmlns:o="http://omnifaces.org/ui">
<o:importConstants type="com.example.YourConstants" />
Таким образом, они также доступны обычным способом Javabean #{YourConstants.FOO}
.
Создайте класс-оболочку, который возвращает их через методы получения в стиле Javabean.
Создайте настраиваемый преобразователь EL, который сначала сканирует наличие константы и, если она отсутствует, затем делегирует преобразователю по умолчанию, в противном случае вместо этого возвращает постоянное значение.
unstandard-taglib
Проект в Джакарте еще жив? есть ли альтернатива?Следующее не относится к EL в целом, а только к SpEL (Spring EL) (проверено с помощью 3.2.2.RELEASE на Tomcat 7). Я думаю, что об этом стоит упомянуть здесь, если кто-то ищет JSP и EL (но использует JSP с Spring).
источник
Обычно вы помещаете такие константы в
Configuration
объект (который имеет геттеры и сеттеры) в контексте сервлета и получаете к ним доступ с помощью${applicationScope.config.url}
источник
url
свойством String, назовите егоConfiguration
, создайте его экземпляр и установитеurl
все, что вам нравится. После этого установите этотConfiguration
объектServletContext
. Есть ли что - то подобное,servletContext.setAttribute("config", config)
. Вот и все.ServletContext
? Просто вы можете более аккуратно классифицировать константы? например:applicationScope.config.url
противapplicationScope.url
.Вы не можете. Он следует соглашению Java Bean. Так что у вас должен быть получатель для этого.
источник
Статические свойства недоступны в EL. Обходной путь, который я использую, - создать нестатическую переменную, которая присваивает себе статическое значение.
Я использую lombok для генерации геттера и сеттера, так что это очень хорошо. Ваш EL выглядит так:
Полный код на http://www.ninthavenue.com.au/java-static-constants-in-jsp-and-jsf-el
источник
Я реализовал вроде:
-
Следующим шагом поместите экземпляр этого класса в servlerContext
добавить слушателя в web.xml
доступ в jsp
источник
Я определяю константу в своем jsp в самом начале:
Я включаю в свой JSP базовую библиотеку тегов:
Затем я делаю константу доступной для EL с помощью следующего оператора:
Теперь я могу использовать его позже. Вот пример, где значение просто записано как HTML-комментарий для целей отладки:
С вашим постоянным классом вы можете просто импортировать свой класс и назначить константы локальным переменным. Я знаю, что мой ответ - это своего рода быстрый взлом, но вопрос также возникает, когда кто-то хочет определить константы непосредственно в JSP.
источник
<%=URI%>
: P<%=URI%>
не работал, но эта техника работала.Да, ты можешь. Вам нужен собственный тег (если вы не можете найти его в другом месте). Я сделал это:
и тег называется:
Все общедоступные статические конечные переменные будут помещены в карту, проиндексированную их именем Java, поэтому, если
тогда тег обернет это целым числом, и вы сможете ссылаться на него в JSP:
и вам не нужно писать геттеры!
источник
Ты можешь. Попробуйте следующим образом
Проверено на TomCat 7 и java6
источник
Даже зная, что это немного поздно, и даже зная, что это небольшой прием, я использовал следующее решение для достижения желаемого результата. Если вы любитель Java-Naming-Conventions, мой совет - прекратить читать здесь ...
Имея такой класс, определяющий константы, сгруппированные по пустым классам, чтобы создать своего рода иерархию:
может использоваться изнутри java
PERMISSION.PAGE.SEE
для получения значения1L
Чтобы добиться подобной возможности доступа из EL-Expressions, я сделал следующее: (Если есть бог кодирования - он, надеюсь, простит меня: D)
наконец, EL-Expression для доступа к тому же самому
Long
становится:#{PERMISSION.PAGE.SEE}
- равенство для Java и EL-Access. Я знаю, что это выходит за рамки каких-либо соглашений, но работает отлично.источник
@Bozho уже дал отличный ответ
Тем не менее, я считаю, что нужен пример, который внесет больше ясности и сэкономит чье-то время.
источник
Существует обходной путь, который не совсем то, что вам нужно, но позволяет вам активировать почти то же самое, касаясь скриптлетов довольно минимальным образом. Вы можете использовать скриптлет, чтобы поместить значение в переменную JSTL и использовать чистый код JSTL позже на странице.
источник