Servlet處理GET和POST請求
doGet() 、 doPost()、service()方法
doGet()表示,當客戶端是使用get方式請求該servlet時,那麼就會觸發執行doGet()方法中的程式碼。
doPost()表示,當客戶端是使用post方式請求該servlet時,那麼就會觸發執行doPost()方法中的程式碼。
而service()方法,既可以接收並處理get請求,也可以接收並處理post請求。
如果這三個方法都被重寫時,service()的優先順序是高於doGet()和doPost()的,所以,即使客戶端使用get或者post方式請求該servlet,但是伺服器因為存在service()方法,即使存在doGet()和doPost(),也是會呼叫service()方法,而不會呼叫doGet()和doPost()方法的。
總結來說:如果servlet中有service()方法,那麼會優先呼叫service()方法來處理請求。
package lixin.gan; import java.io.IOException; import javax.servlet.ServletException; import javax.servlet.ServletRequest; import javax.servlet.ServletResponse; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; public class SecondServlet extends HttpServlet { @Override protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { System.out.println("收到GET請求"); } @Override protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { System.out.println("收到POST請求"); } @Override public void service(ServletRequest req, ServletResponse resp) throws ServletException, IOException { System.out.println("收到請求(GET或者POST)"); } }
上面這個程式碼,無論是get請求,還是post請求,觸發的都是service()方法,都會在伺服器控制檯輸出 “收到請求(GET或者POST)”。
重寫service()方法,並呼叫父類service()方法
package lixin.gan; import java.io.IOException; import javax.servlet.ServletException; import javax.servlet.ServletRequest; import javax.servlet.ServletResponse; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; public class SecondServlet extends HttpServlet { @Override protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { System.out.println("收到GET請求"); } @Override protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { System.out.println("收到POST請求"); } @Override public void service(ServletRequest req, ServletResponse resp) throws ServletException, IOException { System.out.println("收到請求(GET或者POST)"); super.service(req, resp); // 當前servlet的service()處理完之後,再呼叫父類的service()方法 // 其實super.service()會根據req中的http頭資訊,判斷請求方式,在呼叫對應的doGet或者doPost } }
執行測試:
// 收到get請求後,控制檯的輸出 收到請求(GET或者POST) 收到GET請求 // 收到post請求後,控制檯的輸出 收到請求(GET或者POST) 收到POST請求
所以,在當前servlet中定義service()方法,並且呼叫super.service(),那麼父類的service()會根據req中的http頭資訊,判斷請求方式,在呼叫對應的doGet或者doPost。
一般,我們都不會在當前service()中呼叫super.service()方法。如果當前servlet沒有重寫doGet()方法,當客戶端發起get請求時,super.service()中呼叫doGet方法時,就會出現405錯誤。
Servlet中http錯誤狀態碼的產生原因
404(資源未找到)
1、客戶端發起的請求中,輸入的url中的servlet拼寫錯誤,在web.xml中的找不到對應的url-pattern(注意區分大小寫)。
2、客戶端發起的請求中,輸入的url中的專案名稱錯誤(注意區分大小寫)。
405(請求方式不支援)
1、假設使用者發起post請求,但是servlet中既沒有重寫service(),也沒有重寫doPost()方法,此時沒有就會出現405錯誤。
2、假設使用者發起post請求,該servlet中沒有重寫doPost()方法,但是重寫了service()方法,但是又在當前service()中呼叫super.service(),所以導致super.service()中呼叫doPost()失敗,
500(伺服器內部錯誤)
1、在web.xml中servlet的全限定路徑拼寫錯誤,web.xml寫的是aa.bb類,但是實際的java檔名稱是a.b類,導致url-pattern符合規則時,去找對應的class檔案時,沒有找到。
2、servlet物件的處理邏輯出現錯誤,比如0作除數。