jsp文件无法迭代servlet中的复杂元素

ulydmbyx  于 2021-07-13  发布在  Java
关注(0)|答案(3)|浏览(572)

我正在尝试将一个posts容器从servlet传递到jsp,以便显示该jsp页面上的所有元素。每个元素都有时间、名称和内容属性。但是jsp文件无法迭代这些元素。我该怎么修?
我的课程是:

  1. public class post {
  2. public post(long time, String name, String content) {
  3. super();
  4. this.time = time;
  5. this.name= name;
  6. this.content= content;
  7. }
  8. public String name;
  9. public String content;
  10. public long time;
  11. }

还有一个servlet,我在其中:

  1. post[] messages;
  2. messages = sortMessages(data); // construct array of post
  3. for (int i = 0; i < messages.length; i++) {
  4. request.setAttribute("posts", messages[i]);
  5. }

在jsp文件中,我希望通过以下方式显示所有帖子:

  1. <c:forEach var="post" items="${posts}">
  2. <div class="post">
  3. <h2>${post.name}</h2>
  4. <p>${post.content}</p>
  5. </div>

但是我得到一个错误:

  1. root cause
  2. javax.servlet.ServletException: javax.servlet.jsp.JspTagException: Don't know how to iterate over supplied "items" in &lt;forEach&gt;
  3. org.apache.jasper.runtime.PageContextImpl.doHandlePageException(PageContextImpl.java:909)
  4. org.apache.jasper.runtime.PageContextImpl.handlePageException(PageContextImpl.java:838)
  5. org.apache.jsp.index_jsp._jspService(index_jsp.java:358)
  6. org.apache.jasper.runtime.HttpJspBase.service(HttpJspBase.java:70)
  7. javax.servlet.http.HttpServlet.service(HttpServlet.java:729)
  8. org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:438)
  9. org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:396)
  10. org.apache.jasper.servlet.JspServlet.service(JspServlet.java:340)
  11. javax.servlet.http.HttpServlet.service(HttpServlet.java:729)
  12. org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52)
  13. serv.viewMessages.doGet(viewMessages.java:122)
  14. javax.servlet.http.HttpServlet.service(HttpServlet.java:622)
  15. javax.servlet.http.HttpServlet.service(HttpServlet.java:729)
  16. org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52)
  17. root cause
  18. javax.servlet.jsp.JspTagException: Don't know how to iterate over supplied "items" in &lt;forEach&gt;
  19. org.apache.taglibs.standard.tag.common.core.ForEachSupport.toForEachIterator(ForEachSupport.java:274)
  20. org.apache.taglibs.standard.tag.common.core.ForEachSupport.supportedTypeForEachIterator(ForEachSupport.java:238)
  21. org.apache.taglibs.standard.tag.common.core.ForEachSupport.prepare(ForEachSupport.java:155)
  22. javax.servlet.jsp.jstl.core.LoopTagSupport.doStartTag(LoopTagSupport.java:256)
  23. org.apache.jsp.index_jsp._jspx_meth_c_005fforEach_005f0(index_jsp.java:411)
  24. org.apache.jsp.index_jsp._jspService(index_jsp.java:318)
  25. org.apache.jasper.runtime.HttpJspBase.service(HttpJspBase.java:70)
  26. javax.servlet.http.HttpServlet.service(HttpServlet.java:729)
  27. org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:438)
  28. org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:396)
  29. org.apache.jasper.servlet.JspServlet.service(JspServlet.java:340)
  30. javax.servlet.http.HttpServlet.service(HttpServlet.java:729)
  31. org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52)
  32. serv.viewMessages.doGet(viewMessages.java:122)
  33. javax.servlet.http.HttpServlet.service(HttpServlet.java:622)
  34. javax.servlet.http.HttpServlet.service(HttpServlet.java:729)
  35. org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52)
vnzz0bqm

vnzz0bqm1#

这个 items 的属性 <c:forEach> 期望集合类型对象能够对其进行迭代。但是在servlet中,您设置了 posts 属性的类型 post 对象。而不是设置 posts 属性为 messages[i] 把它调成 messages . 您不需要servlet中的for循环。

  1. post[] messages;
  2. messages = sortMessages(data); // construct array of post
  3. request.setAttribute("posts", messages);

并使您能够打印 post 对象,您需要提供getters方法。

  1. public class post {
  2. public Post(long time, String name, String content) {
  3. super();
  4. this.time = time;
  5. this.name = name;
  6. this.content = content;
  7. }
  8. public String name;
  9. public String content;
  10. public long time;
  11. public String getName() {
  12. return name;
  13. }
  14. public String getContent() {
  15. return content;
  16. }
  17. public long getTime() {
  18. return time;
  19. }
  20. }
展开查看全部
rekjcdws

rekjcdws2#

  1. post[] messages;
  2. messages = sortMessages(data); // construct array of post
  3. for (int i = 0; i < messages.length; i++) {
  4. request.setAttribute("posts", messages[i]);
  5. }

当你在做 request.setAttribute("posts", messages[i]); 在循环中,您只是覆盖上一个值。因此,“post”将只包含for循环中提供的最后一个值。相反,您应该创建一个arraylist并将值保存在arraylist对象中,然后将该对象传递给jsp并在那里使用jstl。

  1. List<String> list = new ArrayList<String>();
  2. for (int i = 0; i < messages.length; i++) {
  3. list.add(messages[i]);
  4. }
  5. request.setAttribute("posts", list);

通过这种方式发送包含所有值的list对象,现在在jsp中,您可以使用此对象通过for循环获取所有值。

  1. <c:forEach var="message" items="${requestScope.posts}">
  2. <c:out value="${message}"/>
  3. </c:forEach>
展开查看全部
0qx6xfy6

0qx6xfy63#

通过以下方式更改它解决了iteratin问题:

  1. request.setAttribute("posts", messages);

但是,我无法访问其字段并获取错误:

  1. Property 'name' not found on type serv.post

相关问题