2013-06-13 21 views
6

これに似た質問がありましたが、私の問題解決に役立っていないものはありません。基本的には、サーブレットからJSPに変数を渡そうとしています。サーブレットからJSPに変数を渡す

サーブレットコード。

package com.servlets; 

import java.io.IOException; 
import java.util.ArrayList; 

import javax.servlet.annotation.WebServlet; 
import javax.servlet.RequestDispatcher; 
import javax.servlet.ServletException; 
import javax.servlet.http.HttpServlet; 
import javax.servlet.http.HttpServletRequest; 
import javax.servlet.http.HttpServletResponse; 

import com.dao.DataGetter; 

@WebServlet("/DataGetterServlet") 
public class DataGetterServlet extends HttpServlet { 
    private static final long serialVersionUID = 1L; 

    ArrayList<String[]> data; 
    private DataGetter dg; 

    public void init() throws ServletException { 
     try { 
      dg = new DataGetter(); 
      data = dg.getData(); 
     } catch (Exception e) { 
      throw new ServletException("An exception occurred in DataGetterServlet: " 
       + e.getClass().getName()); 
     } 
    } 

    protected void doGet(HttpServletRequest request, HttpServletResponse response) 
     throws ServletException, IOException { 

     request.setAttribute("data", data); 
     RequestDispatcher rd = request.getRequestDispatcher("index.jsp"); 
     rd.forward(request, response); 
    } 
} 

私のJSPコード

<%@ page language="java" contentType="text/html; charset=ISO-8859-1" 
    pageEncoding="ISO-8859-1"%> 
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %> 

<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" 
    "http://www.w3.org/TR/html4/loose.dtd"> 

<html> 
<head> 
    <meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1"> 
    <title>Data extractor</title> 
</head> 

<body> 
    Data table: 

    <table boder="1"> 
     <c:forEach var="item" items="${data}" > 
      <tr> 
       <c:forEach var="column" items="${item}"> 
        <td>${column}</td> 
       </c:forEach> 
      </tr> 
     </c:forEach> 
    </table> 
</body> 
</html> 

私はforEachのタグでいくつかのテストを行っているとJSTLが正しくセットアップされています。私は変数 "データ"がJSPに到達していないと思います。どんな考え?

ありがとうございます。

EDIT:説明のための鼻孔。私は

<c:forEach var="i" begin="1" end="5"> 
    Item <c:out value="${i}"/><p> 
</c:forEach> 

を試してみましたそして、それは動作しますが、

<c:forEach var="item" items="${data}"> 
    It worked!<p> 
</c:forEach> 

は動作しません。これが何らかの理由で可変デー​​タがJSPに到達していないと私は信じました。

EDIT 2:実行するために、私はEclipseでTomcatサーバーを構成しました。サーブレットを右クリックし、Run As - > Run on Serverを選択します。サーバーが再起動し、ブラウザからhttp://localhost:8080/DataExtractor/を起動します。

<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> 

<html> 
<head> 
    <meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1"> 
    <title>Data extractor</title> 
</head> 

<body> 
Data table: 
    <table border="1"> 

    </table> 
</body> 
</html> 

EDIT 3:これは、なぜこれが起こっているのキーであるかもしれないここで結果のHTMLです。 http://localhost:8080/DataExtractor/(index.jsp)に行くと、の編集2に投稿されたhtmlが表示されますが、http://localhost:8080/DataExtractor/DataGetterServletに行くと正しいページが表示されます。どんな考え? JSPで

+1

リクエストに追加するときに、サーブレットの "data"配列変数に実際に値が設定されていますか? –

+0

はい、私はチェックして、ArrayListが正しく設定されているかどうかを確認できます。 – fpele

+0

あなたのarrayListは空のリストではありませんか?空の場合、ループは –

答えて

4

これはタイプミスかもしれない、$(item)は以下で${item}する必要があります -

<c:forEach var="column" items="$(item)" > 

更新

http://localhost:8080/DataExtractor/サーブレットにはマップされません。一方、http://localhost:8080/DataExtractor/DataGetterServletはes。サーブレットが呼び出されていない場合は、dataがリクエストではないことは明らかです。言い換えれば、最初のurlはサーブレットを呼び出すのではなく、ページに直接話しています。 (あなたはおそらくweb.xmlにwelcome-pageとしてあります)

+0

あなたの質問をサーブレットの完全な定義で更新することができますし、要求をどのように発しているかを表示できますか? –

+0

tomcatのログファイルもチェックしましたか? –

+0

@fpele:それをコメントで更新しました。とにかくあなたはそれを釘付けにした。大きな努力と良い仕事。 +1。 –

2

、あなたはヘッダにこれを含める必要があります。

<jsp:useBean id="data" class="java.util.ArrayList" scope="request"/> 
+0

いいえ、それは動作しませんでした:/ – fpele

+0

それは動作する必要があります。ちょっと、ArrayList の代わりにArrayList を必ず用意してください。 – darijan

+3

これは必須ではありません - [*いずれにしても、サーブレットを使用している場合は ... *](http://stackoverflow.com/a/14588073/738746) –

2

あなたの問題は誤植のためだと思います。 requestScopeは、リクエストオブジェクトのマップを保持しているため

<c:forEach var = "column" items = "${data}"> 

<c:forEach var = "column" items = "${requestScope.data}"> 

は私のためにうまくいきました。

+0

気づいていただきありがとうございます。私は自分のコードでそのタイプミスをしましたが、それは本当の問題ではありません。わかりやすくするために私が作った編集を見てください。 – fpele

関連する問題