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

<scriptlanguage="JavaScript"><!--functiondoAdd(){if(_validation(webPayForm)){webPayFo... <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就不能取到,是本身就取不到,还是我代码问题
展开
 我来答
kingkate2009
2014-01-20 · TA获得超过535个赞
知道小有建树答主
回答量:557
采纳率:50%
帮助的人:252万
展开全部
不能这么请求。
因为页面上的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提交表单 就又是另一次请求,就算你的请求地址和上次的请求地址一样,仍然就丢失参数。这就充分说明了 请求进行了重定向。
千锋教育
2018-06-27 · 做真实的自己 用良心做教育
千锋教育
千锋教育专注HTML5大前端、JavaEE、Python、人工智能、UI&UE、云计算、全栈软件测试、大数据、物联网+嵌入式、Unity游戏开发、网络安全、互联网营销、Go语言等培训教育。
向TA提问
展开全部
设置断点,看一下,这个值是在哪里丢的,然后进行相应的处理
步骤如下:
1、首先打开自己的项目。
2、在项目中找到想要调试的地方,在代码行的前方点击设置断点,或者把鼠标移动到代码行,用快捷键“Ctrl+Shift+b”设置断点。
3、然后在上方标签栏中,操作“Debug As”->"Java Application"。
4、在弹出的对话框点击“Yes”,进入“debug模式”。
5、在窗口的右上方可以看到 代码中的相对应得值。
特别提示:F5是跳进,F6是执行下一步,F7是跳出。
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
alvis_bd
2014-01-20 · 超过12用户采纳过TA的回答
知道答主
回答量:26
采纳率:0%
帮助的人:26.3万
展开全部
这样的话,本身就取不到
用form提交的话,只提交form域的内容。 (这是重定向)
如果你想在 这情况下的获得req的attribute, 应该用<jsp:forward page="xxx.jsp">跳转,xxx.jsp 中就可以获得这个attribtue (这是二次转发)
追问
你回答的也不错,谢谢
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
chenguang5092
2014-01-20 · TA获得超过664个赞
知道小有建树答主
回答量:520
采纳率:50%
帮助的人:456万
展开全部

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")
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
一升庵的咒
2014-01-20
知道答主
回答量:45
采纳率:30%
帮助的人:16.1万
展开全部
写成<input id="test" type="hidde" name="test" value="test"/> 不要用你的那种方式
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 更多回答(3)
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式