java - 不知道如何迭代 <forEach> 中提供的 "items"

标签 java jstl

我有一个将结果保存在 Controller 中的 bean,并将其传递给 jsp jSTL 标记。我需要使用 JSTL 对其进行迭代并呈现结果。我从两个不同的表“用户”和“地址”中获取列表。然后迭代它,这给了我正确的输出,但是当我使用 JSTL 访问同一个对象时,它会抛出异常。请看一下,如果我需要添加任何其他内容,请告诉我。

DAO 类:

String queryString_user = "from User u where u.username = :username";

Query query = session.createQuery(queryString_user).setParameter("username", user);
List<User> userDetails= query.list();

bean 正在从两个表获取数据

  1. 用户(普通 pojo)
  2. 地址(普通 pojo)

用户.java

package com.application.walker.service;

import javax.persistence.Entity;

/**
 * User generated by hbm2java
 */
@Entity
public class User implements java.io.Serializable {

    /**
     * 
     */
    private static final long serialVersionUID = 1L;
    private Integer id;
    private Address address;
    private String firstName;
    private String lastName;
    private String username;
    private String dob;
    private String emailAddress;
    private Creditcard creditcard;

    public User() {
    }

    public User(Address address, String username, String emailAddress) {
        this.address = address;
        this.username = username;
        this.emailAddress = emailAddress;
    }

    public User(Address address, String firstName, String lastName,
            String username, String dob, String emailAddress,
            Creditcard creditcard) {
        this.address = address;
        this.firstName = firstName;
        this.lastName = lastName;
        this.username = username;
        this.dob = dob;
        this.emailAddress = emailAddress;
        this.creditcard = creditcard;
    }

    public Integer getId() {
        return this.id;
    }

    public void setId(Integer id) {
        this.id = id;
    }

    public Address getAddress() {
        return this.address;
    }

    public void setAddress(Address address) {
        this.address = address;
    }

    public String getFirstName() {
        return this.firstName;
    }

    public void setFirstName(String firstName) {
        this.firstName = firstName;
    }

    public String getLastName() {
        return this.lastName;
    }

    public void setLastName(String lastName) {
        this.lastName = lastName;
    }

    public String getUsername() {
        return this.username;
    }

    public void setUsername(String username) {
        this.username = username;
    }

    public String getDob() {
        return this.dob;
    }

    public void setDob(String dob) {
        this.dob = dob;
    }

    public String getEmailAddress() {
        return this.emailAddress;
    }

    public void setEmailAddress(String emailAddress) {
        this.emailAddress = emailAddress;
    }

    public Creditcard getCreditcard() {
        return this.creditcard;
    }

    public void setCreditcard(Creditcard creditcard) {
        this.creditcard = creditcard;
    }

}

地址.Java

package com.application.walker.service;

import java.util.HashSet;
import java.util.Set;

/**
 * Address generated by hbm2java
 */
public class Address implements java.io.Serializable {

    /**
     * 
     */
    private static final long serialVersionUID = 1L;
    private Integer id;
    private String addressLine1;
    private String addressLine2;
    private String addressLine3;
    private String city;
    private String state;
    private Integer zipcode;
    private Set users = new HashSet(0);

    public Address() {
    }

    public Address(String addressLine1, String addressLine2,
            String addressLine3, String city, String state, Integer zipcode,
            Set users) {
        this.addressLine1 = addressLine1;
        this.addressLine2 = addressLine2;
        this.addressLine3 = addressLine3;
        this.city = city;
        this.state = state;
        this.zipcode = zipcode;
        this.users = users;
    }

    public Integer getId() {
        return this.id;
    }

    public void setId(Integer id) {
        this.id = id;
    }

    public String getAddressLine1() {
        return this.addressLine1;
    }

    public void setAddressLine1(String addressLine1) {
        this.addressLine1 = addressLine1;
    }

    public String getAddressLine2() {
        return this.addressLine2;
    }

    public void setAddressLine2(String addressLine2) {
        this.addressLine2 = addressLine2;
    }

    public String getAddressLine3() {
        return this.addressLine3;
    }

    public void setAddressLine3(String addressLine3) {
        this.addressLine3 = addressLine3;
    }

    public String getCity() {
        return this.city;
    }

    public void setCity(String city) {
        this.city = city;
    }

    public String getState() {
        return this.state;
    }

    public void setState(String state) {
        this.state = state;
    }

    public Integer getZipcode() {
        return this.zipcode;
    }

    public void setZipcode(Integer zipcode) {
        this.zipcode = zipcode;
    }

    public Set getUsers() {
        return this.users;
    }

    public void setUsers(Set users) {
        this.users = users;
    }

}

Spring Controller 类

@RequestMapping(value= "/userinformation",params = "userinfo",method=RequestMethod.POST)
    private ModelAndView retrieveInformation(@RequestParam String username, HttpServletRequest request,HttpServletResponse response) throws ServletException, IOException{
        User user = new User();
        ModelAndView model = new ModelAndView();
        getWalkerDaoOperations().updateUser(user);
        List user_records =getWalkerService().retireveUserbyUserName(username);

        if(!(user_records.isEmpty())){
        model.addObject("user_records", user_records);
        model.setViewName("userinformation");

        request.setAttribute("user_records", user_records);
        RequestDispatcher requestDispatcher = request.getRequestDispatcher("userinformation.jsp");
        requestDispatcher.forward(request, response);

        //System.out.println(requestDispatcher);

        }else{
            String message = "user does not exists";
            model.addObject("message", message);
            model.setViewName("searchuser");
        }
        return model;
    }

JSP:

<c:forEach var="user_records" items="${user_records}">

                                <tr>
                                    <td><c:out value="${user_records.firstName}"></c:out></td>
                                    <td><c:out value="${user_records.lastName}"></c:out></td>
                                    <td><c:out value="${user_records.username}"></c:out></td>
                                    <td><c:out value="${user_records.emailAddress}"></c:out></td>
                                    <td><c:out value="${user_records.dob}"></c:out></td>


                            <c:forEach var="user_records_address" items="${user_records.address}">
                                    <td><c:out value="${user_records_address.addressLine1}"></c:out></td>
                                    <%-- <td><c:out value="${user_records_address.addressLine2}"></c:out></td>
                                    <td><c:out value="${user_records_address.addressLine3}"></c:out></td>
                                    <td><c:out value="${user_records_address.city}"></c:out></td>
                                    <td><c:out value="${user_records_address.state}"></c:out></td> --%>
                            </c:forEach> 

                                </tr>


                            </c:forEach>

但它引发了以下异常:请让我知道我需要进行哪些更改。过去两天我一直被这个问题困扰。提前致谢

SEVERE: Servlet.service() for servlet [walker] in context with path [/walker] threw exception [An exception occurred processing JSP page /userinformation.jsp at line 40

37:                                     <td><c:out value="${user_records.dob}"></c:out></td>
38:                                 
39:                             
40:                             <c:forEach var="user_records_address" items="${user_records.address}">
41:                                     <td><c:out value="${user_records_address.addressLine1}"></c:out></td>
42:                                     <%-- <td><c:out value="${user_records_address.addressLine2}"></c:out></td>
43:                                     <td><c:out value="${user_records_address.addressLine3}"></c:out></td>


Stacktrace:] with root cause
javax.servlet.jsp.JspTagException: Don't know how to iterate over supplied "items" in &lt;forEach&gt;
    at org.apache.taglibs.standard.tag.common.core.ForEachSupport.toForEachIterator(ForEachSupport.java:274)
    at org.apache.taglibs.standard.tag.common.core.ForEachSupport.supportedTypeForEachIterator(ForEachSupport.java:238)
    at org.apache.taglibs.standard.tag.common.core.ForEachSupport.prepare(ForEachSupport.java:155)
    at javax.servlet.jsp.jstl.core.LoopTagSupport.doStartTag(LoopTagSupport.java:256)
    at org.apache.jsp.userinformation_jsp._jspx_meth_c_005fforEach_005f1(userinformation_jsp.java:345)
    at org.apache.jsp.userinformation_jsp._jspx_meth_c_005fforEach_005f0(userinformation_jsp.java:209)
    at org.apache.jsp.userinformation_jsp._jspx_meth_form_005fform_005f0(userinformation_jsp.java:140)
    at org.apache.jsp.userinformation_jsp._jspService(userinformation_jsp.java:87)
    at org.apache.jasper.runtime.HttpJspBase.service(HttpJspBase.java:70)
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:728)
    at org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:432)
    at org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:390)
    at org.apache.jasper.servlet.JspServlet.service(JspServlet.java:334)
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:728)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:305)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210)
    at org.apache.catalina.core.ApplicationDispatcher.invoke(ApplicationDispatcher.java:749)
    at org.apache.catalina.core.ApplicationDispatcher.processRequest(ApplicationDispatcher.java:487)
    at org.apache.catalina.core.ApplicationDispatcher.doForward(ApplicationDispatcher.java:412)
    at org.apache.catalina.core.ApplicationDispatcher.forward(ApplicationDispatcher.java:339)
    at com.application.walker.controller.LoginController.retrieveInformation(LoginController.java:84)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
    at java.lang.reflect.Method.invoke(Method.java:597)
    at org.springframework.web.bind.annotation.support.HandlerMethodInvoker.invokeHandlerMethod(HandlerMethodInvoker.java:176)
    at org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter.invokeHandlerMethod(AnnotationMethodHandlerAdapter.java:426)
    at org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter.handle(AnnotationMethodHandlerAdapter.java:414)
    at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:790)
    at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:719)
    at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:644)
    at org.springframework.web.servlet.FrameworkServlet.doPost(FrameworkServlet.java:560)
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:647)
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:728)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:305)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210)
    at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:222)
    at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:123)
    at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:502)
    at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:171)
    at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:100)
    at org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:953)
    at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:118)
    at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:408)
    at org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:1041)
    at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:603)
    at org.apache.tomcat.util.net.JIoEndpoint$SocketProcessor.run(JIoEndpoint.java:310)
    at java.util.concurrent.ThreadPoolExecutor$Worker.runTask(ThreadPoolExecutor.java:895)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:918)
    at java.lang.Thread.run(Thread.java:695)

最佳答案

Address 不是 Iterable,因此不能用作 forEach 标记中的 Collection。你可以这样做

<c:forEach var="user_record" items="${user_records}">
   <td>${user_record.firstName}></td>
   <td>${user_record.lastName}></td>
   <td>${user_record.address.addressLine1}></td>
   <td>${user_record.address.addressLine2}></td>
   <td>${user_record.address.addressLine3}></td>
   ...
</c:forEach>

关于java - 不知道如何迭代 <forEach> 中提供的 "items",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27344151/

相关文章:

java - 如何在同一个jsp页面中使用scriptlet中定义的变量

java - Scala Actor 效率低下问题

java - 管理 Junit 测试的测试数据

java - Android - 如何通过第三方应用程序以编程方式更改系统的日期和时间?

java - 对两个非空字段添加唯一约束

java - 如何在输出之前在 JSTL 循环内的对象上调用外部库函数?

java - 从表单中的 JSTL 部分检索参数

java - 在 JSP 中使用 Integer 键访问 HashMap<Long,String> 不再有效

tomcat - 让 JSTL 与 Tomcat 一起工作

java - 为什么我应该使用通用类而不是特定类