如何在EL中引用常量?
如何在 JSP 页面上使用 EL 引用常量?
我有一个接口 Addresses
,其中包含一个名为 URL
的常量。我知道我可以通过以下方式使用 scriplet 引用它: <%=Addresses.URL%>
,但是如何使用 EL 来执行此操作?
How do you reference an constants with EL on a JSP page?
I have an interface Addresses
with a constant named URL
. I know I can reference it with a scriplet by going: <%=Addresses.URL%>
, but how do I do this using EL?
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(12)
EL 3.0 或更高版本
如果您已经使用 Java EE 7 / EL 3.0,那么
@page import
还将导入 EL 范围内的类常量。这将在幕后通过
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
声明符合服务器支持的最新 servlet 版本。因此,对于声明为符合 Servlet 2.5 或更早版本的web.xml
,Servlet 3.0+ 功能都不起作用。另请注意,此功能仅在 JSP 中可用,在 Facelets 中不可用。对于 JSF+Facelets,最好的选择是使用 OmniFaces
如下:或者添加一个调用
ImportHandler#importClass()
的 EL 上下文侦听器,如下所示:EL 2.2 或更早版本
这是在 EL 2.2 及更早版本中不可能。有几种替代方案:
将它们放入您放置在应用程序范围内的
Map
中。在 EL 中,可以通过${map.key}
或${map['key.with.dots']}
以通常的 Javabean 方式访问映射值。使用非标准标签库的
(maven2存储库此处):这样就可以通过
${constants.FOO}
以通常的 Javabean 方式访问它们。使用Javaranch的CCC如 本文。
这样,它们也可以通过
${constants.FOO}
以通常的 Javabean 方式访问。如果您使用的是 JSF2,则可以使用OmniFaces
的代码>。
这样,它们也可以通过
#{YourConstants.FOO}
以通常的 Javabean 方式访问。创建一个包装类,通过 Javabean 风格的 getter 方法返回它们。
创建一个自定义 EL 解析器,它首先扫描常量是否存在,如果不存在,则委托给默认解析器,否则返回常量值。
EL 3.0 or newer
If you're already on Java EE 7 / EL 3.0, then the
@page import
will also import class constants in EL scope.This will under the covers be imported via
ImportHandler#importClass()
and be available as${YourConstants.FOO}
.Note that all
java.lang.*
classes are already implicitly imported and available like so${Boolean.TRUE}
and${Integer.MAX_VALUE}
. This only requires a more recent Java EE 7 container server as early versions had bugs in this. E.g. GlassFish 4.0 and Tomcat 8.0.0-1x fails, but GlassFish 4.1+ and Tomcat 8.0.2x+ works. And you need to make absolutely sure that yourweb.xml
is declared conform the latest servlet version supported by the server. Thus with aweb.xml
which is declared conform Servlet 2.5 or older, none of the Servlet 3.0+ features will work.Also note that this facility is only available in JSP and not in Facelets. In case of JSF+Facelets, your best bet is using OmniFaces
<o:importConstants>
as below:Or adding an EL context listener which calls
ImportHandler#importClass()
as below:EL 2.2 or older
This is not possible in EL 2.2 and older. There are several alternatives:
Put them in a
Map<String, Object>
which you put in the application scope. In EL, map values are accessible the usual Javabean way by${map.key}
or${map['key.with.dots']}
.Use
<un:useConstants>
of the Unstandard taglib (maven2 repo here):This way they are accessible the usual Javabean way by
${constants.FOO}
.Use Javaranch's CCC
<ccc:constantsMap>
as desribed somewhere at the bottom of this article.This way they are accessible the usual Javabean way by
${constants.FOO}
as well.If you're using JSF2, then you could use
<o:importConstants>
of OmniFaces.This way they are accessible the usual Javabean way by
#{YourConstants.FOO}
as well.Create a wrapper class which returns them through Javabean-style getter methods.
Create a custom EL resolver which first scans the presence of a constant and if absent, then delegate to the default resolver, otherwise returns the constant value instead.
以下内容通常不适用于 EL,而仅适用于 SpEL (Spring EL)(在 Tomcat 7 上使用 3.2.2.RELEASE 进行测试)。
我认为这里值得一提,以防有人搜索 JSP 和 EL(但使用 JSP 和 Spring)。
The following does not apply to EL in general, but instead to SpEL (Spring EL) only (tested with 3.2.2.RELEASE on Tomcat 7).
I think it is worth mentioning it here in case someone searches for JSP and EL (but uses JSP with Spring).
您通常将这些类型的常量放置在 servlet 上下文中的
Configuration
对象(具有 getter 和 setter)中,并使用${applicationScope.config.url}
访问它们You usually place these kinds of constants in a
Configuration
object (which has getters and setters) in the servlet context, and access them with${applicationScope.config.url}
你不能。它遵循 Java Bean 约定。所以你必须有一个吸气剂。
You can't. It follows the Java Bean convention. So you must have a getter for it.
我在一开始就在 jsp 中定义了一个常量:
我在 JSP 中包含了核心 taglib:
然后,我通过以下语句使该常量可用于 EL:
现在,我可以稍后使用它。下面是一个示例,其中该值只是写为 HTML 注释以进行调试:
使用常量类,您只需导入类并将常量分配给局部变量即可。我知道我的答案是一种快速破解,但是当人们想要直接在 JSP 中定义常量时,问题也会出现。
I'm defining a constant in my jsp right at the beginning:
I include the core taglib in my JSP:
Then, I make the constant available to EL by following statement:
Now, I can use it later. Here an example, where the value is just written as HTML comment for debugging purposes:
With your constant class, you can just import your class and assign the constants to local variables. I know that my answer is a sort of quick hack, but the question also bumps up when one wants to define constants directly in the JSP.
我实现如下:
-
下一步将此类的实例放入 servlerContext
添加监听器到
jsp 中的 web.xml 访问
I implemented like:
-
Next step put instance of this class into servlerContext
add listener to web.xml
access in jsp
静态属性在 EL 中不可访问。我使用的解决方法是创建一个非静态变量,将其自身分配给静态值。
我使用 lombok 生成 getter 和 setter,这样就很好了。您的 EL 如下所示:
完整代码位于 https://rogerkeays .com/access-java-static-methods-and-constants-from-el
Static properties aren't accessible in EL. The workaround I use is to create a non-static variable which assigns itself to the static value.
I use lombok to generate the getter and setter so that's pretty well it. Your EL looks like this:
Full code at https://rogerkeays.com/access-java-static-methods-and-constants-from-el
是的,你可以。您需要一个自定义标签(如果您在其他地方找不到它)。我已经这样做了:
并且标记被称为:
所有公共静态最终变量都将放入按其 Java 名称索引的 Map 中,因此如果
标记将其包装在 Integer 中,您可以在 JSP 中引用它
:你不必编写吸气剂!
Yes, you can. You need a custom tag (if you can't find it somewhere else). I've done this:
and the tag is called:
All public static final variables will be put into a Map indexed by their Java name, so if
then the tag will wrap this in an Integer and you can reference it in a JSP:
and you don't have to write getters!
你可以。按照以下方式尝试
在 TomCat 7 和 java6 上测试
You can. Try in follow way
Tested on TomCat 7 and java6
即使知道它有点晚了,甚至知道这是一个小黑客 - 我使用以下解决方案来达到预期的结果。如果您是 Java 命名约定的爱好者,我的建议是停止阅读这里...
拥有一个这样的类,定义常量,按空类分组以创建某种层次结构:
可以在 java 中使用 < code>PERMISSION.PAGE.SEE 检索值
1L
为了从 EL 表达式中实现类似的访问可能性,我这样做了:
(如果有编码大神 - 希望他会原谅我 :D )
最后,访问相同
Long
的 EL 表达式变为:#{PERMISSION.PAGE.SEE}< /code> - Java 和 EL-Access 相等。我知道这不符合任何惯例,但它工作得很好。
Even knowing its a little late, and even knowing this is a little hack - i used the following solution to achieve the desired result. If you are a lover of Java-Naming-Conventions, my advice is to stop reading here...
Having a class like this, defining Constants, grouped by empty classes to create kind of a hierarchy:
can be used from within java as
PERMISSION.PAGE.SEE
to retrieve the value1L
To achieve a simliar access-possibility from within EL-Expressions, I did this:
(If there is a coding-god - he hopefully might forgive me :D )
finally, the EL-Expression to access the very same
Long
becomes:#{PERMISSION.PAGE.SEE}
- equality for Java and EL-Access. I know this is out of any convention, but it works perfectly fine.@Bozho 已经提供了一个很好的答案
但是,我觉得需要一个示例,这样它会更加清晰并节省某人的时间
@Bozho already provided a great answer
However, I feel an example is needed so it brings a bit more clarity and spare someone's time
有一种解决方法并不完全是您想要的,但可以让您以非常简单的方式通过触摸 scriptlet 进行几乎相同的活动。您可以使用 scriptlet 将值放入 JSTL 变量中,并稍后在页面中使用干净的 JSTL 代码。
There is a workaround that is not exactly what you want, but lets you active almost the same with touching scriptlets in a quite minimal way. You can use scriptlet to put value into a JSTL variable and use clean JSTL code later in the page.