Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/346.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 发布表单时设置请求属性_Java_Html_Jsp_Servlets_Jstl - Fatal编程技术网

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

Java 发布表单时设置请求属性,java,html,jsp,servlets,jstl,Java,Html,Jsp,Servlets,Jstl,发布表单时,是否有任何方法设置请求属性(而不是参数) 我试图解决的问题是:我有一个JSP页面,在几个下拉列表中显示一些数据。发布表单时,我的控制器servlet处理该请求(基于表单中设置/指定的参数),并重定向到应该显示添加细节的同一JSP页面。现在,我希望在下拉列表中显示相同/更早的数据,而不必重新计算或重新计算以获得相同的数据 在上述JSP页面中,表单中的下拉列表由通过请求属性指定的数据填充。现在,表单发布后,我被重定向到同一个JSP页面,下拉列表为空,因为不存在必要的请求属性 在网络应用方

发布表单时,是否有任何方法设置请求属性(而不是参数)

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

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

在网络应用方面,我相当于n00b,所以目前我还没有找到一个显而易见的简单解决方案

我愿意听取关于如何在Servlet中重构控制流的建议

有关此应用程序的一些详细信息:在ApacheTomcat6.0中运行的标准Servlet+JSP、JSTL

谢谢

。。并重定向到同一个JSP页面

您不应该在此处触发重定向,而应该在此处触发转发。也就是说,不要这样做

response.sendRedirect("page.jsp");
而是

request.getRequestDispatcher("page.jsp").forward(request, response);
这样原始请求保持活动状态,包括所有参数和属性。重定向即指示客户端发出一个全新的请求,从而丢弃初始请求

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

request.setAttribute("attributeKey", someObject);
<%@ taglib uri="http://java.sun.com/jsp/jstl/functions" prefix="fn" %>
...
<input name="foo" value="${fn:escapeXml(param.foo)}">
至于在JSP中保留HTML输入值,您只需要使用请求参数值相应地设置
元素的
属性:

<input name="foo" value="${param.foo}">
在下拉列表中保留所选选项则有点不同。您基本上需要设置所讨论的
元素的
selected
属性。假设您使用JSTL的
标记来显示
映射
,或者可能是选项值的
列表
,您可以如下解决它(假设
${countries}
是一个
映射
,您已将其作为属性放置在请求、会话或应用程序范围中):


${country.value}

当当前迭代的选项键等于请求参数映射中提交的选项键时,将打印所选的属性。

您是指查询字符串参数吗?不是,我是指请求范围的属性。我想让查询字符串尽可能简短。你能从JSP发布表单代码吗?我忘了提到我已经在做
rd.forward(请求,响应)
。但现在让我困惑的是,在forward()之后,JSP的下拉列表是空的——我可以在Netbeans的HTTP监视器中看到,在forward()完成之后,包含用于填充下拉列表的数据的请求属性不再存在。我错过了什么!嗯,HTTP监视器?您是否将请求属性与请求参数混淆了?属性在HTTP请求/响应头/正文中不可见,但仅在服务器内存中可见。请求参数在HTTP请求/响应头/正文中可见。你真的需要提供更多关于这个问题的细节。不管怎样,我的答案的剩余部分没有带来新的见解吗?没有,但是NB的HTTP监视器能够调试web应用程序中不同组件之间的HTTP请求和响应流量,并且它确实显示了请求参数和请求属性(如果可用)。我不使用Netbeans,但我觉得很难相信,因为术语“HTTP”在“HTTP监视器”中,将出现错误。请求属性绝对不是HTTP通信的一部分。毕竟,这些症状表明您正在执行重定向或以错误的方式访问属性/参数。
<select name="country">
    <c:forEach items="${countries}" var="country">
        <option value="${country.key}" ${country.key == param.country ? 'selected' : ''}>${country.value}</option>
    </c:forEach>
</select>