1

以下のようなJava Beanクラスがあります

public class Users extends dbConnect
{
   private int UserId;  

   public int getUserId() 
   {
    return UserId;
   }

   public void setUserId(int userId) 
   {
     UserId = userId;
   }
}

私のサーブレットには、javabean クラスで値を取得し、JSP ページに表示する doGet メソッドがあります。ListUsers メソッドは、データベースからリストを返します。

protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException 
    {
        List<Users> arrUserList = new ArrayList<Users>();

        Users objUser = new Users();
        arrUserList   = objUser.listUsers();

        for(Users Userobj : arrUserList)
        {
            System.out.println(Userobj.getUserId());
        }

        request.setAttribute("arrUserDetails", arrUserList);

        RequestDispatcher rst = request.getRequestDispatcher("ListUsers.jsp");
        rst.forward(request, response);
    }

UserId を表示する上に for ループで UserId の値を出力すると、JSP ページに表示されません。

<%@ page  import="com.acme.users.Users"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>

<c:forEach items="${arrUserDetails}" var="account">
<tr>
      <td>
         <c:out value="${account.UserId}" />
      </td>
    </tr>
</c:forEach>

javax.el.PropertyNotFoundExceptionを表示しています。例外のスタックをチェックし、Bean 名とゲッター メソッドが同じであることを確認しましたが、それでもエラーが表示されます。

コンソールのメッセージは次のとおりです

Feb 16, 2013 2:44:19 PM org.apache.catalina.core.ApplicationDispatcher invoke
SEVERE: Servlet.service() for servlet jsp threw exception
javax.el.PropertyNotFoundException: Property 'UserId' not found on type com.acme.users.Users
    at javax.el.BeanELResolver$BeanProperties.get(BeanELResolver.java:223)
    at javax.el.BeanELResolver$BeanProperties.access$400(BeanELResolver.java:200)
    at javax.el.BeanELResolver.property(BeanELResolver.java:311)
    at javax.el.BeanELResolver.getValue(BeanELResolver.java:85)
    at javax.el.CompositeELResolver.getValue(CompositeELResolver.java:67)
    at org.apache.el.parser.AstValue.getValue(AstValue.java:169)
    at org.apache.el.ValueExpressionImpl.getValue(ValueExpressionImpl.java:189)
    at org.apache.jasper.runtime.PageContextImpl.proprietaryEvaluate(PageContextImpl.java:985)
    at org.apache.jsp.ListUsers_jsp._jspx_meth_c_005fout_005f0(ListUsers_jsp.java:170)
    at org.apache.jsp.ListUsers_jsp._jspx_meth_c_005fforEach_005f0(ListUsers_jsp.java:124)
    at org.apache.jsp.ListUsers_jsp._jspService(ListUsers_jsp.java:84)
    at org.apache.jasper.runtime.HttpJspBase.service(HttpJspBase.java:70)
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:722)
    at org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:419)
    at org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:391)
    at org.apache.jasper.servlet.JspServlet.service(JspServlet.java:334)
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:722)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:304)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210)
    at org.apache.catalina.core.ApplicationDispatcher.invoke(ApplicationDispatcher.java:684)
    at org.apache.catalina.core.ApplicationDispatcher.processRequest(ApplicationDispatcher.java:471)
    at org.apache.catalina.core.ApplicationDispatcher.doForward(ApplicationDispatcher.java:402)
    at org.apache.catalina.core.ApplicationDispatcher.forward(ApplicationDispatcher.java:329)
    at com.acme.users.ListUsers.doGet(ListUsers.java:36)
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:621)
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:722)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:304)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210)
    at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:240)
    at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:164)
    at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:462)
    at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:164)
    at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:100)
    at org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:562)
    at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:118)
    at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:395)
    at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:250)
    at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:188)
    at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:166)
    at org.apache.tomcat.util.net.JIoEndpoint$SocketProcessor.run(JIoEndpoint.java:302)
    at java.util.concurrent.ThreadPoolExecutor$Worker.runTask(Unknown Source)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source)

なぜこれが起こるのですか?

4

2 に答える 2

8

フィールドUserIdの名前を使用しています(ちなみに、クラス名と同様に、Java命名規則に違反しています)。dbConnect

JSP はプロパティ(getter と setter)を使用したいと考えています。呼び出そうとしているメソッドは ですgetUserIdが、プロパティ名 (JavaBeans 用語で) はuserId. したがって、コードを次のように変更すると:

 <c:out value="${account.userId}" />

それはうまくいくはずです。また、 just userId、または evenというフィールドを使用するようにクラスを変更する必要がありますid(既にユーザーであることを考えると、その部分は暗黙的です)。

JSP/JSTL/JavaBeans のチュートリアルを確認することをお勧めします。たとえば、メソッドを呼び出すために、それらはすべて小文字で始まるプロパティ名を使用していることに気付くでしょう。${foo.age}getAge()

PropertyDescriptorコンストラクターのドキュメントから(JavaBeans 仕様にも存在します):

getFoo および setFoo アクセサー メソッドを持つことにより、標準の Java 規則に従うプロパティの PropertyDescriptor を構築します。したがって、引数名が「fred」の場合、ライター メソッドは「setFred」であり、リーダー メソッドは「getFred」(ブール型プロパティの場合は「isFred」) であると想定されます。プロパティ名は小文字で始める必要があることに注意してください。これはメソッド名で大文字になります。

(私のものを強調してください。)

機能するメソッド名があるかどうかは明らか${account.UserId}ではありません。ない場合は、エラー メッセージがより明確になる可能性があると主張します。(または、もう少し寛容になるかもしれません。)

追加のポイント:

  • Users単一のユーザーを表しているように見えるときにクラスが呼び出される理由は明らかではありません
  • データベース接続に関係するクラスを拡張する必要があるかどうかは明確ではありません。結局のところ、ユーザーはデータベース接続ではありません。各クラスが 1 つの概念のみを担当するようにするために、もっと努力する必要があると思います。
于 2013-02-16T09:27:12.497 に答える
1

さて、あなたは試してみましたがaccount.userId、うまくいったと思います。

これは、使用account.UserIdするとプロパティが検索され、そのエラーが表示されuserIdないためです。UserId

オブジェクトのプロパティを取得するBeanELResolverの javadocs から

public java.lang.Object getValue(ELContext context,
                                 java.lang.Object base,
                                 java.lang.Object property)

提供されたプロパティ名は、最初に文字列に強制されます。JavaBeans 仕様に従って、プロパティがベース オブジェクトの読み取り可能なプロパティである場合 (これは重要です)、getter 呼び出しの結果を返します。ゲッターが例外をスローすると、呼び出し元に伝播されます。プロパティが見つからないか読み取れない場合は、 aPropertyNotFoundExceptionがスローされます。

JavaBeans 仕様に違反しているため、JavaBeans 仕様に基づいてプロパティを見つけることができないため、その例外がスローされます

于 2013-02-16T09:30:20.167 に答える