2010-04-21 87 views
0

當試圖通過在我的servlet與HTML建立這樣的一個表:從Servlet來JSP

response.setContentType("text/html"); 
PrintWriter out = response.getWriter(); 
out.println("<html>"); 
out.println("<head>"); 
out.println("<title>Imput OPC</title>"); 
out.println("</head>"); 
out.println("<body>"); 
... 

然後

response.sendRedirect("/xxx.jsp"); 

但我沒有發現任何表在JSP。
一個朋友告訴我要使用一個Bean,但是如何從一個bean中獲取表單中的值(因爲我在處理表之前有一個處理表單)。我必須爲此使用一個servlet。所以我想正好是在響應建設什麼樣的表,然後將其發送到在jsp知道:.sendRedirect

getServletContext().getRequestDispatcher("/xxx.jsp").forward(request, response); 

讓一切盡在不言中。

回答

4

A 重定向讓客戶端觸發新的請求。它會破壞您正在處理的當前請求和響應。您會在指定的網址上獲得全新的請求和響應。無論何時您想要將請求作用域信息從servlet傳遞到JSP,您都不希望發送重定向。改爲使用轉發

在servlet中打印HTML是一個很大的禁忌。每當您稍後將請求轉發給JSP時,您也不應該向響應主體寫入內容。您將面臨服務器日誌中的IllegalStateException(實際上是webbrowser中的空白頁面)。打印HTML是由JSP完成的任務,而不是由servlet完成。

在一個servlet中,您只需要執行業務內容。例如。收集要在表格中顯示的信息。首先創建一個表示表的每個項目(行)的Javabean類。然後創建一個DAO類,它返回來自數據存儲(數據庫?)的這些項目的列表。然後在servlet中,只需使用HttpServletRequest#setAttribute()將請求範圍中的項目列表轉發到使用RequestDispatcher#forward()的JSP文件並使用JSTLc:forEach標記(安裝JSTL,只需在/WEB-INF/lib中刪除jstl-1.2.jar)迭代項目列表。

基本開球例如:

protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { 
    List<Item> items = itemDAO.list(); 
    request.setAttribute("items", items); // It's now available as ${items} in EL. 
    request.getRequestDispatcher("/WEB-INF/result.jsp").forward(request, response); 
} 

其中/WEB-INF/result.jsp這個樣子的:

<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %> 

... 

<table> 
    <c:forEach items="${items}" var="item"> 
     <tr> 
      <td>${item.someProperty}</td> 
      <td>${item.anotherProperty}</td> 
     </tr> 
    </c:forEach> 
</table> 

更多的提示和例子你可能會發現those tutorials有用。爲了進一步採取措施,您還可以使用MVC框架,以便基本上最終只有一個Javabean類和一個JSP文件(即,該servlet的角色已被MVC框架接管),例如JSF

+0

認爲你的答案我會更清楚。 我想知道什麼是次以下: 在JSP X我有一個3下拉列表和一個按鈕叫編輯當用戶點擊此按鈕,動態表應顯示現在這個表在這3 DDL修飾correponding值。 因此,它可以是3個或COLS 4個COLS或甚至6 COLS這取決於所選擇的值。 所以我嘗試是使用servlet來的getParameter做if語句構建HTML,然後轉發response.Have你,我可以使用結構的任何建議。 – kawtousse 2010-04-22 07:49:30

+0

我仍然困惑,直到now.Thinks很多關於你給我有用的幫助。 – kawtousse 2010-04-22 07:50:46

+0

不客氣。如果你有一個全新的,獨立的問題,按'向Question'按鈕右上角。不要忘記標記之前接受的問題的答案。 – BalusC 2010-04-22 12:10:27

1

我不太確定你想要什麼,但你嘗試過:

request.getRequestDispatcher("/xxx.jsp").forward(request, response);

response.sendRedirect("/xxx.jsp")是正是,它告訴瀏覽器去看看別的地方(HTTP 301一「../xxx.jsp」的位置標題)。在此重定向中沒有任何信息傳遞。這就是RequestDispatcher的用途。