【问题标题】:How to reference static variables using EL 3.0?如何使用 EL 3.0 引用静态变量?
【发布时间】:2015-12-07 06:59:03
【问题描述】:

我试图在我的 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>

我有什么遗漏吗?

【问题讨论】:

    标签: java jsf-2 primefaces el tomcat8


    【解决方案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

    【讨论】:

      【解决方案2】:

      p:importConstants 在 PrimeFaces 6.x 中添加。

      XHTML:

      <p:importConstants type="com.example.Constants" var="Constants" />
      
      <h:outputText value="#{Constants.TEST}" />
      

      Java:

      package com.example;
      
      public class Constants {
          public final static String TEST = "Imported Constant";
      }
      

      【讨论】:

        【解决方案3】:

        我看到您使用的是 JSF 2,您可以使用 Omnifaces 库:

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

        然后在facelet中:

        <o:importConstants type="com.example.Test " />
        
        #{Test.NAME}
        

        否则,如果您想避免使用第三方库,请使用带有 getter 的 @ApplicationScoped 托管 bean 来实现此目的:

        @ManagedBean
        @ApplicationScoped
        public class Test{
            public static final String name = "EL Test";
        
            public String getName(){
                return name;
            }
        
        }
        

        你可以参考:

        #{test.name}
        

        另请参阅:

        【讨论】:

          【解决方案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}
          

          【讨论】:

            猜你喜欢
            • 2023-03-18
            • 1970-01-01
            • 1970-01-01
            • 2015-12-31
            • 2013-08-15
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2012-05-25
            相关资源
            最近更新 更多