1. ホーム
  2. jsp

[解決済み] ELで定数を参照するには?

2022-10-24 08:29:30

質問

JSPページでELを使った定数の参照はどのように行うのですか?

私は、インターフェイス Addresses という名前の定数を持つ URL . スクリプトでそれを参照できることは知っています。 <%=Addresses.URL%> とすることで、スクリプトで参照できることは知っていますが、ELを使ってこれを行うにはどうしたらよいでしょうか?

どのように解決するのですか?

EL 3.0以降

すでにJava EE 7 / EL 3.0を利用している場合、その時点で @page import はELスコープでクラス定数もインポートします。

<%@ page import="com.example.YourConstants" %>

この場合、インポートされるのは 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 が、サーバーがサポートする最新のサーブレットバージョンに適合するように宣言されていることを絶対に確認する必要があります。したがって web.xml で、Conform Servlet 2.5 以前と宣言されている場合、Servlet 3.0+ の機能は動作しません。

また、この機能はJSPでのみ利用可能で、Faceletでは利用できないことに注意してください。JSF+Faceletsの場合、最善の策は オムニフェース <o:importConstants> を以下のようにします。

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

あるいは、EL コンテキストリスナーを追加して ImportHandler#importClass() を呼び出すようなELコンテキストリスナーを追加することもできます。

@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("com.example.YourConstants");
            }
        });
    }

}


EL 2.2 またはそれ以前

これは ではなく であり、EL 2.2以前では不可能です。いくつかの代案があります。

  1. に入れる。 Map<String, Object> として、アプリケーションスコープに置いてください。ELでは、マップの値は、通常のJavabeanの方法によって ${map.key} または ${map['key.with.dots']} .

  2. 使用方法 <un:useConstants> 標準外 タグリブ (maven2 repo ここで ):

    <%@ taglib uri="http://jakarta.apache.org/taglibs/unstandard-1.0" prefix="un" %>
    <un:useConstants className="com.example.YourConstants" var="constants" />
    
    

    この方法では、通常のJavabeanの方法である ${constants.FOO} .

  3. Javaranchの CCC <ccc:constantsMap> の下のどこかに記述されているように この記事 .

    <%@ taglib uri="http://bibeault.org/tld/ccc" prefix="ccc" %>
    <ccc:constantsMap className="com.example.YourConstants" var="constants" />
    
    

    この方法では、通常のJavabeanの方法である ${constants.FOO} からもアクセスできるようになります。

  4. JSF2を使っているのであれば <o:importConstants> オムニフェイス .

    <html ... xmlns:o="http://omnifaces.org/ui">
    <o:importConstants type="com.example.YourConstants" />
    
    

    この方法では、通常のJavabeanの方法である #{YourConstants.FOO} からもアクセスできるようになります。

  5. Javabeanスタイルのゲッターメソッドでそれらを返すラッパークラスを作成します。

  6. 定数の存在を最初にスキャンし、存在しない場合はデフォルトのリゾルバに委ね、それ以外の場合は代わりに定数の値を返す、カスタムELリゾルバを作成します。