2016-03-28 21 views
0

サーブレットからjspに投稿コンテナを渡そうとしているので、そのjspページのすべての要素を表示できます。すべての要素には、時間、名前、および内容プロパティがあります。しかし、jspファイルはこれらの要素を反復処理できません。どうすれば修正できますか?Jspファイルが複雑な要素をサーブレットから反復処理できない

私はクラスを持っている:

public class post { 
public post(long time, String name, String content) { 
    super(); 
    this.time = time; 
    this.name= name; 
    this.content= content; 
} 
public String name; 
public String content; 
public long time; 
} 

と私はここでサーブレット:

<c:forEach var="post" items="${posts}"> 
    <div class="post"> 
     <h2>${post.name}</h2> 
<p>${post.content}</p> 
</div> 
:私は以下のすべての記事を表示するJSPファイル内

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

ただし、エラーが発生します。

root cause 
javax.servlet.ServletException: javax.servlet.jsp.JspTagException: Don't know how to iterate over supplied "items" in &lt;forEach&gt; 
org.apache.jasper.runtime.PageContextImpl.doHandlePageException(PageContextImpl.java:909) 
org.apache.jasper.runtime.PageContextImpl.handlePageException(PageContextImpl.java:838) 
org.apache.jsp.index_jsp._jspService(index_jsp.java:358) 
org.apache.jasper.runtime.HttpJspBase.service(HttpJspBase.java:70) 
javax.servlet.http.HttpServlet.service(HttpServlet.java:729) 
org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:438) 
org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:396) 
org.apache.jasper.servlet.JspServlet.service(JspServlet.java:340) 
javax.servlet.http.HttpServlet.service(HttpServlet.java:729) 
org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52) 
serv.viewMessages.doGet(viewMessages.java:122) 
javax.servlet.http.HttpServlet.service(HttpServlet.java:622) 
javax.servlet.http.HttpServlet.service(HttpServlet.java:729) 
org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52) 


root cause 
javax.servlet.jsp.JspTagException: Don't know how to iterate over supplied "items" in &lt;forEach&gt; 
org.apache.taglibs.standard.tag.common.core.ForEachSupport.toForEachIterator(ForEachSupport.java:274) 
org.apache.taglibs.standard.tag.common.core.ForEachSupport.supportedTypeForEachIterator(ForEachSupport.java:238) 
org.apache.taglibs.standard.tag.common.core.ForEachSupport.prepare(ForEachSupport.java:155) 
javax.servlet.jsp.jstl.core.LoopTagSupport.doStartTag(LoopTagSupport.java:256) 
org.apache.jsp.index_jsp._jspx_meth_c_005fforEach_005f0(index_jsp.java:411) 
org.apache.jsp.index_jsp._jspService(index_jsp.java:318) 
org.apache.jasper.runtime.HttpJspBase.service(HttpJspBase.java:70) 
javax.servlet.http.HttpServlet.service(HttpServlet.java:729) 
org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:438) 
org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:396) 
org.apache.jasper.servlet.JspServlet.service(JspServlet.java:340) 
javax.servlet.http.HttpServlet.service(HttpServlet.java:729) 
org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52) 
serv.viewMessages.doGet(viewMessages.java:122) 
javax.servlet.http.HttpServlet.service(HttpServlet.java:622) 
javax.servlet.http.HttpServlet.service(HttpServlet.java:729) 
org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52) 

答えて

1

<c:forEach>items属性以下の方法がiteratin問題を解決し、それを変更

<c:forEach var="message" items="${requestScope.posts}"> 
    <c:out value="${message}"/> 
</c:forEach> 
+0

ありがとう!それを解決した場合 – SuzLy

+0

これが解決すれば答えとしてマークしてください:) –

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

あなたはちょうど前の値をoverwrittingているループでrequest.setAttribute("posts", messages[i]);を行っています。したがって、 "post"には、forループで指定された最後の値のみが含まれます。むしろ、arraylist を作成してarraylistオブジェクトに値を保存し、そのオブジェクトをjspに渡してそこにjstlを使用する必要があります。

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

あなたはすべての値を持つリストオブジェクトを送信している。この方法で、今のjspであなたはforループを経由してすべての値を取得するには、このオブジェクトを使用することができます。私はそのフィールドをアクセスも、エラーを取得することはできませんしかし

request.setAttribute("posts", messages); 

Property 'name' not found on type serv.post 
+0

ありがとうございました。しかし、どのようにしてメッセージの内部フィールドにアクセスできますか? – SuzLy

+0

メッセージとは何ですか?その文字列配列または何か他のですか? –

+0

私はそのクラスのゲッターとセッターがいなくて、ありがとうございました – SuzLy

0

コレクション型オブジェクトがそれを反復できると期待します。しかし、あなたのサーブレットではposts属性をタイプpostのオブジェクトに設定します。 posts属性をmessages[i]に設定する代わりに、messagesに設定するだけです。そしてあなたのサーブレットにfor-loopは必要ありません。

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

そして、あなたはゲッターメソッドを提供する必要があるJSPでpostオブジェクトの属性を印刷することができますします。

public class post { 
    public Post(long time, String name, String content) { 
     super(); 
     this.time = time; 
     this.name = name; 
     this.content = content; 
    } 

    public String name; 
    public String content; 
    public long time; 

    public String getName() { 
     return name; 
    } 

    public String getContent() { 
     return content; 
    } 

    public long getTime() { 
     return time; 
    } 
} 
関連する問題