2011-07-25 12 views
12

Czytałem książkę o serwletach, w tej książce podano krótkie wyjaśnienie dotyczące klasy serwletu, a także klasy HttpServlet.Czy należy przesłonić service() lub doPost()?

Istnieje jeden przykład wypełniania formularza - dla tej formy metoda serwletu jest nadpisywana przez klasę. Ale dla innego przykładu formularza logowania metoda service() jest zastępowana.

Chcę wiedzieć, dlaczego 2 różne podejścia - myślałem, że zwykle umieszczamy nasz kod niestandardowy w doPost() (lub doGet()) i niech service() pozostają takie, jakie są. Czy jest jakiś powód, dla którego korzystasz z któregoś z dwóch podejść, czy też mogę zastosować oba podejścia w każdej sytuacji?

+2

I nie byłoby zaskoczony, jeśli książka po prostu stara się pokazać przykłady różnych sposobów korzystania z serwletu, w przeciwieństwie do powiedzenia "NALEŻY to zrobić, lub zrób to". Ponieważ tak naprawdę, jeśli tworzysz poważną aplikację, ostatecznie będziesz chciał studiować i wdrażać strukturę MVC (jak Struts, Spring lub Wicket), zamiast implementować rzeczy na poziomie serwletu. (Tylko sugestia do przyszłego czytania.) – Marvo

Odpowiedz

13

Nie zastępuj metody service(). Preferowanym podejściem jest użycie doPost() dla postu i doGet() dla get. Oto doskonały post na temat każdego z nich. http://www.jguru.com/faq/view.jsp?EID=47730

Jeśli trzeba odpowiedzieć na zapytania klienta, który nie korzysta z protokołu HTTP , należy skorzystać z usługi().

1

Najprawdopodobniej nadpisujesz metodę doXXX(), gdzie XXX oznacza metody HTTP, takie jak GET, POST itd. service() metoda wywołana przez kontener zdecyduje, która z doXXX() zostanie wywołana.

4

Myślę, że musisz zrozumieć przepływ, aby samemu zdecydować. Domyślna implementacja service() dla HttpServlet po prostu wywołuje odpowiedni handler dla metody żądania (GET, POST, cokolwiek).

Musisz zastąpić service(), jeśli chcesz, aby ta sama metoda obsługiwała wszystkie przychodzące metody (bez względu na to, czy jest to żądanie GET, PUT lub POST, odpowiesz tak samo dla wszystkich). Jeśli jesteś zadowolony z traktowania każdej metody osobno, skorzystaj z domyślnej implementacji service() i nadpisz określone programy obsługi.

0

Jeśli musisz odpowiedzieć na żądania GET lub POST wykonane przez klienta protokołu HTTP (zazwyczaj przeglądarkę), nie wahaj się rozszerzyć HttpServlet i skorzystaj z jego dogodnych metod. Jeśli trzeba odpowiedzieć na zapytania klienta, który nie jest z wykorzystaniem protokołu HTTP, należy skorzystać z usługi()

1

usługi() metoda należy do GenericServlet i może być przeciążony wspierać każdy rodzaj protokołu takiego jako Http, Ftp itp.

Następnie masz wyspecjalizowany serwlet do obsługi HttpProtocol, nazywamy go HttpServlet. HttpServlet zapewnia również domyślną implementację metod service() i doGet() oraz doPost().

Dlaczego nie należy zastępować metody service()?

Ponieważ nie jest dobrą praktyką zastępowanie metody serwisowej. Jeśli wywołasz dowolną metodę doxxx, to wewnętrznie wywoła ona metodę usługi HttpServlet. Więc nie ma potrzeby, abyś to wyraźnie nazywał.

kolejność wykonywania usługi():

usługi (ServletRequest, ServletResponse) ->

-> Połączenia

-> service (HttpServletRequest req, HttpServletResponse res)

-> połączenia

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

ten sposób można zastąpić usługę w przypadku, gdy chcesz: Kod

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); 
}} 

Realizacja podane przez Tomasz Nurkiewicz z tak społeczności tylko Overriding Service Method

Powiązane problemy