Gau*_*avS 1 java el primefaces jsf-2 tomcat8
我试图在我的JSF页面中获取一个静态变量.
我按照这篇文章的说明.我可以使用Primefaces扩展来获取变量,但是,在执行以下操作时,我没有在xhtml中获得任何内容.
我有一个常量文件:
public class Test {
public static final String NAME = "EL Test";
}
Run Code Online (Sandbox Code Playgroud)
在balusC的帖子之后,我添加了一个应用程序范围的bean(但是,每次请求都会调用它):
import java.lang.reflect.Field;
import javax.annotation.PostConstruct;
import javax.el.ELContextEvent;
import javax.el.ELContextListener;
import javax.faces.bean.ApplicationScoped;
import javax.faces.bean.ManagedBean;
import javax.faces.context.FacesContext;
@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("my.package.constants.Test");
Class<?> clazz = event.getELContext().getImportHandler().resolveClass("Test");
for (Field field : clazz.getFields()) {
System.out.println(field.getName());
}
System.out.println("clazz = " + clazz);
System.out.println(clazz.getPackage());
}
});
}
}
Run Code Online (Sandbox Code Playgroud)
我的xhtml页面:
<!DOCTYPE html >
<html xmlns="http://www.w3.org/1999/xhtml"
xmlns:h="http://xmlns.jcp.org/jsf/html"
xmlns:f="http://xmlns.jcp.org/jsf/core"
xmlns:ui="http://xmlns.jcp.org/jsf/facelets"
xmlns:p="http://primefaces.org/ui">
<h:head>
<meta charset="utf-8"></meta>
<meta http-equiv="X-UA-Compatible" content="IE=edge"></meta>
<meta name="viewport" content="width=device-width, initial-scale=1"></meta>
</h:head>
<h:body>
<h:outputText value="#{Test}"></h:outputText>
<h:outputText value="#{Test.NAME}"></h:outputText>
</h:body>
</html>
Run Code Online (Sandbox Code Playgroud)
有什么我想念的吗?
JSF 2.3 支持使用f:importConstants标记在 EL 中引用静态变量。
你的常量文件
public class Test {
public static final String NAME = "EL Test";
}
Run Code Online (Sandbox Code Playgroud)
可以通过添加以下元数据在视图中导入。
<f:metadata>
<f:importConstants type="mypackage.Test" />
</f:metadata>
Run Code Online (Sandbox Code Playgroud)
然后使用EL进行引用。
#{Test.NAME}
Run Code Online (Sandbox Code Playgroud)
所以你的观点变成:
<!DOCTYPE html >
<html xmlns="http://www.w3.org/1999/xhtml"
xmlns:h="http://xmlns.jcp.org/jsf/html"
xmlns:f="http://xmlns.jcp.org/jsf/core"
xmlns:ui="http://xmlns.jcp.org/jsf/facelets"
xmlns:p="http://primefaces.org/ui">
<f:metadata>
<f:importConstants type="mypackage.Test" />
</f:metadata>
<h:head>
<meta charset="utf-8"></meta>
<meta http-equiv="X-UA-Compatible" content="IE=edge"></meta>
<meta name="viewport" content="width=device-width, initial-scale=1"> </meta>
</h:head>
<h:body>
<h:outputText value="#{Test.NAME}"></h:outputText>
</h:body>
</html>
Run Code Online (Sandbox Code Playgroud)
来源:Arjan Tijms 的博客。
p:importConstants 在PrimeFaces 6.x中添加.
XHTML:
<p:importConstants type="com.example.Constants" var="Constants" />
<h:outputText value="#{Constants.TEST}" />
Run Code Online (Sandbox Code Playgroud)
Java的:
package com.example;
public class Constants {
public final static String TEST = "Imported Constant";
}
Run Code Online (Sandbox Code Playgroud)
您可以使用o:importConstants by omnifaces
例如:
public class Foo {
public static final String FOO1 = "foo1";
public static final String FOO2 = "foo2";
}
public interface Bar {
public String BAR1 = "bar1";
public String BAR2 = "bar2";
}
public enum Baz {
BAZ1, BAZ2;
}
Run Code Online (Sandbox Code Playgroud)
上述类型的常量字段值可以映射到请求范围如下:
<o:importConstants type="com.example.Foo" />
<o:importConstants type="com.example.Bar" />
<o:importConstants type="com.example.Baz" var="Bazzz" />
...
#{Foo.FOO1}, #{Foo.FOO2}, #{Bar.BAR1}, #{Bar.BAR2}, #{Bazzz.BAZ1}, #{Bazzz.BAZ2}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
5962 次 |
| 最近记录: |