HttpServlet可以不重寫service方法的原因

序言

當我們繼承HttpServlet類的時候,其實我們只需要重寫servlet中的doGet方法,和doPost方法,無需再進行重寫service方法。

打開httpservlet的源碼文件,查看大概在第658行處service函數的定義,在這裏可以看到service函數無論如何最終都是要進行doGet或者是doPost的調用,所以我們在繼承Httpservlet類的時候,可以直接對doGet和doPost進行重寫

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

        if (method.equals(METHOD_GET)) {
            long lastModified = getLastModified(req);
            if (lastModified == -1) {
                // servlet doesn't support if-modified-since, no reason
                // to go through further expensive logic
                doGet(req, resp);
            } else {
                long ifModifiedSince = req.getDateHeader(HEADER_IFMODSINCE);
                if (ifModifiedSince < lastModified) {
                    // If the servlet mod time is later, call doGet()
                    // Round down to the nearest second for a proper compare
                    // A ifModifiedSince of -1 will always be less
                    maybeSetLastModified(resp, lastModified);
                    doGet(req, resp);
                } else {
                    resp.setStatus(HttpServletResponse.SC_NOT_MODIFIED);
                }
            }

        } else if (method.equals(METHOD_HEAD)) {
            long lastModified = getLastModified(req);
            maybeSetLastModified(resp, lastModified);
            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 {
            //
            // Note that this means NO servlet supports whatever
            // method was requested, anywhere on this server.
            //

            String errMsg = lStrings.getString("http.method_not_implemented");
            Object[] errArgs = new Object[1];
            errArgs[0] = method;
            errMsg = MessageFormat.format(errMsg, errArgs);
            
            resp.sendError(HttpServletResponse.SC_NOT_IMPLEMENTED, errMsg);
        }
    }

測試

創建客戶端提交表單

<!DOCTYPE html>
<html>
	<head>
		<meta charset="UTF-8">
		<title>Insert title here</title>
	</head>
	<body>
		<form action="http://localhost:8080/Demo_03/my_http_servlet" method="get">
			ID:<input type="text" name="IdNumber">
			Pw:<input type="password" name="pw">
			使用get方法提交<input type="submit" name = "GetSubmit">
		</form>
		</br>
		<form action="http://localhost:8080/Demo_03/my_http_servlet" method="post">
			ID:<input type="text" name="IdNumber">
			Pw:<input type="password" name="pw">
			使用get方法提交<input type="submit" name = "GetSubmit">
		</form>
	</body>
</html>

創建對應類

package com.demo03_httpServlet;

import java.io.IOException;
import java.net.InetSocketAddress;
import java.util.concurrent.Executor;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import com.sun.net.httpserver.HttpContext;
import com.sun.net.httpserver.HttpHandler;
import com.sun.net.httpserver.HttpServer;

public class MyHttpServlet extends HttpServlet {

	@Override
	protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
		
		String MethodName = req.getMethod();
		System.out.println("當前使用的請求方法:" + MethodName);
	}

	@Override
	protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
		String MethodName = req.getMethod();
		System.out.println("當前使用的請求方法:" + MethodName);
	}

	
	

}

配置文件

<!-- HttpServlet獲取請求的演示 -->
  
  <servlet>
  	<servlet-name>MyHttpServlet</servlet-name>
  	<servlet-class>com.demo03_httpServlet.MyHttpServlet</servlet-class>
  </servlet>
  <servlet-mapping>
  	<servlet-name>MyHttpServlet</servlet-name>
  	<url-pattern>/my_http_servlet</url-pattern>
  </servlet-mapping>

運行測試

在這裏插入圖片描述
在這裏插入圖片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章