servletにおけるservice doGet doPostの関係


servletのデフォルトでは、getでもpostでもサービス()メソッドで処理され、doGetに移行します.
あるいはdoPostメソッド、HttpServeretクラスのサービスメソッドを見ることができます:
 protected void service(HttpServletRequest req, HttpServletResponse resp)
        throws ServletException, IOException
    {
        String method = req.getMethod();
        if(method.equals("GET"))
        {
            long lastModified = getLastModified(req);
            if(lastModified == -1L)
            {
                doGet(req, resp);
            } else
            {
                long ifModifiedSince = req.getDateHeader("If-Modified-Since");
                if(ifModifiedSince < (lastModified / 1000L) * 1000L)
                {
                    maybeSetLastModified(resp, lastModified);
                    doGet(req, resp);
                } else
                {
                    resp.setStatus(304);
                }
            }
        } else
        if(method.equals("HEAD"))
        {
            long lastModified = getLastModified(req);
            maybeSetLastModified(resp, lastModified);
            doHead(req, resp);
        } else
        if(method.equals("POST"))
            doPost(req, resp);
        else
        if(method.equals("PUT"))
            doPut(req, resp);
        else
        if(method.equals("DELETE"))
            doDelete(req, resp);
        else
        if(method.equals("OPTIONS"))
            doOptions(req, resp);
        else
        if(method.equals("TRACE"))
        {
            doTrace(req, resp);
        } else
        {
            String errMsg = lStrings.getString("http.method_not_implemented");
            Object errArgs[] = new Object[1];
            errArgs[0] = method;
            errMsg = MessageFormat.format(errMsg, errArgs);
            resp.sendError(501, errMsg);
        }
    }

 
ここのサービスは転向に使用されていることがわかりますが、自分のservletクラスでサービスメソッドをカバーしている場合は、例えばサービスは次のようになります.
 
public void service(ServletRequest req, ServletResponse res)
                   throws ServletException, IOException {
        res.getOutputStream().print(
         "image is <img src='images/downcoin.gif'></img><br>");
    }

 
では、サービスは転向するためではなく、ビジネスを処理するために使用されます.今、クライアントがposでもgetでもこのservletを要求しても構いません.
いずれもサービスメソッドを実行し、servletメソッドのみを実行し、doPostメソッドやdoGetメソッドは実行しません.
 
たとえば、クライアントコードは次のようになります.
<%@page contentType="text/html; charset=utf-8"%>
<html>
<head><title>  </title></head>
<body>
         :<br>
<form action = "Test" method = "post">
<input type="checkbox" name="fruit" value ="apple" >  <br>
<input type="checkbox" name="fruit" value ="orange">  <br>
<input type="checkbox" name="fruit" value ="mango">  <br>
<input type="submit" value="  ">
</form>
</body>
</html>

   servlet :Test 

import java.io.IOException;

import javax.servlet.ServletException;
import javax.servlet.ServletOutputStream;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

/**
 *   service  
 */
public class Test extends HttpServlet {

 public void service(ServletRequest req, ServletResponse res)
   throws ServletException, IOException {
           res.getOutputStream().print("This is the service");

 }

 protected void doGet(HttpServletRequest request,
   HttpServletResponse response) throws ServletException, IOException {
  doPost(request,response);

 }
 protected void doPost(HttpServletRequest request,
   HttpServletResponse response) throws ServletException, IOException {
  ServletOutputStream out=response.getOutputStream();
  String[] args=(String[])request.getParameterValues("fruit");
  for(int i=0;i<args.length;i++){
   out.print(args[i]+"<br>");
  }
  
 }
}