13

私のプロジェクトでは、Spring 3.0.1 + Apache Tiles 2.2.1 + Glassfish 2.1 を使用しています。私がやろうとしているのは、jsp ページでいくつかのメソッドを呼び出し、それにいくつかのパラメーターを渡すことです。たとえば、私は豆を持っています:

@Component
@Scope(value = "singleton")
public class TestBean {
    public void test(String param){
        System.out.println("param = " + param);
    }
}

そして私はjspページを持っています:

<%@page contentType="text/html; charset=utf-8"%>
${testBean.test("hello")}

このコードでは、次のような例外が発生します。

org.apache.jasper.JasperException: デフォルトの名前空間が指定されていない場合、関数テストは接頭辞とともに使用する必要があります

パラメータを渡さずにメソッドを呼び出すと、すべて問題ありません。

jboss-el.jar を WEB-INF/lib に配置し、必要なパラメーターを web.xml に配置しようとしました (ここで説明されているように) が、効果はありません。

上記の一連のテクノロジに制限されているため、何も追加できません。たとえば、アプリ サーバーのバージョンを変更することもできません。

これらすべての条件で、私の問題の解決策はありますか?

4

3 に答える 3

18

org.apache.jasper.JasperException:デフォルトの名前空間が指定されていない場合は、関数テストをプレフィックスとともに使用する必要があります

これは、環境が引数を使用してBeanメソッドを呼び出す新しいEL2.2機能をサポートしていないことを示しています。古い環境では、式を表記法を持つEL関数namespace:functionName()(JSTL関数など)として解釈しようとしています。namespace:例外は、EL機能を識別するためにパーツが見つからないという不満だけです。しかし、結局のところ、それは間違っています。

ELで引数を使用してBeanメソッドを呼び出せるようにするには、次の条件が満たされていることを確認する必要があります。

  1. ターゲットコンテナはEL2.2をサポートしている必要があります。EL2.2はJavaEE6の一部であり、サーブレット3.0もカバーしているため、すべてのサーブレット3.0互換コンテナが機能します。サーブレット3.0コンテナの例としては、Tomcat 7.x、Glassfish 3.x、JBoss AS 6.x/7.xがあります。

  2. この/WEB-INF/web.xmlファイルは、サーブレット3.0仕様に準拠していると宣言されています(したがって、2.5などの古いファイルではありません)。

    <?xml version="1.0" encoding="UTF-8"?>
    <web-app 
        xmlns="http://java.sun.com/xml/ns/javaee"
        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
        xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"
        version="3.0">
    
        <!-- Config here. -->
    
    </web-app>
    

    そうしないと、コンテナはルート宣言で一致するバージョンと一致するフォールバックモードで実行されweb.xml、これによりすべての新しいサーブレット3.0とEL2.2の素晴らしさが失われます。

  3. Webアプリケーションには、Tomcat 6.xなどに由来する、および/またはTomcat 6.xなどに由来する、古いメーカー/バージョンのコンテナに由来するコンテナ固有のEL実装ライブラリは含まれて/WEB-INF/libいませel-api.jarel-impl.jar

具体的な問題は、サーブレット3.0と互換性のないコンテナである古いGlassfish2.xを使用することによって発生します。

Glassfish 3.xにアップグレードするか、別の方法を探してください。JBoss ELアプローチはJSFでのみ機能し、Springや「プレーンJSP」では機能しません。

于 2012-10-22T21:24:04.360 に答える
1

私は Servlet 2.5 で作業する必要があるため、次のハックを作成しました。

JSP:

${testBean.test["hello"]}

豆:

private Map test;

public Map getTest() {
    if (test == null) {
        test = new Map() {
            @Override
            public Object get(Object key) {
                System.out.println("param = " + key);
                return null;
            }

            @Override
            public int size() {
                throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates.
            }

            @Override
            public boolean isEmpty() {
                throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates.
            }

            @Override
            public boolean containsKey(Object key) {
                throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates.
            }

            @Override
            public boolean containsValue(Object value) {
                throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates.
            }

            @Override
            public Object put(Object key, Object value) {
                throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates.
            }

            @Override
            public Object remove(Object key) {
                throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates.
            }

            @Override
            public void putAll(Map m) {
                throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates.
            }

            @Override
            public void clear() {
                throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates.
            }

            @Override
            public Set keySet() {
                throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates.
            }

            @Override
            public Collection values() {
                throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates.
            }

            @Override
            public Set entrySet() {
                throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates.
            }

        };
    }
    return test;
}
于 2016-02-27T01:15:06.920 に答える
1

el 2.2 とサーブレット 3.0 を使用している場合は、Tomcat 7 を使用してください。同じ問題に直面し、上記のバージョンで修正されました。

于 2014-08-12T12:43:29.903 に答える