2013-02-16 5 views
1

У меня есть класс боба Java, как показано нижеPropertyNotFoundException в JSP Page

public class Users extends dbConnect 
{ 
    private int UserId; 

    public int getUserId() 
    { 
    return UserId; 
    } 

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

У меня есть метод doGet Мой сервлета, который получит значение в бина классе и показывает в методе JSP page.The 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 в цикл выше его отображения 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. Я проверил стек для исключения и убедился, что имя компонента и метод 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? –

+3

try 'account.userId' – Abubakkar

+0

Wow Как это работает Может ли отправить сообщение ответ –

ответ

6

Вы используете UserId, который является именем поля (и который нарушает Java именования, кстати - как это делает dbConnect как имя класса).

JSP хочет использовать Недвижимость - геттеры и сеттеры. Метод, который вы пытаетесь получить, это getUserId, но имя свойства (в терминах JavaBeans) равно userId. Поэтому, если вы измените свой код на:

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

он должен работать. Вы также должны изменить свой класс, чтобы использовать поле, называемое только userId, или даже id (учитывая, что это уже пользователь - эта часть неявная).

Было бы полезно ознакомиться с учебниками JSP/JSTL/JavaBeans - вы заметите, что они все используют имена свойств, начиная с буквы нижнего регистра, например. ${foo.age} для вызова метода getAge().

Из документации для PropertyDescriptor конструктора (который также присутствует в спецификации JavaBeans):

конструирует PropertyDescriptor для свойства, которое соответствует стандарту Java конвенции, имея getFoo и методы setFoo аксессоры. Таким образом, если имя аргумента является «fred», предполагается, что метод записи «setFred», а метод чтения - «getFred» (или «isFred» для логического свойства). Обратите внимание, что имя свойства должно начинаться с символа нижнего регистра, который будет заглавный в именах методов.

(выделено мной.)

Это не ясно, будет ли там любое имя метода, который позволил бы ${account.UserId} работы - если нет, то я бы поспорил, что сообщение об ошибке может быть много яснее. (Или это может быть немного более прощающим.)

Дополнительные пункты:

  • Не ясно, почему ваш класс называется Users, когда он появляется, чтобы представить отдельному пользователю
  • Это не ясно, что он должен расширить класс, который не имеет ничего общего с базой данных соединения - пользователь не соединение базы данных, в конце концов. Я подозреваю, что вы должны стараться сделать каждый класс ответственным только за одну концепцию.
+0

Ницца Спасибо Тон за ответ –

+0

@ Джон Скит, это мое объяснение правильно? – Abubakkar

+0

@Abu: Да, все в порядке - было бы хорошо процитировать спецификацию JavaBeans. Я отредактирую свой ответ, чтобы сделать это. (Наши ответы полезны вместе ...) –

1

Ну, вы пробовали account.userId, и это сработало, я думаю.

Это потому что, когда вы используете account.UserId, он будет искать недвижимость userId, а не UserId, следовательно, это говорит об ошибке.

Из Javadocs из BeanELResolver, которая получает вас объекты собственности

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

Предоставленное имя свойства сначала будет приведено к String. Если свойство является читаемым свойством базового объекта, в соответствии с спецификацией JavaBeans(это важно), то возвращаем результат вызова getter. Если получатель выбрасывает исключение, то передается вызывающему абоненту. Если свойство не найдено или не является , то считывается PropertyNotFoundException.

Так как вы нарушаете спецификацию JavaBeans, она не может найти недвижимость, основанный на спецификации JavaBeans и, следовательно, он бросает это исключение

+0

Спасибо за ответ Спасибо, очень много –

Смежные вопросы