在表单发布时设置请求属性

时间:2010-06-03 16:19:57

标签: java html jsp servlets jstl

在发布表单时,有没有办法设置请求属性(而不是参数)?

我想解决的问题是:我有一个JSP页面,在几个下拉列表中显示一些数据。发布表单时,我的Controller servlet处理此请求(基于表单中设置/指定的参数)并重定向到应显示添加详细信息的同一JSP页面。我现在想要在下拉列表中显示相同/更早的数据,而不必重新计算或重新计算以获得相同的数据。

在上述JSP页面中,表单中的下拉列表由通过请求属性指定的数据填充。现在,在Form被POST后,我被重定向到同一个JSP页面,下拉列表是空的,因为不存在必要的请求属性。

对于网络应用来说,我是n00b,所以很明显&这个问题的简单解决方案暂时逃脱了我!

我愿意接受有关如何重构Servlet中控制流的建议。

有关此应用程序的一些详细信息:标准Servlet + JSP,JSTL,在Apache Tomcat 6.0中运行。

感谢。

1 个答案:

答案 0 :(得分:4)

  

..并重定向到相同的JSP页面..

您不应该在此处触发重定向,而是前进。即不要做

response.sendRedirect("page.jsp");

而是做

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

这样原始请求仍然存在,包括所有参数和属性。重定向即指示客户端发出全新的请求,因此请执行初始请求。

在JSP中,您可以通过EL中的${param}访问请求参数,您可以使用${attributeKey}以相同的方式访问请求属性,其中attributeKey是您用于设置的属性键servlet中请求范围中的对象如下:

request.setAttribute("attributeKey", someObject);

至于在JSP中保留HTML输入值,您只需要使用请求参数值相应地设置<input>元素的value属性:

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

在下拉列表中保留选定的选项有点不同。您基本上需要设置有问题的selected元素的<option>属性。假设您通常会使用JSTL的<c:forEach>标记来显示Map<String, String>List<JavaBean>个选项值,您可以按如下方式解决(假设{{ 1}}是您在请求,会话或应用程序范围中作为属性放置的${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> 属性。