如何使用EL 3.0引用静态变量?

时间:2015-09-10 20:39:08

标签: java jsf-2 primefaces el tomcat8

我想在我的JSF页面中获取一个静态变量。

我按照this帖子上的说明操作。我可以使用Primefaces extension获取变量,但是,在执行以下操作时,我没有在xhtml中获得任何内容。

我有一个常量文件:

public class Test {
    public static final String NAME = "EL Test";
}

在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());
            }
        });
    }
}

我的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>

我有什么遗失的吗?

4 个答案:

答案 0 :(得分:6)

在PrimeFaces 6.x中添加了

p:importConstants

XHTML:

<p:importConstants type="com.example.Constants" var="Constants" />

<h:outputText value="#{Constants.TEST}" />

爪哇:

package com.example;

public class Constants {
    public final static String TEST = "Imported Constant";
}

答案 1 :(得分:4)

您可以使用omnifaces的o:importConstants

例如:

 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;
 }

上述类型的常量字段值可以映射到请求范围,如下所示:

 <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}

答案 2 :(得分:3)

当我看到您正在使用JSF 2时,您可以使用Omnifaces库:

<o:importConstants type="com.example.Test " />

#{Test.NAME}

然后在小脸中:

@ApplicationScoped

否则,如果您想避免使用第三方库,请为此目的使用带有getter的@ManagedBean @ApplicationScoped public class Test{ public static final String name = "EL Test"; public String getName(){ return name; } } 托管bean:

#{test.name}

您可以参考:

%20

另见:

答案 3 :(得分:1)

JSF 2.3支持使用 f:importConstants 标记在EL中引用静态变量。

您的常量文件

public class Test {
    public static final String NAME = "EL Test";
}

可以通过添加以下元数据在视图中导入。

<f:metadata>
    <f:importConstants type="mypackage.Test" />
</f:metadata>

然后使用EL进行引用。

#{Test.NAME}

所以你的观点变成了:

<!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>

来源:Arjan Tijms' Weblog