2013-06-13 94 views
6

Tôi đã nhìn thấy các câu hỏi khác tương tự như câu hỏi này nhưng không ai trong số chúng đã giúp tôi giải quyết vấn đề của mình. Về cơ bản, tôi đang cố gắng chuyển một biến từ một servlet đến một JSP.Chuyển biến từ servlet sang JSP

Mã servlet.

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); 
    } 
} 

My JSP đang

<%@ 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> 

Tôi đã làm một số xét nghiệm với thẻ foreach và JSTL được thiết lập đúng cách. Tôi nghĩ rằng biến "dữ liệu" không đạt được JSP. Bất kỳ ý tưởng tại sao?

Xin cảm ơn trước.

CHỈNH SỬA: Để biết rõ các porpuses. Tôi đã cố gắng

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

Và đó hoạt động, nhưng

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

không hoạt động. Đây là những gì đã khiến tôi tin rằng dữ liệu biến đó không đạt được JSP vì một lý do nào đó.

EDIT 2: Để chạy nó, tôi đã định cấu hình máy chủ Tomcat trên Eclipse. Tôi nhấp chuột phải vào servlet và chọn Run As -> Run on Server. Máy chủ khởi động lại và tôi khởi chạy http://localhost:8080/DataExtractor/ từ trình duyệt của mình. Dưới đây là html kết quả:

<!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: Điều này có thể là chìa khóa của lý do tại sao điều này xảy ra. Khi tôi truy cập http://localhost:8080/DataExtractor/ (index.jsp), tôi nhận được html được đăng trong Chỉnh sửa 2, nhưng nếu tôi truy cập http://localhost:8080/DataExtractor/DataGetterServlet thì tôi sẽ nhận được đúng trang! Bất kỳ ý tưởng tại sao?

+1

Bạn có chắc chắn rằng biến mảng "dữ liệu" trong servlet thực sự có giá trị khi bạn thêm nó vào yêu cầu không? –

+0

Có, tôi đã kiểm tra và tôi có thể nói chắc chắn rằng ArrayList được điền đúng. – fpele

+0

Bạn có chắc chắn arrayList của bạn không phải là danh sách trống? Nếu nó trống, thì vòng lặp sẽ không lặp lại –

Trả lời

4

Đây có thể là một lỗi đánh máy, $(item) nên ${item} trong những điều sau đây -

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

Cập nhật

http://localhost:8080/DataExtractor/ không ánh xạ tới servlet, trong khi http://localhost:8080/DataExtractor/DataGetterServlet làm es. Nếu servlet không được gọi thì rõ ràng là data sẽ không là yêu cầu. Nói cách khác, url đầu tiên không gọi servlet, nhưng trực tiếp nói với bạn về trang. (Bạn có thể có dưới dạng trang chào mừng trong web.xml)

+0

Có thể cập nhật câu hỏi của bạn với định nghĩa đầy đủ về servlet và bạn cũng có thể cho biết cách bạn kích hoạt yêu cầu đó không? –

+0

Bạn cũng đã kiểm tra tệp nhật ký của tomcat chưa? –

+0

@fpele: Cập nhật nó bằng nhận xét. Mất một lúc nhưng bạn đóng đinh nó anyway. Nỗ lực lớn và công việc tốt. +1. –

2

Trong jsp, bạn cần bao gồm này trong tiêu đề:

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

Không, điều đó không có tác dụng:/ – fpele

+0

Điều đó phải hoạt động. Chỉ cần đảm bảo có ArrayList thay vì ArrayList . – darijan

+3

Điều này là không bắt buộc - [* Trong mọi trường hợp, nếu bạn đang sử dụng một servlet, bạn không nên sử dụng ... *] (http://stackoverflow.com/a/14588073/738746) –

2

Tôi nghĩ vấn đề của bạn chỉ vì lỗi đánh máy.

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

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

làm việc tốt cho tôi vì requestScope giữ bản đồ của các đối tượng yêu cầu.

+0

Cảm ơn bạn đã chú ý. Tôi đã có lỗi đánh máy đó trong mã của tôi, nhưng đó không phải là vấn đề thực sự. Vui lòng xem bản chỉnh sửa tôi đã làm để làm rõ. – fpele

Các vấn đề liên quan