2013-02-16 91 views
1

我有一個Java bean類,如下PropertyNotFoundException在JSP頁面

public class Users extends dbConnect 
{ 
    private int UserId; 

    public int getUserId() 
    { 
    return UserId; 
    } 

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

我有一個doGet方法在我的servlet這讓在JSP PAGE電泳ListUsers方法JavaBean類,並顯示該值將返回來自數據庫的列表。

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.But它沒有顯示在我的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名稱和getters方法是相同的,但它仍然顯示錯誤。

在控制檯消息是如下

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) 

爲什麼會出現這種情況?

+0

中有什麼PropertyNotFoundException的*詳細*? – 2013-02-16 09:21:14

+3

嘗試'account.userId' – Abubakkar 2013-02-16 09:21:35

+0

哇這是如何工作可以你張貼答案 – 2013-02-16 09:23:29

回答

6

您使用UserId這是的名稱(違反的Java命名約定,順便說一句 - 一樣dbConnect作爲類名稱)。

JSP想要使用屬性 - 獲取者和設置者。你試圖調用它的方法是getUserId,但屬性名稱(用JavaBeans術語)只是userId。因此,如果您將您的代碼更改爲:

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

它應該工作。你也應該改變你的班級,使用一個名爲userId,甚至id的字段(假設它已經是一個用戶 - 該部分是隱含的)。

這將是值得回顧的JSP/JSTL/JavaBeans教程 - 你會注意到他們所有使用屬性名稱以小寫字母開頭,例如, ${foo.age}來調用getAge()方法。

PropertyDescriptor構造(這也是在JavaBeans規範本)的文檔:

構建方法通過getFoo和setFoo存取方法,爲符合標準Java約定的性質的的PropertyDescriptor。因此,如果參數名稱是「fred」,它將假定writer方法是「setFred」,reader方法是「getFred」(或者是布爾屬性的「isFred」)。 請注意,屬性名稱應以小寫字母開頭,該字符將在方法名稱中大寫。

(重點煤礦。)

目前尚不清楚是否有,將讓${account.UserId}工作的任何方法名 - 如果沒有,那麼我認爲,該錯誤信息可能是更清晰。 (或者它可以更寬容一點。)

其他景點:

  • 目前尚不清楚爲什麼你的類被稱爲Users當它似乎代表單個用戶
  • 目前尚不清楚,它應該延伸其中有什麼關係數據庫中的類連接 - 畢竟,用戶是而不是數據庫連接。我懷疑你應該努力讓每個班級只負責一個概念。
+0

尼斯謝謝噸回覆 – 2013-02-16 09:29:18

+0

@ Jon Skeet,我的解釋是否正確? – Abubakkar 2013-02-16 09:50:46

+0

@Abu:是的,沒關係 - 儘管引用JavaBeans規範會很好。我會編輯我的答案來這樣做。 (我們的答案一起使用...) – 2013-02-16 09:55:33

1

那麼,你已經嘗試account.userId,它的工作我猜。

這是因爲當您使用account.UserId它將搜索屬性userId而不是UserId因此它說錯誤。

BeanELResolver,讓你的javadoc對象屬性

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

所提供的屬性名稱將首先被強制轉換爲字符串。如果 屬性是基本對象的可讀屬性,按照JavaBeans規範(這很重要),則返回 的getter調用結果。如果getter拋出異常,則傳播給調用者的是 。如果沒有發現財產或者 不可讀,則會拋出PropertyNotFoundException

所以,當你違反了JavaBeans規範,它是不能夠找到基於JavaBeans規範財產,因此它拋出異常

+0

感謝您的回覆謝謝你soo – 2013-02-16 09:55:18