jsp中用request.setAttribute()后,在action中为什么取不到值?

<script language="JavaScript"><!--
function doAdd() { if ( _validation( webPayForm )){ webPayForm.submit(); }else{ return false; }}
--></script>
<br><br><form action="WebPay.do" name="webPayForm" onsubmit="return _validation( this )"><%request.setAttribute("test", "test"); %>
以上是部分代码,关键的就是request.setAttribute("test", "test");这里的test不是form表单的属性,直接用request赋值,为什么在对应的action中取不到,如果在action中用request.setAttribute()赋值就可以去到,这是为什么,我知道如果加一个hidden属性可以将值传过去,但是就是好奇为什么直接用request就不能取到,是本身就取不到,还是我代码问题

不能这么请求。
因为页面上的request 和使用form提交的request 请求 不是一个对象。测试如下:
首先在jsp页面中打印出来request对象
<%
request.setAttribute("test","test");
System.out.println("request="+request+"返回页面对象");//这里打印出页面request对象
%>
部分action代码如下:
HttpServletRequest request = ServletActionContext.getRequest();
System.out.println("request="+request+"action里的request对象");
String test = (String) request.getAttribute("test");
System.out.println("test="+test);

经过测试 输出结果如下:
request=org.apache.struts2.dispatcher.StrutsRequestWrapper@199f0e5返回页面对象
request=org.apache.struts2.dispatcher.StrutsRequestWrapper@19665e1action里的request对象
test=null
request=org.apache.struts2.dispatcher.StrutsRequestWrapper@19665e1返回页面对象

说明:
输出结果第一行 是第一次加载请求页面时,调用当前页面的request对象(其实我们打开请求页面时产生的请求对象)
第二行 是我用form 提交然后在action里获取的request对象,可以看到两个request对象的类型是一样的 但是值却不一样,这正好说明了 我们每次请求 都会重新产生一个request对象。
到这里,第三行就毫无疑问了,既然重新生成了request对象 那当然不会有我们之前set的属性咯。
第四行很关键,我们看到了那个action里的request对象 返回到了页面上,他们是同一个类型,同一个对象。这正好说明了 当我们的响应模式为dispatcher时 request参数也会返回到页面,因为request对象没有变。
希望对你有所帮助!追问

谢谢,你回答得很详细,是不是由此也看出form提交表单到action,相当于进行了一次重定向

追答

对,是的。因为我们打开一个页面算一次请求,而form提交表单 就又是另一次请求,就算你的请求地址和上次的请求地址一样,仍然就丢失参数。这就充分说明了 请求进行了重定向。

追问

好,谢谢,基础不扎实就是不行,谢谢了

追答

不客气。

温馨提示:内容为网友见解,仅供参考
第1个回答  2018-06-27
设置断点,看一下,这个值是在哪里丢的,然后进行相应的处理
步骤如下:
1、首先打开自己的项目。
2、在项目中找到想要调试的地方,在代码行的前方点击设置断点,或者把鼠标移动到代码行,用快捷键“Ctrl+Shift+b”设置断点。
3、然后在上方标签栏中,操作“Debug As”->"Java Application"。
4、在弹出的对话框点击“Yes”,进入“debug模式”。
5、在窗口的右上方可以看到 代码中的相对应得值。
特别提示:F5是跳进,F6是执行下一步,F7是跳出。
第2个回答  2014-01-20
这样的话,本身就取不到
用form提交的话,只提交form域的内容。 (这是重定向)
如果你想在 这情况下的获得req的attribute, 应该用<jsp:forward page="xxx.jsp">跳转,xxx.jsp 中就可以获得这个attribtue (这是二次转发)追问

你回答的也不错,谢谢

第3个回答  2014-01-20

request 只在当前页面有效

正确写法应该是放在form里

<form action="WebPay.do" name="webPayForm" onsubmit="return _validation( this )">
<input id="test" name="test" value="test"/><!-- 要传到action的 -->
...
</form>
//action 中
request.getParameter("test")

第4个回答  2014-01-20
写成<input id="test" type="hidde" name="test" value="test"/> 不要用你的那种方式
相似回答