为什么HttpServlet实现Serializable?

时间:2008-10-07 18:27:52

标签: java session servlets serializable

在我对Servlet的理解中,Servlet将由Container实例化,其init()方法将被调用一次,并且servlet将像单例一样生存直到JVM关闭。

我不希望我的servlet被序列化,因为它将在app服务器恢复或正常启动时构建为新的。 servlet应该不包含特定于会话的成员,因此将其写入磁盘并重新实例化是没有意义的。 这有实际用途吗?

我担心的是,我在其中放置了一些不可序列化的字段,然后我的应用程序将在生产环境中神秘地失败,在该环境中将发生不同类型的会话复制。

5 个答案:

答案 0 :(得分:59)

从技术上讲,我相信servlet容器允许将servlet对象“钝化”到磁盘上,其方式与EJB会话bean类似。因此,如果您的应用因非序列化字段而失败,那么您提出的问题是正确的。

在实践中,我从来没有听说过这样做的容器,所以它实际上只是早期J2EE早期糟糕的遗产。我不担心。

答案 1 :(得分:10)

HttpServlet应该通过序列化到磁盘并在servlet容器重启后继续运行。例如,tomcat允许你设置标志,使这种生存。下一个选项是使用JNDI进行传输。这不是垃圾,只在极端使用情况下使用。

答案 2 :(得分:1)

谷歌似乎建议这样做,以便容器作者可以选择,如果他们想要的话。

你是正确的,servlet不应该没有特定于会话的成员,事实上我认为你想要尽可能少的状态。如果您将所有内容存储在Session或ServletConfig中,我认为您将能够在序列化中存活。

答案 3 :(得分:0)

就像Session对象被序列化以使那些提供集群选项的servletcontainer的缓存更生存时,可能有一个容器可以选择将Servlet实例传输到另一个集群节点?我只是在这里猜测

答案 4 :(得分:-3)

Serializable用作分布式环境中会话属性的标记接口

  

SRV.7.7.2分布式环境(JSR-154)

     

在标记为 distributable 的应用程序中,所有请求都是   会话的一部分必须由一个Java虚拟机处理   (“JVM”)一次。容器必须能够处理所有对象   使用setAttribute放入HttpSession类的实例   或putValue方法适当。以下限制是   强制要求满足这些条件:

     
      
  • 容器必须接受实现Serializable接口的对象
  •   
  • 会话迁移将由特定于容器的设施处理。
  •   
     

分布式servlet容器必须抛出一个   对于容器不能的对象,IllegalArgumentException   支持迁移会话存储所需的机制   它们

     

分布式servlet容器必须支持必要的机制   对于   迁移实现Serializable的对象

     

(...)

     

Container Provider可以确保可扩展性和服务质量   具有负载平衡和故障转移等功能   从任何活动节点移动会话对象及其内容   分布式系统到系统的不同节点。如果是分布式的   容器持久或迁移会话以提供质量   服务功能,它们不限于使用本机JVM   序列化HttpSessions的序列化机制及其应用   属性。开发人员无法保证容器会调用   会话属性上的readObject和writeObject方法(如果它们)   实现它们,但保证Serializable的关闭   他们的属性将被保留