アプリ版:「スタンプのみでお礼する」機能のリリースについて

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-c …
理屈はなんとなくイメージできるのですが
具体的な解決方法がわかりませんでした。

宜しくお願い致します。

A 回答 (1件)

itemsで指定してる「${requestScope['feed']}」がコレクションではないからではないですか?


forEachって、コレクションの各要素に対して、何らかの処理をするものだと思うので、rssdata自身がコレクションで、その中の各要素がtitleやらlinkやらを保持している形でなければならないと思います。
    • good
    • 0
この回答へのお礼

ご回答ありがとうございます。

>itemsで指定してる「${requestScope['feed']}」が
>コレクションではないからではないですか?
なるほど。forEachはコレクションに対してのものだったのですね。

import java.util.HashMap;
ソースの↑この部分で、すでにご存知かもしれませんが
このサンプル実はもともとHashMapを使用したもので
(HashMapはコレクションだったんですね。
本やサイト見てるのですが、HashMapがなんなのか
根本理解できていません。)
HashMapはキーと値の2つの要素しか保持できないため
クラスにして値を保持させることにしました。

コレクションで値を3種類保持できるものか
クラスの要素を順番に読み込めるjspのアクションタグ
がわかれば解決できると思うのですが
どのようなキーワードで検索すればよいかがわかりません。

参考になる検索キーワード、サイト、本など
ありましたらご教授願いたく思います。

お礼日時:2008/12/27 16:07

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!