2012-01-12 27 views
6

Tôi tự hỏi, nếu phương pháp init của một HttpServlet được gọi là sau khi deserialization.HttpServlet vòng đời và serialization

Tôi không biết liệu có bất kỳ vùng chứa nào sắp xếp tuần tự một servlet hay không nhưng nó thực hiện giao diện Serializable để có khả năng thực hiện điều đó.

JavaDoc cho phương thức init chỉ ra: "Được gọi bởi thùng chứa servlet để chỉ ra một servlet mà servlet được đặt vào dịch vụ."

Là quá trình deserialization bằng "được đặt vào dịch vụ"?

+2

Tôi chắc rằng một servlet không bao giờ được đăng. Đó là một singleton, và thường hoàn toàn vô quốc tịch. Tôi sẽ không thấy điểm trong việc tuần tự hóa nó. Dù sao, không cần biết nó mới được khởi tạo hay deserialized, phương thức init phải được gọi khi nó được đặt vào dịch vụ, vì vậy một thùng chứa servlet sẽ vi phạm spec nếu nó đặt servlet vào dịch vụ mà không khởi tạo nó. –

Trả lời

5

Trong khi tôi chưa bao giờ thực sự xử lý một container có thể hoán đổi một servlet bằng cách tuần tự hóa nó, và tôi thực sự không thể tưởng tượng được khi một container hiện đại làm điều này, nhưng tôi luôn hiểu rằng init() được gọi chính xác một lần đối với servlet trong vòng đời của nó, do đó, nó sẽ không phải được gọi lại trên deserialization. Như với bất cứ điều gì Serializable bạn sẽ cần phải viết xử lý đặc biệt bằng cách thực hiện readFields().

+3

Ok ở đây nó bắt đầu trở nên phức tạp. GenericServlet (trong đó giới thiệu. Giao diện Serializable trong hệ thống phân cấp) chỉ nói: "Được gọi bởi thùng chứa servlet để chỉ ra cho một servlet rằng servlet đang được đặt vào dịch vụ." Điểm khác: "Vùng chứa servlet gọi phương thức init chính xác một lần sau khi khởi tạo servlet." được nói trong JavaDoc của giao diện Servlet không thể tuần tự hóa được. – cpater

+2

Một điểm khác là ServletConfig được chuyển tới phương thức init được lưu trữ trong trường thoáng qua ... – cpater

Các vấn đề liên quan