2009-07-26 32 views
20

Điều gì (nếu có) là sự khác biệt giữa việc lưu trữ một biến trong ServletContext và chỉ có nó như là một thành viên tĩnh công cộng của một trong các lớp?Phạm vi bối cảnh Servlet vs biến toàn cục

Thay vì viết:

// simplified (!) 
int counter = (Integer)getServletContext().getAttribute("counter"); 
counter++; 
this.getServletContext().setAttribute("counter", counter); 

Tại sao không chỉ có:

// in class MyServlet 
public static int counter = 0; 

// in a method somewhere 
MyServlet.counter++; 

(Bỏ qua vấn đề đồng thời, xin vui lòng, đây chỉ là một ví dụ câm)

Từ những gì tôi có thể nói , hai tùy chọn này hoạt động theo cùng một cách dưới Tomcat. Có điều gì tốt hơn về việc sử dụng tùy chọn đầu tiên không?

Trả lời

17

Vùng chứa web biết về ngữ cảnh servlet của bạn, nhưng không phải về các biến tĩnh của bạn, chẳng hạn như skaffman says là riêng tư với trình nạp lớp của bạn.

Bất kỳ thứ gì khiến một yêu cầu khác nhau được phục vụ bởi một cá thể ứng dụng trong trình nạp lớp khác nhau (điều này có thể là khởi động lại máy chủ, triển khai lại ứng dụng web hoặc máy chủ nhiều nút). Ngữ cảnh servlet sẽ tồn tại những thứ này khi container web biết về nó và có thể tuần tự hóa nó hoặc có một kho lưu trữ chung.

14

Chúng không hoàn toàn giống nhau; servlet-context-scope là private đối với webapp, trong khi static scope là private đối với classloader. Tùy thuộc vào vùng chứa của bạn và cách nó được định cấu hình, những thứ này có thể hoặc có thể không giống nhau. Khi suy nghĩ về các ứng dụng web và JavaEE, việc sử dụng một trường tương ứng với ngữ cảnh sẽ đáng tin cậy hơn. Ngoài ra, các thuộc tính theo phạm vi ngữ cảnh dễ truy cập hơn từ các JSP, tức là bạn không cần tập lệnh để truy cập chúng.

+0

chúng ta có thể lưu trữ vĩnh viễn giá trị trong cho một tên cụ thể không, để truy cập tiếp theo thông số đó sẽ cung cấp giá trị cập nhật tức là lệnh gọi getServletContext(). GetInitParameters ("name"); sẽ cung cấp cho các giá trị cập nhật được thực hiện bởi chương trình cuối cùng? – Ars

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