2010-06-03 42 views
5

當表單發佈時,有什麼方法可以設置請求屬性(非參數)嗎?在表單發佈時設置請求屬性

我想解決的問題是:我有一個JSP頁面顯示一些下拉列表中的一些數據。當表單發佈時,我的Controller servlet處理這個請求(根據表單中設置/指定的參數)並重定向到應該顯示添加細節的相同JSP頁面。我現在想要在下拉列表中顯示相同/較早的數據,而無需重新計算或重新計算以獲取相同的數據。

而在上述JSP頁面中,表單中的下拉列表由通過請求屬性指定的數據填充。現在,在表單被POST並且我被重定向到相同的JSP頁面之後,下拉列表是空的,因爲沒有必要的請求屬性。

當談到網絡應用程序時,我相當的n00b,所以這個問題的一個明顯的方法就是在這個時候逃脫我!

我很樂意提供關於如何重構Servlet中的控制流的建議。

有關此應用程序的一些細節:在Apache Tomcat 6.0中運行的標準Servlet + JSP,JSTL。

謝謝。

+0

你的意思是查詢字符串參數? – Affe 2010-06-03 16:26:02

+0

不,我的意思是請求範圍的屬性。我想保持查詢字符串儘可能簡短。 – ssahmed555 2010-06-03 17:15:18

+0

你可以從JSP發佈表單代碼嗎? – Michael 2010-06-03 20:27:30

回答

4

..並重定向到同一個JSP頁面..

你不應該在這兒火重定向,但向前。即不做

response.sendRedirect("page.jsp"); 

而是做

request.getRequestDispatcher("page.jsp").forward(request, response); 

這樣的原始請求仍然活着,包括所有的參數和屬性。重定向指示客戶發出全新的請求,特此提供初始請求。

在JSP可以通過${param}在EL訪問請求參數,並且可以訪問請求屬性與${attributeKey}相同的方式,其中attributeKey是您已用於設置在請求範圍的對象在servlet如下屬性鍵:

request.setAttribute("attributeKey", someObject); 

至於在JSP保留HTML的輸入值,你只需要在請求參數值設置相應的<input>元素的value attribtue:

<input name="foo" value="${param.foo}"> 

這將在模板文本中輸出request.getParameter("foo")的結果。這有一個但是風險XSS,更是逃避與JSTL的fn:escapeXml()幫助任何用戶控制輸入如下:

<%@ taglib uri="http://java.sun.com/jsp/jstl/functions" prefix="fn" %> 
... 
<input name="foo" value="${fn:escapeXml(param.foo)}"> 

保留在下拉列表中選擇的選項是有點不同的故事。您基本上需要設置<option>元素的selected屬性。假設你通常會這樣做 - 使用JSTL的<c:forEach>標籤來顯示Map<String, String>List<JavaBean>的選項值,可以按如下方式解決它(假設${countries}Map<String, String>,您已將其作爲屬性放置在請求,會話或應用範圍):

<select name="country"> 
    <c:forEach items="${countries}" var="country"> 
     <option value="${country.key}" ${country.key == param.country ? 'selected' : ''}>${country.value}</option> 
    </c:forEach> 
</select> 

此打印selected屬性在當前迭代選項鍵等於在請求參數地圖提交的一個。

+0

我忘了提及我已經在做'rd.forward(request,response)'。但是現在讓我困惑的是,在forward()之後,JSP的下拉列表是空的 - 我可以在Netbeans的HTTP監視器中看到包含用於填充下拉列表的數據的請求屬性在轉發後不再存在()完成。我失蹤了! – ssahmed555 2010-06-03 17:55:08

+1

呵呵,HTTP監視器?您是不是將請求屬性與請求參數混淆?屬性在HTTP請求/響應標頭/正文中不可見,但僅在服務器內存中可見。請求參數在HTTP請求/響應頭/主體中可見。你真的需要提供更多關於這個問題的細節。無論如何,我的回答剩餘沒有帶來新的見解嗎? – BalusC 2010-06-03 17:57:16

+0

不,但NB的HTTP監視器能夠調試Web應用程序中各個組件之間的HTTP請求和響應流量,並且它顯示請求參數和請求屬性(如果可用)。 – ssahmed555 2010-06-03 17:58:27

相關問題