Tôi mới sử dụng Servlets. Tôi muốn sử dụng một phương thức được gọi chỉ một lần sau khi triển khai đến máy chủ. Tôi đã xem HttpServlet#init()
. Nhưng tôi đã tìm ra nó được gọi với mỗi yêu cầu. Tôi có hiểu sai không? Các phương án thay thế cho init()
là gì?Tôi muốn sử dụng một phương thức chỉ được gọi một lần sau khi triển khai đến Server
Trả lời
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>
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.
Bạn đang tìm kiếm một ServletContextListener?
- 1. Java Enums: Phương thức triển khai sau khi khai báo?
- 2. Sau khi hoàn thành hoạt ảnh muốn gọi một số phương thức
- 3. Tại sao tôi không thể gọi phương thức riêng tư khi tôi ở trong một phương thức công khai?
- 4. Chuyển một điều kiện bool đến phương thức mà tôi có thể gọi khi tôi cần
- 5. AngularJS có thể sử dụng phương thức $ trên một lần cho một lần phát sóng $?
- 6. Gọi phương thức mỗi lần trước khi bất kỳ phương pháp nào khác được gọi là
- 7. onGetViewFactory chỉ được gọi một lần cho nhiều tiện ích
- 8. Thêm tập tin vào một lần nhấp khi triển khai
- 9. Làm thế nào để gọi một phương thức trong UserControl sau khi nó được hiển thị?
- 10. Sử dụng scipy.stats.stats trong django sau khi triển khai
- 11. VB.NET - Một phương thức hoàn thiện có nên được bổ sung khi triển khai IDisposable không?
- 12. phương thức getItem() được gọi hai lần khi sử dụng Bộ chuyển đổi phân trang Fragment
- 13. Phương thức nào được gọi khi một QGraphicsItem được chọn
- 14. Ngăn chặn một phương thức được gọi trước một phương thức khác
- 15. jQuery, gọi lại chỉ một lần sau nhiều hoạt ảnh
- 16. UITextField không cuộn đến cuối sau khi triển khai textRectForBounds và editingRectForBounds trong một lớp con?
- 17. define_method không sử dụng biến cho đến khi phương thức được gọi?
- 18. Xác nhận rằng một phương thức được gọi chính xác một lần
- 19. Sử dụng một sự hiểu biết như một phím tắt để gọi một phương thức nhiều lần
- 20. Chỉ chạy mã một lần sau khi ứng dụng được cài đặt trên thiết bị Android
- 21. gọi một phương thức trang ascx sử dụng jquery
- 22. Backbone.js - Phương thức gọi trước/sau khi một tuyến đường được kích hoạt
- 23. Sử dụng class_getInstanceMethod - phương thức được triển khai trong hệ thống phân cấp lớp ở đâu?
- 24. Phương thức HttpModule Init được gọi nhiều lần - tại sao?
- 25. Phương thức Observer onChange được gọi là hai lần sau 1 thay đổi trong con trỏ
- 26. Chạy một phương pháp trước và sau khi một phương pháp gọi trong Java
- 27. Tại sao tôi nhận được "đối tượng không phải là một thể hiện khai báo lớp" khi gọi một phương thức sử dụng sự phản chiếu?
- 28. đoạn mã được gọi chỉ một lần - giá trị của phương pháp riêng?
- 29. Phương thức WebSecurity.InitializeDatabaseConnection chỉ có thể được gọi là
- 30. Tôi có nên sử dụng từ khóa "này" khi tôi muốn tham chiếu đến các biến mẫu trong một phương thức không?
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
'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
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