2011-07-25 95 views
12

我正在讀一本關於servlet的書,在這本書中,我們將簡要說明servlet類以及HttpServlet類。我應該重寫service()還是doPost()?

有一個填寫表單的例子 - 對於該表單,該類的servlet的doPost()方法被覆蓋。但是,對於登錄表單的另一個示例,則會覆蓋service()方法。

我想知道爲什麼這兩種不同的方法 - 我認爲我們通常會將自定義代碼放入doPost()(或doGet()),並讓service()保持原樣。是否有任何理由使用這兩種方法中的任何一種,或者我可以在任何情況下使用這兩種方法嗎?

+2

我不會如果這本書只是試圖展示使用servlet的不同方式的例子,而不是說「你應該這樣做,或者那樣做」,那麼會感到驚訝。因爲真的,如果你正在開發一個認真的應用程序,你最終會學習和實現一個MVC框架(比如Struts,Spring或Wicket),而不是在servlet級別實現。 (只是對未來閱讀的建議。) – Marvo

回答

13

請勿重寫service()方法。首選方法是使用doPost()進行發佈,使用doGet()進行發佈。這是一個很好的職位,每個人都做了什麼。 http://www.jguru.com/faq/view.jsp?EID=47730

如果必須以未使用 HTTP協議由客戶端的請求做出響應,則必須使用服務()。

1

您最有可能重寫doXXX()方法,其中XXX表示HTTP方法,如GET,POST等。由容器調用的方法將決定調用哪個doXXX()。

4

我認爲你需要了解流程才能自己決定。 HttpServlet的缺省實現service()只是簡單地調用請求方法(GET,POST,其他)的相應處理程序。

當你想用相同的方法處理所有傳入的方法時(無論它是GET,PUT還是POST請求,你都會回答相同的問題),你需要覆蓋service()。如果您對分別對待每種方法感到滿意,請使用默認的service()實現並覆蓋特定的處理程序。

0

如果您必須響應HTTP協議客戶端(通常是瀏覽器)發出的GET或POST請求,請毫不猶豫地擴展HttpServlet並使用其便捷方法。 如果必須到未使用HTTP協議由客戶機發出的請求作出響應,則必須使用服務()

1

服務()方法屬於GenericServlet類和可以被重載以支持任何類型的協議,例如的作爲Http,FTP等

然後你有專門的servlet處理HttpProtocol,我們稱之爲HttpServlet。 HttpServlet還提供了service()和doGet()和doPost()方法的默認實現。

爲什麼我們不應該重寫service()方法?

因爲重寫服務方法不是一個好習慣。如果我們調用任何doxxx方法,那麼它將在內部調用HttpServlet的服務方法。所以你沒有必要明確地調用它。

訂購服務的執行()的:

服務(的ServletRequest,ServletResponse的) - >

- >調用

- >服務(HttpServletRequest的REQ,HttpServletResponse的水庫)

- >調用

- >的doGet/doPost方法(HttpServletRequest的REQ,HttpServletRespo NSE水庫)

這是可以如何重寫服務的情況下,你想:從SO社區通過托馬斯Nurkiewicz給出

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

執行代碼只 Overriding Service Method

相關問題