1.我在jsp页面:request.setAttribute("username","hello"),然后提交到servlet用request.getAttribute("username"),取到的值为null;其实在项目中没用人会这么用,但是我测试这种方式确实取不到值,求高手指教2.关于request的生命周期的问题:我打开一个窗口然后输入:http://localhost:8080/ssh/login.jsp 向服务器请求login.jsp页面;login.jsp页面内容:<% out.println(request)%>    //打印出request对象
问题:1.当我分别开了三个窗口的时候打印出来的 request对象一样。  2.有时候打开几个窗口后打出的值也有相同的
我觉得每次打开新窗口发起请求应该是不同的request对象才对吧,为什么会出现相同的情况呢,求大家看看是否我理解错误

解决方案 »

  1.   

    1.request.getDispatcher.forward跳转界面试试
    2.application 生命周期在整个应用程序中 生命周期为:应用程序启动到停止.
    session 会话你可以设置他的时间 默认的是30分钟 当你关闭浏览器 结束本次会话  用户开始进行操作就产生一个唯一的session 每个session都分配了一个唯一的Id  
    request是获取信息--通过用户提交的表单,查询字符串,cookie等获得信息
    session是服务端用来保存一些数据(通常是标记状态的,当然也可以保存别的)
    session是服务端的记录变量,可以跟踪记录访问者动作,比如登录,退出等.
    request用在数据提交,表单数据等
    cookie 的话 它有一个有效期 你也可以设置时间 如一个月 一年等
      

  2.   

    1. 如果是页面Form提交,那肯定不行。因为看到JSP Form和Form访问Servlet是两个不同的请求,请求域中的对象不会跨请求保持。2. out.println(request)是打印request.toString()方法调用的结果字符串,可能会一样,但并不意味着多次访问是同一个对象。
    为什么toString方法返回结果一样的可能性很大,是因为容器有可能会复用request对象在多次请求之间。但容器会确保每次的request对象是清白无残留的,这样,即便是同一个对象,也不会有什么副作用。
      

  3.   

    问题1:两个request不一样,访问*.jsp和提交servlet是两个请求,
    问题2:jsp就相当于servlet,只第一次请求编译,Singleton的(可以看一下servlet生命周期)占内存不变
      

  4.   

    关于楼上说的第一个问题应该是两个request,我测试:首先到第一个页面login.jsp页面上
    <%out.print(request)%><form  action="/testservlet">
         <input type="submit" value="sub">
    </form>
    然后在login.jsp提交到servlet ,然后在servlet中打印System.out.prin(request)这两个打印出来的结果是一样的,这能说明两个request对象是相同的吗????
      

  5.   

    我写了个JSP,判断本次请求和用户上次的请求对象是否==,结果在Tomcat上运行多次,确实观察到是同一个对象。从理论上说,请求对象确实是临时对象,用于处理一次请求。为什么多次观察会一样,应该是出于效率原因,容器特定的性能优化设计吧。
      

  6.   

    又做了个压力测试,很多进程同时访问的时候,相继两次请求,容器分配的request对象不是同一个对象的情况出现频率高一些。
      

  7.   

    1,你那是重定向,如果是转发是可以取到值的。
    2,这个没玩过,不过request对象是由容器分配的。容器其实也就是一集合一样的。用到哪一个request,不一定吧。