3

私は次のjspを持っています:

<%@ page import="java.util.Arrays" %>
<%@ page import="java.util.List" %>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
<html><body>
<%! 
private static class Test {
    private String val2;
    private String val1;

    public Test(String v1, String v2) {
        val1 = v1;
        val2 = v2;
    }

    public String getVal1() {
        return val1;
    }

    public String getVal2() {
        return val2;
    }
};

private static List<Test> ITEMS = Arrays.asList(new Test("1","1"),new Test("2","2"));

%>

<%
    pageContext.setAttribute("ITEMS",ITEMS);
%>

<c:forEach var="item" items="${ITEMS}">
    ${item.val1},${item.val2}
</c:forEach>
</body></html>

TOMCATが実行すると、例外が発生します

javax.el.PropertyNotFoundException: Property 'val1' not readable on type java.lang.String

したがって、ELはコレクションを繰り返し処理しますが、何らかの理由でforEach内の${item}が文字列になります。

ただし、単にに変更private static classすると、public static classすべてが正常に機能します。

私たちには解決策があるので、それは問題ではないことを私は理解しています。しかし、この場合、なぜそれが公開を要求するのかわかりません。JSPはサーブレットに変換されるため、変換されたJavaコード内ではとにかくそれがわかります。ELは、オブジェクトのプロパティを取得するための単なるリフレクションのものではありません(この場合、プロパティはpublicであるため、リフレクション修飾子をハッキングせずにELを使用できるはずです)。

誰かが知っているなら-応答してください。よろしくお願いします!前もって感謝します。

4

3 に答える 3

2

JSPは、JSPエンジンによってサーブレットに変換されます。EL式は、実行時にELエンジンによって評価されます。

TestがJSPに宣言されている場合private、そのメソッドは(デフォルトでは)式言語エンジンへのイントロスペクションでは表示されません。

forEachWebSphereApplicationServerによって翻訳されたあなたのスニペットは次のとおりです。

   do {
      out.write(_jsp_string4);
      out.write((java.lang.String) org.apache.jasper.runtime.PageContextImpl
         .proprietaryEvaluate("${item.val1}", java.lang.String.class,
                              (PageContext)pageContext, _jspx_fnmap, false));
      out.write(_jsp_string5);
      out.write((java.lang.String) org.apache.jasper.runtime.PageContextImpl
         .proprietaryEvaluate("${item.val2}", java.lang.String.class,
                              (PageContext)pageContext, _jspx_fnmap, false));
      out.write(_jsp_string1);
      int evalDoAfterBody = _jspx_th_c_forEach_0.doAfterBody();
      if (evalDoAfterBody != javax.servlet.jsp.tagext.BodyTag.EVAL_BODY_AGAIN)
         break;
    } while (true);

ELはJavaBeansで使用するために設計されました。Beanは、引数なしのコンストラクターを持つパブリッククラスを義務付けます。

于 2012-07-19T09:38:06.343 に答える
1

私はすべての答えを持っているわけではありませんが、私はあなたを少し助けることができます。Tomcatは、BeanELResolverを使用して、JavaBeansコンポーネントアーキテクチャを使用するオブジェクトのプロパティ解決動作を定義します。JavaBeanの規則に準拠していないため、動作は定義されていません。を使用すると、より賢明なエラーメッセージを受け取ることができます

 private static class Test implements java.io.Serializable { 

その結果、

javax.el.PropertyNotFoundException: Property 'var1' not found on type org.apache.jsp.test_jsp$Test  


http://docs.oracle.com/cd/E17802_01/products/products/jsp/2.1/docs/jsp-2_1-pfd2/javax/el/BeanELResolver.htmlhttp://en.wikipedia.org/wikiをご覧ください
。 / JavaBeans

于 2012-07-19T02:11:08.457 に答える
1

JSP は、ELResolver のチェーンを使用して EL 変数を解決します。以下は、EL リゾルバー チェーンの階層です。

  • CompositeELResolver
    • ImplicitObjectELREsolver
    • CompositeELResolver
      • PluginELResolver
    • MapELResolver
    • ResourceBundleELResolver
    • ListELResolver
    • ArrayELResolver
    • BeanELResolver
    • ScopedAttributeELResolver

この階層では、 itemBeanELResolver を使用して解決されます。BeanELResolver では、オブジェクトがBean. そのようなプロパティの 1 つとして、プロパティごとにセッターとゲッターの両方が必要です。

表示されている例外は、 bean のプロパティに対してセッターが定義されていないためです

于 2012-07-19T06:01:57.407 に答える