在发布表单时,有没有办法设置请求属性(而不是参数)?
我想解决的问题是:我有一个JSP页面,在几个下拉列表中显示一些数据。发布表单时,我的Controller servlet处理此请求(基于表单中设置/指定的参数)并重定向到应显示添加详细信息的同一JSP页面。我现在想要在下拉列表中显示相同/更早的数据,而不必重新计算或重新计算以获得相同的数据。
在上述JSP页面中,表单中的下拉列表由通过请求属性指定的数据填充。现在,在Form被POST后,我被重定向到同一个JSP页面,下拉列表是空的,因为不存在必要的请求属性。
对于网络应用来说,我是n00b,所以很明显&这个问题的简单解决方案暂时逃脱了我!
我愿意接受有关如何重构Servlet中控制流的建议。
有关此应用程序的一些详细信息:标准Servlet + JSP,JSTL,在Apache Tomcat 6.0中运行。
感谢。
答案 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>
属性。