ssa*_*555 5 html java jsp servlets jstl
有没有办法在发布表单时设置请求属性(而不是参数)?
我试图解决的问题是:我有一个JSP页面,在几个下拉列表中显示一些数据.发布表单时,我的Controller servlet处理此请求(基于表单中设置/指定的参数)并重定向到应显示添加详细信息的同一JSP页面.我现在想要在下拉列表中显示相同/更早的数据,而不必重新计算或重新计算以获得相同的数据.
在所述JSP页面中,表单中的下拉列表由通过请求属性指定的数据填充.现在,在Form被POST并且我被重定向到同一个JSP页面之后,下拉列表是空的,因为不存在必要的请求属性.
当谈到网络应用程序时,我就是n00b,所以这个问题的一个明显而简单的解决方案让我逃脱了!
我对如何重构Servlet中的控制流的建议持开放态度.
有关此应用程序的一些详细信息:标准Servlet + JSP,JSTL,在Apache Tomcat 6.0中运行.
谢谢.
..并重定向到相同的 JSP 页面..
您不应该在此处触发重定向,而应该触发转发。即不做
response.sendRedirect("page.jsp");
Run Code Online (Sandbox Code Playgroud)
而是做
request.getRequestDispatcher("page.jsp").forward(request, response);
Run Code Online (Sandbox Code Playgroud)
这样,原始请求仍然有效,包括所有参数和属性。重定向即指示客户端发出新的请求,从而对初始请求进行垃圾处理。
在 JSP 中,您可以通过 EL 访问请求参数${param}
,并且可以使用与属性键相同的方式访问请求属性,${attributeKey}
其中attributeKey
属性键用于在 servlet 的请求范围中设置对象,如下所示:
request.setAttribute("attributeKey", someObject);
Run Code Online (Sandbox Code Playgroud)
至于在 JSP 中保留 HTML 输入值,您只需使用请求参数值相应地设置<input>
元素的属性:value
<input name="foo" value="${param.foo}">
Run Code Online (Sandbox Code Playgroud)
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)}">
Run Code Online (Sandbox Code Playgroud)
在下拉列表中保留选定的选项则有点不同。您基本上需要设置相关元素selected
的属性。<option>
假设您像通常那样使用 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>
Run Code Online (Sandbox Code Playgroud)
selected
当当前迭代的选项键等于请求参数映射中提交的选项键时,这将打印该属性。
归档时间: |
|
查看次数: |
6165 次 |
最近记录: |