2010-03-02 26 views

Trả lời

20

Không, nó không được gọi trong mỗi yêu cầu. Nó chỉ được gọi trong quá trình khởi tạo servlet thường chỉ xảy ra một lần trong đời của webapp. Xem thêm this answer để biết thêm chi tiết về cách các servlet được tạo và thực hiện.

Nếu bạn thực sự muốn thực hiện một số khởi tạo toàn cầu/ứng dụng (do đó không phải chỉ áp dụng cho servlet cụ thể), thì bạn thường sử dụng ServletContextListener cho việc này. Bạn có thể thực hiện công cụ khởi tạo trong phương thức contextInitialized().

import javax.servlet.ServletContextEvent; 
import javax.servlet.ServletContextListener; 
import javax.servlet.annotation.WebListener; 

@WebListener 
public class Config implements ServletContextListener { 
    public void contextInitialized(ServletContextEvent event) { 
     // Do stuff during webapp's startup. 
    } 
    public void contextDestroyed(ServletContextEvent event) { 
     // Do stuff during webapp's shutdown. 
    } 
} 

Nếu bạn không phải trên Servlet 3.0 được nêu ra và không thể nâng cấp, và do đó không thể sử dụng @WebListener chú thích, sau đó bạn cần phải tự đăng ký nó trong /WEB-INF/web.xml như dưới đây:

<listener> 
    <listener-class>com.example.Config</listener-class> 
</listener> 
+0

cảm ơn, Vì vậy, sự khác biệt chính giữa contextInitialized và init(), những gì nên chạy đầu tiên? – mebada

+1

'ServletContextListener # contextInitialized()' được thực thi khi khởi động webapp. 'HttpServlet # init()' được thực thi khi khởi động servlet. Tôi nghĩ rằng bây giờ nó sẽ được rõ ràng với bạn rằng servlets không thể được khởi tạo/bắt đầu khi webapp chưa được bắt đầu. Kiểm tra liên kết đến câu trả lời khác để có được hình ảnh. Bạn thường sử dụng 'contextInitialized()' nếu bạn muốn nối vào khởi động webapp. Bạn thường sử dụng 'init()' nếu bạn muốn móc vào khởi động của servlet. Đó thực sự là tất cả. Nếu bạn thậm chí không biết những gì mã của riêng bạn là nghĩa vụ phải làm, sau đó tôi sẽ suy nghĩ lại một lần nữa (hoặc đặt một câu hỏi) – BalusC

+0

Tôi sẽ tải các tập tin cấu hình để được sử dụng sau này với mọi yêu cầu. – mebada

1

init() chỉ được gọi khi tạo servlet. Điều này có thể xảy ra nhiều lần trong suốt vòng đời của máy chủ. Bạn sử dụng nó để khởi tạo bất kỳ biến hoặc logic nào cần thiết để sử dụng thường xuyên servlet.

Chỉnh sửa: Sau khi đọc lại bài đăng của bạn, nó không được gọi kỹ thuật với mỗi yêu cầu vì máy chủ đang tạo một phiên bản mới của servlet cho mỗi yêu cầu. Kiểm tra cài đặt máy chủ của bạn xem liệu nó sẽ nhận được một servlet mới để giữ một servlet duy nhất cho tuổi thọ của máy chủ hay không.

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