2013-06-13 4 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: Чтобы запустить его, я настроил сервер Tomcat на Eclipse. Я нажимаю правой кнопкой мыши на сервлет и выбираю Run As -> Run on Server. Сервер перезапустится, и я запустил http://localhost:8080/DataExtractor/ из моего браузера. Вот полученный HTML:

<!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: Это может быть ключом, почему это происходит. Когда я перехожу на http://localhost:8080/DataExtractor/ (index.jsp), я получаю html, опубликованный в Редактировать 2, но если я перейду к http://localhost:8080/DataExtractor/DataGetterServlet, тогда я получу правильную страницу! Любая идея почему?

+1

Вы уверены, что переменная массива «data» в сервлет действительно имеет значения, когда вы добавляете ее в запрос? –

+0

Да, я проверил, и могу точно сказать, что ArrayList правильно заполнен. – fpele

+0

Вы уверены, что ваш массивList не пустой список? Если он пуст, то цикл не будет итерации –

ответ

4

Это может быть опечатка, $(item) должен быть ${item} в следующем -

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

Update

http://localhost:8080/DataExtractor/, который не отображается на сервлет, а http://localhost:8080/DataExtractor/DataGetterServlet do эс. Если сервлет не вызывается, то очевидно, что data не будет запросом. Другими словами, первый url не вызывает сервлет, а напрямую говорит вам о странице. (У вас, вероятно, есть приветственная страница в web.xml)

+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

Я думаю, что ваша проблема была из-за опечатки только.

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

и

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

работал хорошо для меня, потому что requestScope держит карту объектов запроса.

+0

Спасибо, что заметили. У меня была эта опечатка в моем коде, но это не настоящая проблема. См. Изменение, которое я сделал для разъяснения. – fpele

Смежные вопросы