有没有办法在发布表单时设置请求属性(而不是参数)?
我试图解决的问题是:我有一个JSP页面,在几个下拉列表中显示一些数据.发布表单时,我的Controller servlet处理此请求(基于表单中设置/指定的参数)并重定向到应显示添加详细信息的同一JSP页面.我现在想要在下拉列表中显示相同/更早的数据,而不必重新计算或重新计算以获得相同的数据.
在所述JSP页面中,表单中的下拉列表由通过请求属性指定的数据填充.现在,在Form被POST并且我被重定向到同一个JSP页面之后,下拉列表是空的,因为不存在必要的请求属性.
对于网络应用程序来说,我就是n00b,所以显而易见.这个问题的简单解决方案让我逃脱了!
我对如何重构Servlet中的控制流的建议持开放态度.
有关此应用程序的一些详细信息:标准Servlet JSP,JSTL,在Apache Tomcat 6.0中运行.
谢谢.
.. and redirects to the same JSP page ..
你不应该在这里发射重定向,而是向前发射.即不要做
response.sendRedirect("page.jsp");
而是做
request.getRequestDispatcher("page.jsp").forward(request,response);
这样原始请求仍然存在,包括所有参数和属性.重定向即指示客户端发出全新请求,特此请求初始请求.
在JSP中,您可以通过EL中的${param}访问请求参数,您可以使用${attributeKey}以相同的方式访问请求属性,其中attributeKey是您用于在servlet的请求范围中设置对象的属性键如下:
request.setAttribute("attributeKey",someObject);
至于在JSP中保留HTML输入值,您只需要设置< input> element的值与请求参数值相对应:
这将在模板文本中打印request.getParameter(“foo”)的结果.然而,这有一个XSS的风险,更好的是在JSTL的fn:escapeXml()的帮助下逃避任何用户控制的输入,如下所示:
<%@ taglib uri="http://java.sun.com/jsp/jstl/functions" prefix="fn" %>
...
在下拉列表中保留选定的选项有点不同.您基本上需要设置< option>的所选属性有问题的元素.假设你是 – 通常会做的 – 使用JSTL的< c:forEach> tag以显示Map< String,String>或者可能是List< JavaBean>对于选项值,您可以按如下方式解决(假设${countries}是一个Map< String,String>您已将其作为属性放置在请求,会话或应用程序范围中):
当当前迭代的选项键等于请求参数映射中提交的选项键时,这将打印所选属性.