2013-02-16 4 views
1

나는 JSP page.The ListUsers 방법에 자바 빈즈 클래스와 쇼의 값을 얻을 내가 내 서블릿에서의 doGet 방법이PropertyNotFoundException 페이지

public class Users extends dbConnect 
{ 
    private int UserId; 

    public int getUserId() 
    { 
    return UserId; 
    } 

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

다음과 같은 자바 빈 클래스가 반환하는 것입니다 데이터베이스의 목록.

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); 
    } 

나는 그 내 JSP 페이지에 표시하기이 아닌 UserId.But 그것의 표시 위의 루프에서 사용자 아이디의 값을 출력합니다. javax.el.PropertyNotFoundException 표시

<%@ 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> 

그것. 예외에 대한 스택을 검사하고 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) 

다음과 같이인가? 당신은 필드의 이름입니다 UserId을 사용하고

+0

PropertyNotFoundException의 * 세부 사항 *은 무엇입니까 던졌습니다? –

+3

시도'account.userId' – Abubakkar

+0

와우 어떻게 작동합니까 대답 –

답변

6

(그건 그렇고, 명명 규칙 자바 위반 - 클래스 이름으로 dbConnect을처럼).

JSP는 속성 인 - getters와 setters를 사용하려고합니다. 전화를 걸려는 메소드는 getUserId이지만 속성 이름 (JavaBeans 용어)은 userId입니다. 따라서 코드를 다음과 같이 변경하면

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

으로 변경해야합니다. 또한 userId 또는 심지어 id이라는 필드를 사용하도록 클래스를 변경해야합니다 (이미 사용자인데 - 해당 부분이 암시적임).

JSP/JSTL/JavaBeans 자습서를 검토해 볼 가치가 있습니다. 모두은 소문자로 시작하는 속성 이름을 사용합니다. ${foo.age}을 호출하여 getAge() 메서드를 호출합니다. (또한 자바빈 명세에 존재) PropertyDescriptor 생성자 문서에서

:

구축해 getFoo 및 setFoo를 사용해 액세서 메소드를 갖는, 표준 Java 규칙에 준거하고있는 프로퍼티의 PropertyDescriptor. 따라서 인수 이름이 "fred"인 경우 작성기 메소드가 "setFred"이고 판독기 메소드가 "getFred"(또는 부울 등록 정보의 경우 "isFred")라고 가정합니다. 속성 이름은 소문자로 시작해야하며 메서드 이름에 대문자로 표시되어야합니다.

(강조 광산.) 그것은 ${account.UserId} 작업을 할 것 어떤 메소드 이름이인지 분명하지 않다

- 존재하지 않는 경우, 그때는 오류 메시지가 될 수 있다고 주장하는 것 훨씬 더 명확 해. (또는 조금 더 관대 할 수도 있습니다.)

추가 포인트 :

  • 그것의 명확하지가 단일 사용자 그것이 데이터베이스와는 아무 상관이있는 클래스를 확장해야한다고 명확하지 않다
  • 을 나타 내기 위해 표시 할 때 클래스는 Users라고하는 이유 연결 - 사용자는 이 아니며 결국 데이터베이스 연결입니다. 나는 당신이 각 개념을 하나의 개념에 대해서만 책임지게하기 위해 열심히 노력해야한다고 생각합니다.
+0

니스 덕분에 대답을위한 톤 –

+0

@ Jon Skeet, 제 설명이 맞습니까? – Abubakkar

+0

@Abu : 네, JavaBeans 스펙을 인용하는 것이 좋습니다. 나는 그 대답을 편집 할 것입니다. (우리의 대답은 함께 유용합니다 ...) –

1

글쎄, 당신은 account.userId을 시도해 보았습니다. 을 사용하면 userId이 아닌 UserId이 아닌 속성을 검색하므로 오류가 발생하기 때문입니다. 당신이 얻을 수 BeanELResolver의의 javadoc에서

속성

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

제공되는 속성 이름이 먼저 문자열로 강제 변환됩니다에게 객체. 속성이 기본 객체의 읽을 수있는 속성 인 경우 JavaBeans 사양 (중요 함)의 경우 getter 호출 결과 을 반환합니다. getter가 예외를 throw하면 이 호출자에게 전파됩니다. 속성을 찾을 수 없거나 을 읽을 수없는 경우 PropertyNotFoundException이 발생합니다. 당신은 자바 빈즈 사양을 위반하고 같은

그래서, 자바 빈즈 사양을 기반으로 속성을 찾을 수 없습니다 따라서 그것은 그 예외

+0

감사합니다. –