我请求页面时先要通过一个servlet处理并获得数据,然后跳转到jsp页面显示,中间可能要传一个包含几千条数据的一个List吧。   现在问题是jsp页面中的图片什么资源都是相对位置,改起来不好改,所以最好不用forward转,那我就用sendRedirect.   可是这么转的话数据自然我就想到用session传了,可有人说这么传不好,为什么,那有什么别的办法么?   我刚学java一周,还没看到高级玩意,所以尽可能用基本的jsp,servlet之类的解决,谢谢了~

解决方案 »

  1.   

    session是一次会话   说白了  你一次请求完了它会一直存在  除非你用完了清除它   如果请求很多会存很多session  而且session你要取一个别名  万一别人写代码的时候也取了一样的名字  代码肯定就会出问题了  能用request尽量用request
      

  2.   

    当打开IE以后浏览网站后会发出一个指令请求SESSIONID以及对各个类型数据的下载许可,如图片,声音以及FLASH。
    数据实际传输内容:IE到服务器
    GET / HTTP/1.1
    Accept: image/gif, image/x-xbitmap, image/jpeg, image/pjpeg, application/x-shockwave-flash, */*
    Accept-Language0: zh-cn
    Accept-Encoding: gzip, deflate
    User-Agent: Mozilla/4.0 (compatible; MSIE 5.01; Windows NT 5.0)
    Host: www.jh521.com
    Connection: Keep-Alive
    服务器会返回一个没有被使用的SESSIONID让IE使用,当时IE就对返回SESSIONID做存储并同时返回相关页面的下载数据,如下:服务器到IE
    HTTP/1.1 200 OK
    Server: Microsoft-IIS/5.0
    Date: Sun, 30 Nov 2003 16:41:51 GMT
    Content-Length: 21174..Content-Type: text/html
    Set-Cookie: ASPSESSIONIDCACBBBRT=IBOMFONAOJFEEBHBPIENJFFC; path=/
    Cache-control: private
    然后就是页面HTML代码此时这个IE程序(不是客户机)的SESSIONID就为IBOMFONAOJFEEBHBPIENJFFC而当IE在访问任何这个站点的ASP程序的时候,就会把IBOMFONAOJFEEBHBPIENJFFC发送给服务器,服务器就会知道IBOMFONAOJFEEBHBPIENJFFC是表示你
    而在服务器上设置SESSION("name")="name"
    完全可以看成是
    SESSION("IBOMFONAOJFEEBHBPIENJFFC")("name")="name"
    或者
    SESSION(SESSIONID)("name")="name"
    这样,SESSION就区分开用户了。
    而当服务器反馈这个ID的时候会看这个ID有没有被使用。如果有在换一个
    反正不会让你重复,如果想模拟某人的SESSION的ID来进行欺骗是可以的。不过要获取到对方IE传输信号,并且在保证当时这个SESSIONID没有被取消的情况下才可能实施。
      

  3.   

    一个客户在服务器端对应一个session;
    一个客户的一次请求对应一个request;
    从生命周期上说,session要比request长,如果你把过多的数据放在session中,会占用服务器的内存过多,而且长时间不能释放。
    对于一个客户,如果说session放的是全局变量,那么request中就是局部变量,我们在写程序的时候,被多次忠告少用全局,多用局部变量。他们其实是同一个意思,我们也应该少用session,多用request。
      

  4.   

    Session 在 Servlet 容器中的存储结构是这样的:HashMap<SessionId, Hashtable<SessionKey, SessionValue>>其中
    SessionId 是 Servlet 容器为当前 Session 分配的一个唯一值
    SessionKey 是某 Session 中的 key 值,也就是使用 session.setAttribute 方法参数的第一个值,而 SessionValue 是第二个值。我们应在 Session 中存放尽可能少的东西,这是由于如果对一个 Session 存值的话,这段代码势必也会对其他的 Session 存值。再来看一下上面的那个 Session 结构,我们很容易能够发现,如果 Session 有很多的话,那个 HashMap 将会很大,再加之如果每一个 Session 中有大量值的话,将会导致那个 Hashtable 会很大很大,如果有很多用户执行那个往 Session 里存值的代码段时,由于此时的 Session 并没有过期,容器暂时不会把这个 Session 给销毁掉,这样的话会将服务器的 JVM 内存耗尽,特别是往 Session 中存入大量数据的 List 时。为什么建议使用 Request 呢?这是由于 Request 的生命周期仅在一次请求和响应中,如果响应完成,当前的这个 Request 就会被销毁,JVM 的 GC 就有可能将其回收。
      

  5.   

    session保存对象的作用域在于比较大,如果用户访问量大,内存占用很大。
      

  6.   

    HttpSession 中一般只存放一些诸如用户名、验证码之类的数据。我看到有很多人写的分页程序,把很多的查询条件,甚至查询结果都往 Session 里面塞,实际上这是一种极其不好的编程习惯,有点投机取巧,为了自己方便,而恣意地占用服务器宝贵的 JVM 内存。草拟了两上 FAQ,希望能帮助楼主理解:F:上面说到了验证码,为什么验证码能存在 Session 中呢?
    Q:这是由于验证码需要做到一定程度上的保密,并且在验证完成后我们会主动销毁这个验证码,也就是说验证码的生命周期基本上在一个或多个请求/响应阶段。F:我把那些查询条件,结果集在用户完成后也可以主动完成啊?
    Q:我们可以设计这样一个场景:当用户点击查询后,我们在后台把所有的查询条件,以及两三页的结果集存放到 Session 中去了,然后返回给视图层,用户在看完第一页的数据后,可能会点下一页的数据,由于那些结果集在 Session 中已经存在了,我们后台或许直接在内存中就能完成这个分页操作,用户在看第二页时,会感到很快。这时用户不想看了,去点击其他页面了,这时我们服务器的 Servlet 容器当前连接的 Session 中还保存着那些数据,这些数据在用户关闭浏览器或者再回到这个页面查询前,都会成为服务器的垃圾而没有用处的东西。如果我们的应用的页面有很多都是这样操作的,那么我们的服务器 JVM 内存中的垃圾就会越来多,不幸的是,JVM 的 GC 并不认为这些是垃圾,GC 将会对这些数据视之而不理。直到用户关闭浏览器,销毁了 Session 后,JVM 的 GC 才会将这些垃圾回收掉。
      

  7.   

    在session里面放东西是很耗内存的,降低服务器的性能,最好在request中以参数形式(比如传id等唯一性对象标记)传递,然后得到标记,就是得到待操作的对象数据。