2010-10-28 29 views
5

Tôi có một lớp public class GAE_SERVLETREQUESTServlet extends HttpServlet {Nếu một thùng chứa servlet tạo ra thể hiện javax.servlet.http.HttpServlet mới cho mỗi yêu cầu gửi đến?

Không chắc chắn thông số nào nói về việc tái chế HTTPServlet: Nếu thùng chứa servlet tạo cá thể mới của lớp này trên mỗi yêu cầu đến hoặc có thể triển khai sử dụng lại lớp giữa các yêu cầu không?

Tôi đang điều tra một vấn đề buồn cười có vẻ như một Bản đồ được tạo trên thể hiện GAE_SERVLETREQUESTServlet duy trì trạng thái giữa các yêu cầu.

+0

Bản đồ có được định nghĩa là biến mẫu không? – JoseK

+0

@JoseK: Có, được bảo vệ (không tĩnh). –

+1

Liên quan: http://stackoverflow.com/questions/3106452/java-servlet-instantiation-and-session-variables – BalusC

Trả lời

11

Đối với trường hợp chung - không phân phối, đa luồng, đảm bảo rằng chỉ có một phiên bản của servlet. Từ Servlet 3.0 đặc điểm kỹ thuật:

2,1 Yêu cầu xử lý Phương pháp

Giao diện Servlet cơ bản định nghĩa một phương pháp dịch vụ để xử lý yêu cầu khách hàng. Phương thức này được gọi cho mỗi yêu cầu rằng thùng chứa servlet định tuyến đến một cá thể của một servlet. Việc xử lý các yêu cầu đồng thời đối với một ứng dụng Web thường yêu cầu các servlet thiết kế Web Developer có thể xử lý nhiều luồng thực thi trong vòng phương thức dịch vụ tại một thời điểm cụ thể. Nói chung, thùng chứa Web xử lý các yêu cầu đồng thời tới cùng một servlet bằng cách thực hiện đồng thời phương thức dịch vụ trên các luồng khác nhau.

2.2 Số Instances

Việc kê khai servlet đó là hoặc thông qua các chú thích như mô tả trong Chương 8, “Chú thích và pluggability” hoặc một phần của bộ mô tả triển khai các ứng dụng Web chứa servlet, như được mô tả trong Chương 14, “Triển khai Bộ mô tả”, điều khiển cách thùng chứa servlet cung cấp các cá thể của servlet. Đối với một servlet không được lưu trữ trong môi trường phân tán (mặc định), vùng chứa servlet chỉ được sử dụng một cá thể cho mỗi khai báo servlet. Tuy nhiên, đối với servlet triển khai giao diện SingleThreadModel, thùng chứa servlet có thể khởi tạo nhiều trường hợp để xử lý yêu cầu tải nặng và yêu cầu tuần tự cho một trường hợp cụ thể.

Trong trường hợp servlet được triển khai như một phần của ứng dụng được đánh dấu trong bộ mô tả triển khai , có thể chỉ có một trường hợp trên khai báo servlet cho mỗi máy ảo Java (JVM ™) 1. Tuy nhiên, nếu servlet trong một ứng dụng phân phối thực hiện giao diện SingleThreadModel, vùng chứa có thể khởi tạo nhiều phiên bản của servlet đó trong mỗi JVM của vùng chứa.

0

Nếu bạn đang lưu dữ liệu có liên quan đến từng người dùng, bạn nên lưu trữ dữ liệu đó trong Phiên HTTP. Như đã nói bởi skaffman, không lưu trữ dữ liệu trong lớp servlet mà bạn mong đợi khác nhau cho mỗi người dùng. Đây là một ví dụ nhanh.

 

class MyServlet extends HttpServlet 
{ 
    private Object ThisIsTheWrongPlaceToStorePerUserData; 

    ... stuff ... doPut(HttpServletRequest httpRequest, ... more stuff ...) 
    { 
     Object iAmGood = new Object(); 
     HttpSession session = httpRequest.getSession(true); 

     session.setAttribute("GoodPlaceToStorePerUserData", iAmGood); 

     ... stuff ... 
    } 
} 
 
+0

Tôi không muốn lưu trữ đối tượng trong phiên vì tôi không có lý do để bắt đầu cookie trên người dùng, cũng như tôi không muốn lưu trữ dữ liệu trạng thái "mỗi người dùng" của phía máy chủ. Đây là một dịch vụ phụ trợ và đó là toàn bộ lý do tôi bắt đầu tìm kiếm các giải pháp thay thế. Tôi đã cố định mã của tôi ngay bây giờ và thẳng thắn là một chút xấu hổ khi đã thực hiện một sai lầm tân binh :) –

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