• 締切済み

<forEach> 内で供給された "items" を反復処理する方法が不明です

JSP、servletを実行すると 以下のエラーメッセージが 表示されてしまいます。 ---------------------------------- javax.servlet.jsp.JspTagException: <forEach> 内で供給された "items" を反復処理する方法が不明です ---------------------------------- ファイル構成は以下になります。 アプリケーションルート\WEB-INF\classes\Rssdata.java ---------------------------------- public class Rssdata{//データ格納用クラス public String[] title = new String[20]; public String[] link = new String[20]; public String[] day = new String[20]; } ---------------------------------- アプリケーションルート\WEB-INF\classes\RssOriginal.java ---------------------------------- import java.io.IOException; import java.net.URL; import java.util.HashMap; import java.util.List; import java.util.*; import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import com.sun.syndication.feed.synd.SyndEntry; import com.sun.syndication.feed.synd.SyndFeed; import com.sun.syndication.fetcher.FeedFetcher; import com.sun.syndication.fetcher.impl.HttpURLFeedFetcher; public class RssOriginal extends HttpServlet { private static final String URL= "http://hoge.net/index20.rdf"; public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { FeedFetcher ff = new HttpURLFeedFetcher(); SyndFeed feed=null; int i = 0;//for文用変数 Rssdata rssdata = new Rssdata();//rssデータ格納用クラス try { feed = ff.retrieveFeed(new URL(URL)); } catch (Exception e) { throw new ServletException(e); } Calendar cal = new GregorianCalendar(); for(SyndEntry entry : (List<SyndEntry>)feed.getEntries()){ entry.getPublishedDate(); rssdata.day[i] = cal.get(Calendar.YEAR) + "/" + (cal.get(Calendar.MONTH) + 1) + "/" + cal.get(Calendar.DAY_OF_MONTH); rssdata.link[i] = entry.getLink(); rssdata.title[i] = entry.getTitle(); /* System.out.println(rssdata.day[i]); System.out.println(rssdata.link[i]); System.out.println(rssdata.title[i]); System.out.println(); */ i++; } request.setAttribute("feed", rssdata); this.getServletContext().getRequestDispatcher("/chap4/rss/index.jsp").forward(request,response); } } ---------------------------------- アプリケーションルート\chap4\rss\index.jsp ---------------------------------- <html> <head> <title>RSS情報の展開</title> </head> <body> <h1 style="color:white;background-color:#525D76;font-size:22px;"> RSS情報の展開</h1> <ul> <c:forEach var="item" items="${requestScope['feed']}"> <li><a href="${item['link']}">${item['title']}</a></li> </c:forEach> </ul> </body> </html> ---------------------------------- またこちらのページなど検索で色々調べましたが http://kamakura.cool.ne.jp/oppama/ssja/taglibs-core.html 理屈はなんとなくイメージできるのですが 具体的な解決方法がわかりませんでした。 宜しくお願い致します。

みんなの回答

回答No.1

itemsで指定してる「${requestScope['feed']}」がコレクションではないからではないですか? forEachって、コレクションの各要素に対して、何らかの処理をするものだと思うので、rssdata自身がコレクションで、その中の各要素がtitleやらlinkやらを保持している形でなければならないと思います。

yanagiman2
質問者

お礼

ご回答ありがとうございます。 >itemsで指定してる「${requestScope['feed']}」が >コレクションではないからではないですか? なるほど。forEachはコレクションに対してのものだったのですね。 import java.util.HashMap; ソースの↑この部分で、すでにご存知かもしれませんが このサンプル実はもともとHashMapを使用したもので (HashMapはコレクションだったんですね。 本やサイト見てるのですが、HashMapがなんなのか 根本理解できていません。) HashMapはキーと値の2つの要素しか保持できないため クラスにして値を保持させることにしました。 コレクションで値を3種類保持できるものか クラスの要素を順番に読み込めるjspのアクションタグ がわかれば解決できると思うのですが どのようなキーワードで検索すればよいかがわかりません。 参考になる検索キーワード、サイト、本など ありましたらご教授願いたく思います。