• 締切済み

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

  • Java
  • 回答数1
  • ありがとう数2

みんなの回答

回答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のアクションタグ がわかれば解決できると思うのですが どのようなキーワードで検索すればよいかがわかりません。 参考になる検索キーワード、サイト、本など ありましたらご教授願いたく思います。

関連するQ&A

  • getServletConfig()でのコンパイルエラー

    以下のソースでコンパイルエラーが出てしまいます。 ソースが汚くて申し訳ないです。 ------------------------------------------------ package to.msn.wings.chap4; import java.io.IOException; import java.net.URL; import java.util.List; import java.util.*; import java.io.*; import javax.servlet.*; import javax.servlet.http.*; 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; import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import javax.servlet.GenericServlet; class Rssdata{//データ格納用クラス String[] title = new String[20]; String[] link = new String[20]; String[] day = new String[20]; } public class RssOriginal { // フィードのURL private static final String[] FEED_URLS = { "http://honyarara/index20.rdf", }; public void doGet(HttpServletRequest request, HttpServletResponse response) throws Exception, ServletException, IOException { int i = 0;//for文用変数 Rssdata rssdata = new Rssdata();//rssデータ格納用クラス // HTTPを元にフィードを取得するクラス「FeedFetcher」 ………(1) FeedFetcher fetcher = new HttpURLFeedFetcher(); // フィードの内容、フィードに含まれる記事エントリの内容を出力する for (String url : FEED_URLS) { // フィードの取得 ………(2) SyndFeed feed = fetcher.retrieveFeed(new URL(url)); 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(); i++; } } request.setAttribute("feed", rssdata); getServletConfig().getServletContext().getRequestDispatcher("/chap4/rss/index.jsp").forward(request,response); } } ------------------------------------------------ ------------------------------------------------ エラー内容 RssOriginal.java:75: シンボルを見つけられません。 シンボル: メソッド getServletConfig() 場所 : to.msn.wings.chap4.RssOriginal の クラス getServletConfig().getServletContext().getRequestDispatcher("/ch ap4/rss/index.jsp").forward(request,response); ------------------------------------------------ どなたか解決方法がわかりましたら教えてください。

    • ベストアンサー
    • Java
  • servletに自作パッケージを読ませるには

    以下のようなソースがあり 実行するとエラーになります。 rssoriginal.java -------------------------------------- package to.msn.wings.chap4; 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; class Rssdata{//データ格納用クラス String[] title = new String[20]; String[] link = new String[20]; String[] day = new String[20]; } public class RssOriginal extends HttpServlet { private static final String URL= "http://dtm-web-etc.seesaa.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); } } -------------------------------------- エラーメッセージ -------------------------------------- 説明 The requested resource () is not available. -------------------------------------- ↓この部分がおかしいのかと思いパッケージ化し アプリケーションルート\\WEB-INF\libに配置しました。 Rssdata.class -------------------------------------- package rssdata; //↓この部分 class Rssdata{//データ格納用クラス String[] title = new String[20]; String[] link = new String[20]; String[] day = new String[20]; } -------------------------------------- そしてrssoriginal.javaにて -------------------------------------- import Rssdata.*; -------------------------------------- とすると見事にRssdata関連の パッケージ・シンボルは見つけられませんと出ます。 (コンパイル時) サーブレットで上記のようなことをするには どうしたらよいでしょうか? ご教授頂ければ幸いです。

    • ベストアンサー
    • Java
  • tomcat上のservletからapache上のhtmlへ

    現在tomcatにrss.java(コンパイル後class) と言うファイルがあります。 rss.java ------------------------------------------- package to.msn.wings.chap4; import java.io.IOException; import java.net.URL; import java.util.HashMap; import java.util.List; 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 RssParse extends HttpServlet { private static final String URL= "http://honyararahonyarara/index20.rdf"; public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { FeedFetcher ff = new HttpURLFeedFetcher(); SyndFeed feed=null; try { feed = ff.retrieveFeed(new URL(URL)); } catch (Exception e) { throw new ServletException(e); } HashMap<String, String> map = new HashMap<String,String>(); for(SyndEntry entry : (List<SyndEntry>)feed.getEntries()){ map.put(entry.getTitle(), entry.getLink()); } request.setAttribute("feed", map); this.getServletContext().getRequestDispatcher("http://localhost/html/rss.html").forward(request,response); } } ------------------------------------------- またapache上にrss.htmlと言うファイルがあります。 rss.html ------------------------------------------- <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['value']}">${item['key']}</a></li> </c:forEach> </ul> </body> </html> ------------------------------------------- tomcat上のservletからapache上のhtmlに値を渡し 表示させたいのですがうまくいきません。 お心当たりある方がいらっしゃいましたら 書込みをお願い致します。

    • ベストアンサー
    • Java
  • コンパイルエラー

    過去ログも参考にしたのですが、解決しませんでしたので、よろしくお願いします!! コンパイルすると、下のエラーが出てしまいます。 どこかへのクラスパスが足りないのかな?とは思うのですが、一体どこへ?(T△T) パッケージ com.sun.odi.tree は存在しません。 import com.sun.xml.tree.*; --code-- import java.io.*; import java.util.*; import javax.servlet.*; import javax.servlet.http.*; import org.w3c.dom.*; import com.sun.xml.tree.*; -------- [Win2k,tomcat4.0.6,J2sdk1.4.1]です。

  • Servletが動かない

    下記のようなサーブレットを作成し、web.xmlも記述して動かしてみようとしたところ下記のようなエラーが発生して動きません。(Win2000、Tomcat4.1) ~~~HelloWorldServlet.java package test_servlet; import java.io.IOException; import java.io.PrintWriter; import javax.servlet.ServletException; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; public class HelloWorldServlet { public void doGet(HttpServletRequest req, HttpServletResponse res) throws ServletException, IOException { res.setContentType("text/html; charset=Shift_JIS"); PrintWriter out = res.getWriter(); out.println("<html>"); out.println("<head>"); out.println("</head>"); out.println("<body>"); for (int i = 1; i <= 10; i++) { out.println("Hello World" + Integer.toString(i)); } out.println("</body>"); out.println("</html>"); } } ~~~web.xml <?xml version="1.0" encoding="Shift_JIS"?> <!DOCTYPE web-app PUBLIC "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN" "http://java.sun.com/dtd/web-app_2_3.dtd"> <web-app> <servlet> <servlet-name>HellowWorld</servlet-name> <servlet-class>test_servlet.HelloWorldServlet</servlet-class> </servlet> <servlet-mapping> <servlet-name>HellowWorld</servlet-name> <url-pattern>/hello/*</url-pattern> </servlet-mapping> </web-app> ~~~http://localhost:8080/hello接続時のスタック javax.servlet.ServletException: クラス test_servlet.HelloWorldServlet はサーブレットではありません

    • ベストアンサー
    • Java
  • はじめてのjavaのソース解析

    C言語をかじっていたので、javaのソース解析を命じられ、import文の宣言を調査しているのですが、以下のものがなかなかうまくいきません。意味合いが判明すれば理解出来ると思います。 調べ方や意味合いを知っている方、ぜひ教えて下さい。 import com.sun.rave.web.ui.appbase.AbstractPageBean; import com.sun.webui.jsf.component.PasswordField; import com.sun.webui.jsf.component.StaticText; import com.sun.webui.jsf.component.TextField; import javax.faces.FacesException; import javax.faces.context.FacesContext; import javax.servlet.http.HttpServletResponse;

  • setAttribute(String, int)は適用できない

    setAttribute(String, int)は適用できない 今、servletでセッションの勉強をしています。 ある本に載っているソースコードをそのままコピーしたんですが、 「HttpSessionのメソッド setAttribute(String, Object)は(String, int)に適用できません。」 …というエラーが出て動きません。 こういう場合、実行するにはどうしたら良いのでしょうか? アクセスした回数をカウントすることなんてよくあると思うんです。 intも(Stringなんかも)Objectの下に含まれてるんじゃないんですか? intでも良い気がするんですけど…。 一応、ソースコードを貼っておきます: ### Sample229TestServlet.java ### package com.tips; import java.io.IOException; import java.io.PrintWriter; import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import javax.servlet.http.HttpSession; public class Sample228TestServlet extends HttpServlet { /** * */ private static final long serialVersionUID = 1L; private int count = 0; public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { response.setContentType("text/html;charset=Shift_JIS"); PrintWriter out = response.getWriter(); HttpSession session = request.getSession(); session.setAttribute("param",count++); //問題の箇所 out.println("<html><head><title>Sample228</title></head><body>"); out.println("<h2>SessionAttributeListenerの例</h2>"); out.println("sessionの属性countが" + count + "に変化しました。"); out.println("</body></html>"); out.close(); } } ### Sample228.java ### package com.tips; import javax.servlet.ServletContext; import javax.servlet.http.HttpSessionAttributeListener; import javax.servlet.http.HttpSessionBindingEvent; public class Sample228 implements HttpSessionAttributeListener { public void attributeAdded(HttpSessionBindingEvent event) { } public void attributeRemoved(HttpSessionBindingEvent event) { } public void attributeReplaced(HttpSessionBindingEvent event) { ServletContext app = (event.getSession()).getServletContext(); app.log(">> Sample228 Listener detects attribute changed."); } } …必要であれば補足します。では、宜しくお願いします。

    • ベストアンサー
    • Java
  • コンパイルエラー

    JBuiderでコンパイルしようとするとエラーがでてしまいます。ソースは以下の通りです。 import java.io.*; import javax.servlet.*; import javax.servlet.http.*; public class TestServlet extends HttpServlet { public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { HttpSession session = request.getSession(); Integer count=(Integer)session.getAttribute("count"); if(count == null){  count = new Integer(0); }else{  count = new Integer(count.intValue()+1); } session.setAttribute("count",count); response.setContentType("text/html; charset=Shift_JIS"); PrintWriter out= response.getWriter(); out.println("<html>"); out.println("<head><title>TestServlet</title></head>"); out.println("<body>"); out.println(session.getId()); out.println("<p>\"count\"という名前のattribute = " + count +"</p>"); out.println("</body></html>"); out.close(); } } これをコンパイルすると、 "TestServlet.java": エラー #: 300 : メソッド getAttribute(java.lang.String) が見つかりません: インターフェース javax.servlet.http.HttpSession 行 9, 列 36 "TestServlet.java": エラー #: 300 : メソッド setAttribute(java.lang.String, java.lang.Integer) が見つかりません: インターフェース javax.servlet.http.HttpSession 行 15, 列 13 というメッセージがでます。何が原因なのか教えてください。

  • テキストファイルの中身をAppletに常に表示

    お世話になります。 先日、Appletでの外部ファイルを常に同期させる方法をお尋ねしたものです。 それにより、Servletを併用し試行錯誤していたのですが、どうしても行き詰まり再度質問させて頂きました。 Applet内にあるスレッドから常にServletを呼び出し、 Servlet側では呼び出される度にサーバ上にある外部ファイルを読み込み、 その内容をAppletへ送信してAppletではその受け取ったデータを表示する というプログラムを組んでみたのですが、 外部ファイルの中身は表示はされず、コンソールにはIllegalStateExceptionが表示されます。 エラー内容を検索したりもしてみたんですが、うまく理解出来ませんでした。 以下にソースを載せておきますので、もしよろしければご教授お願いします。 ※Servlet側 package com.test; import java.io.BufferedReader; import java.io.DataOutputStream; import java.io.FileReader; import java.io.IOException; import java.io.PrintWriter; import javax.servlet.ServletException; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; public class TestServlet extends javax.servlet.http.HttpServlet implements javax.servlet.Servlet { static final long serialVersionUID = 1L; DataOutputStream dos; String test=null; protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { String checkFile="test.log"; String fn=getServletContext().getRealPath(checkFile); response.setContentType("text/html;charset=Shift_JIS"); PrintWriter out=response.getWriter(); out.println("<html><head></head><body>"); out.println("<applet codebase=\"http://localhost:8080/Test\" code=\"TestApplet.class\" height=\"600\" width=\"800\">"); out.println("</applet>"); out.println("</body></html>"); out.close(); BufferedReader inn = new BufferedReader(new FileReader(fn)); //アプレットへの送信 response.setContentType("application/octet-stream"); dos=new DataOutputStream(response.getOutputStream()); String outPut=inn.readLine(); dos.writeUTF(outPut); dos.flush(); dos.close(); } } ※Applet側 import java.applet.Applet; import java.awt.*; import java.io.*; import java.net.URL; import java.net.URLConnection; public class TestApplet extends Applet implements Runnable{ String inPut; Label l1; public void init() { setSize(200, 100); setLayout(new FlowLayout()); l1 = new Label("Wait"); add(l1); Thread wait; wait = new Thread(this); wait.start(); } @Override public void run() { // TODO Auto-generated method stub try { while(true){ try { //サーブレットへの通信 URL url=new URL(getDocumentBase(),"./Test"); URLConnection conn = url.openConnection(); //play.logの状態取得 DataInputStream in = new DataInputStream(conn.getInputStream()); l1.setText(in.readUTF()); } catch(Exception e) { } Thread.sleep(1000); } } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); } } }

  • JSPからサーブレットを呼び出す際に404エラー

    現在、tomcatとeclipseでサーブレット/JSPの勉強をしています。 参考書に載っている、jspの入力画面で入力した値をサーブレットで受け取り、そのまま表示させるようなサンプルを作成しています。 JSPの入力画面は表示できるのですが、値を入力してサーブレットに移動する際、404エラーが出てしまいます。 ■eclipseのパッケージエクスプローラー basic |-WEB=INF/src |..|input |...|EchoServlet.java |-WEB-INF |..|web.xml |.|echo.jsp (WEB-INF直下に作成) ■echo.jsp内のサーブレットのパスに関する記述 <FORM ACTION="/servlet/EchoServlet"> ■web.xmlの記述 <servlet> <servlet-name>EchoServlet</servlet-name> <servlet-class>input.EchoServlet</servlet-class> </servlet> <servlet-mapping> <servlet-name>EchoServlet</servlet-name> <url-pattern>/servlet/EchoServlet</url-pattern> </servlet-mapping> ■EchoServlet.javaの記述 package input; import java.io.IOException; import java.io.PrintWriter; import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; public class EchoServlet extends HttpServlet { public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { String msg = request.getParameter("message"); response.setContentType("text/plain; charset=Windows-31J"); PrintWriter out = response.getWriter(); out.println("message=" + msg); } } お気づきの点がございましたらご査収の程よろしくお願いいたします。

専門家に質問してみよう