2011-07-25 26 views
12

Tôi đã đọc một cuốn sách về các servlet, trong cuốn sách đó một lời giải thích ngắn gọn được đưa ra về lớp servlet, cũng như lớp HttpServlet.Tôi có nên ghi đè lên dịch vụ() hoặc doPost() không?

Có một ví dụ để điền vào biểu mẫu - cho biểu mẫu đó, phương thức doPost() của servlet bị ghi đè bởi lớp. Nhưng ví dụ khác về biểu mẫu đăng nhập, thay vào đó, phương thức service() được ghi đè.

Tôi muốn biết tại sao 2 phương pháp tiếp cận khác nhau - tôi nghĩ rằng thường chúng tôi đặt mã tùy chỉnh của chúng tôi vào doPost() (hoặc doGet()) và để service() vẫn như cũ. Có lý do nào đằng sau việc sử dụng một trong hai cách tiếp cận, hoặc tôi có thể sử dụng cả hai cách tiếp cận trong mọi tình huống không?

+2

tôi sẽ không ngạc nhiên nếu cuốn sách chỉ đang cố gắng trình bày các ví dụ về các cách khác nhau để sử dụng một servlet, trái với việc nói "bạn NÊN làm điều này, hoặc làm điều đó." Bởi vì thực sự, nếu bạn đang phát triển một ứng dụng nghiêm túc, cuối cùng bạn sẽ muốn nghiên cứu và thực hiện một khung công tác MVC (như Struts, Spring hoặc Wicket) thay vì thực hiện những thứ ở cấp servlet. (Chỉ là một gợi ý để đọc trong tương lai.) – Marvo

Trả lời

13

Không ghi đè phương pháp service(). Cách tiếp cận ưa thích là sử dụng doPost() cho bài đăng và doGet() để nhận. Đây là một bài tuyệt vời về những gì từng làm. http://www.jguru.com/faq/view.jsp?EID=47730

Nếu bạn phải trả lời các yêu cầu của khách hàng không sử dụng giao thức HTTP , bạn phải sử dụng dịch vụ().

1

Bạn có thể ghi đè lên phương thức doXXX() trong đó XXX là viết tắt của phương thức HTTP như GET, POST, v.v. Phương thức service() được gọi bởi vùng chứa sẽ quyết định phương thức doXXX() nào được gọi.

4

Tôi nghĩ bạn cần hiểu luồng để tự quyết định. Việc triển khai mặc định service() cho một HttpServlet chỉ cần gọi trình xử lý thích hợp cho phương thức yêu cầu (GET, POST, bất kỳ điều gì).

Bạn cần ghi đè service() khi bạn muốn cùng một phương pháp xử lý tất cả các phương thức gửi đến (cho dù đó là yêu cầu GET, PUT hoặc POST, bạn sẽ trả lời giống nhau cho tất cả). Nếu bạn hài lòng với việc xử lý từng phương thức riêng biệt, hãy thực hiện dịch vụ mặc định() và ghi đè các trình xử lý cụ thể.

0

Nếu bạn phải trả lời các yêu cầu GET hoặc POST được thực hiện bởi máy khách giao thức HTTP (thường là trình duyệt), đừng ngần ngại mở rộng HttpServlet và sử dụng các phương thức tiện lợi của nó. Nếu bạn phải trả lời yêu cầu thực hiện bởi một khách hàng không được sử dụng giao thức HTTP, bạn phải sử dụng dịch vụ()

1

Dịch vụ() phương pháp thuộc về GenericServlet và có thể bị quá tải để hỗ trợ bất kỳ loại giao thức như vậy như Http, Ftp, v.v.

Sau đó, bạn có servlet chuyên biệt để xử lý HttpProtocol, chúng tôi gọi nó là HttpServlet. HttpServlet cũng cung cấp việc thực hiện mặc định cho các phương thức service() và doGet() và doPost().

Tại sao chúng ta không nên ghi đè lên phương thức dịch vụ()?

Vì thực tiễn không tốt để ghi đè phương thức dịch vụ. Nếu chúng ta gọi bất kỳ phương thức doxxx nào thì nội bộ nó sẽ gọi phương thức dịch vụ của HttpServlet. Vì vậy, bạn không cần phải gọi nó một cách rõ ràng.

tự thực hiện dịch vụ():

dịch vụ (ServletRequest, ServletResponse) ->

-> gọi

-> dịch vụ (HttpServletRequest req, HttpServletResponse res)

-> gọi

-> doGet/doPost (HttpServletRequest req, HttpServletRespo res NSE)

Đây là cách bạn có thể ghi đè lên các dịch vụ trong trường hợp bạn muốn: Mã

protected void service(HttpServletRequest req, HttpServletResponse resp) { 
String method = req.getMethod(); 

if (method.equals(METHOD_GET)) { 
     doGet(req, resp); 
} else if (method.equals(METHOD_HEAD)) { 
    doHead(req, resp); 
} else if (method.equals(METHOD_POST)) { 
    doPost(req, resp); 

} else if (method.equals(METHOD_PUT)) { 
    doPut(req, resp); 

} else if (method.equals(METHOD_DELETE)) { 
    doDelete(req, resp); 

} else if (method.equals(METHOD_OPTIONS)) { 
    doOptions(req,resp); 

} else if (method.equals(METHOD_TRACE)) { 
    doTrace(req,resp); 

} else { 
    resp.sendError(HttpServletResponse.SC_NOT_IMPLEMENTED, errMsg); 
}} 

thực hiện do Tomasz Nurkiewicz từ SO cộng đồng chỉ Overriding Service Method

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