日期:2014-05-20  浏览次数:20698 次

request.setAttribute 为什么不能在jsp间传递对象?
test.jsp 如下
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8" %>
<%@ page import = "com.mod.FormBean" %>

<%
FormBean fb = new FormBean(); 
request.setAttribute("aa",fb);
%>
<html>
<head>
<script language="JavaScript" ></script>
</head>

<body>
  <form name = "form1" action="test2.jsp" method="post">
  <input type="submit" name="b1" value="submit">
  </form>
</body>
</html>  
--------
test2.jsp 如下

<%
Object obj = request.getAttribute("aa");
out.println(obj.toString());
%>

上例子中我想在test.jsp中把FormBean 传递到test2.jsp 中, 可是我用request.getAttribute("aa") 得到的是Null

请问我如何做才能实现在jsp间传递java 对象? 请给代码参考,谢谢.

------解决方案--------------------
因为两个页面不是同一个request

可用用session解决 或者这个也可以request.getRequestDispatcher("目的页面.jsp").forward(request, response);
------解决方案--------------------
楼主要好好看看几个作用域对象和作用范围,这几个作用于对象分别为page、pageContext、request、response、application.它们作用于不同作用域,它们实现servlet与jsp之间的各种通讯,而且范围从小到大。如何通讯就看你自己的理解的,最后一句忠告,作用域的使用范围一般来说越小越好,也就是说能用page的就不用request,能用request就不用session。还有,jsp与servlet数据间传体最好都在request及其以下级别,session级别的作用域传递尽量不要用。
------解决方案--------------------
问题很简单 你在第一个叶面只使用了 request.setAttribute() 但是并没有指名你要把元素传递到哪个页面上
所以需要用 用 转发操作: request.getRequestDispatcher("目的页面.jsp").forward(request,response); 
指名元素传递的方向

对于你提出的: 但我现在要求是,在test.jsp 点击后, 在新窗口中打开 test2.jsp, 并且把对象传递过去,请问如何实现??
不能用 request.setAttribute()传递了 需要改变属性范围 使用 Application范围 也就是Application.setAttribute()方法传递

对于有人提出的: 为什么不直接放在form里面呢

from指明的是 参数传递的页面 和元素传递的页面是两回事情 上面的例子
<form name = "form1" action="test2.jsp" method="post"> 
<input type="submit" name="b1" value="submit"> 
指明参数传递路径并没有起到实际作用 因为并没有传递参数 请看下面例子实现简单的参数传递

<form name = "form1" action="test2.jsp" method="post"> 
<input type="test" name="uname"> //传递的参数名字叫 uname 以后可以通过 request.getParameter("uname")接收它
<input type="submit" name="b1" value="submit"> 

以上论述是个人意见 可能有不对的地方 欢迎高人指导
------解决方案--------------------
你首先得了解request与session的生命周期,在了解了这个后你就知道为什么两个页面之间为什么request不能传值了。你可在后台servlet里做一个传接桥。在jsp页面中直接互相传值在开发中是不提倡的。
------解决方案--------------------
对于request,从test.jsp把参数传回服务器,这个request的生命周期就结束了。
然后,再到一个新的页面test2.jsp,这时候的request是一个新的对象。

如果你一定要把test.jsp传给服务器的参数传递给test2.jsp,又不想使用session,那么有个办法。就是在后台处理这个test.jsp传回来的参数的时候,手动把它设置到新的request对象里面。在类似于struts这样的mvc框架里面,我们经常这样作