1. 程式人生 > >Servlet處理GET和POST請求

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作除數。