给定以下enum
.
package util;
public enum IntegerConstants
{
DATA_TABLE_PAGE_LINKS(10);
private final int value;
private IntegerConstants(int con) {
this.value = con;
}
public int getValue() {
return value;
}
}
这里给出的常量应该像下面这样在XHTML页面上检索。
<ui:composition template="/WEB-INF/admin_template/Template.xhtml"
xmlns="http://www.w3.org/1999/xhtml"
xmlns:h="http://java.sun.com/jsf/html"
xmlns:ui="http://java.sun.com/jsf/facelets"
xmlns:o="http://omnifaces.org/ui">
<ui:define name="title">Test</ui:define>
<ui:define name="content">
<h:form id="form" prependId="true">
<o:importConstants var="const" type="util.IntegerConstants"/>
DATA_TABLE_PAGE_LINKS : #{const.DATA_TABLE_PAGE_LINKS.value}
</h:form>
</ui:define>
</ui:composition>
这适用于在GlassFish 4.0上运行JSF托管bean的企业应用程序。
同样的事情,但是在使用Spring (4.0 GA), JSF 2.2.6, PrimeFaces 5.0 final, PrimeFaces Extensions 2.0.0 final在Tomcat 8.0.3.0上运行的项目中不起作用。
这应该与Spring无关。
给出的enum
(它的类文件)在应用程序构建文件夹下的WEB-INF/classes
文件夹中可用。
很难找出问题的实际原因,因为没有抛出错误或异常。浏览器上的页面是空白的,在服务器终端上什么也看不见。
OmniFaces的版本是1.7。
在OmniFaces 1.8-SNAPSHOT上尝试了一下,但问题仍然是静止的。
部分答案:
当我将<o:importConstants>
的var
属性的值从const
更改为以下不同的值时,这工作了。
<o:importConstants var="literal" type="util.IntegerConstants"/>
DATA_TABLE_PAGE_LINKS : #{literal.DATA_TABLE_PAGE_LINKS.value}
显然,值const
似乎被保留在某个地方,但这很难相信,因为与值const
相同的事情在上面提到的另一个应用程序中工作得很好!
这与EL的关系比JSF/Spring/OmniFaces更密切。Tomcat使用的Apache EL实现在保留关键字方面确实有很大的限制。因此,例如,#{bean.class.name}
(如打印bean.getClass().getName()
)可能在Oracle EL实现中被GlassFish使用,但不可能在Apache EL实现中被Tomcat使用。您应该将其写成#{bean['class'].name}
。Java语言规范第3.9章中列出的所有其他Java关键字,如果没有在EL规范第1.17章中列出,则也会被Apache EL实现屏蔽。const
确实是其中之一。
另外,建议常量var
以大写字母开头。该约定允许更好地区分EL范围内的托管bean实例和常量引用。它也立即解决你的问题,因为Const
是不一样的const
。
<o:importConstants var="Const" type="util.IntegerConstants" />
DATA_TABLE_PAGE_LINKS : #{Const.DATA_TABLE_PAGE_LINKS.value}
或者只是重命名枚举,var
默认为Class#getSimpleName()
。
<o:importConstants type="util.Const" />
DATA_TABLE_PAGE_LINKS : #{Const.DATA_TABLE_PAGE_LINKS.value}