2012-11-09 2 views
0

다음 서블릿에 GET 요청을 한 후 'In service method'텍스트가 작성되어 설명 할 수 없습니다. 그게 왜? 왜 표시됩니다 HttpServlet (라인 607)에서 코드를 읽기일단 서비스()를 재정의하면 위임은 doGet()에 도착하지 않습니다.

import javax.servlet.*; 
import javax.servlet.http.*; 
import java.io.*; 

public class MyServlet extends HttpServlet { 
    public void service(HttpServletRequest req, 
         HttpServletResponse resp) throws IOException { 
     Writer out = resp.getWriter(); 
     out.write("In Service method"); 
    } 

    public void doGet(HttpServletRequest req, HttpServletResponse resp) 
                 throws IOException { 
     Writer out = resp.getWriter(); 
     out.write("In get method"); 
    } 
} 

답변

2

HttpServlet#service()의 기본 구현은 exactly 해당 작업을 수행합니다. 다음은 javadoc의 일부입니다.

공용 서비스 메소드에서 표준 HTTP 요청을 수신하고이를이 클래스에 정의 된 doXXX 메소드에 전달합니다. 이 메서드는 Servlet.service(javax.servlet.ServletRequest, javax.servlet.ServletResponse) 메서드의 HTTP 관련 버전입니다. 이 방법을 재정의 할 필요가 없습니다.

HTTP 메소드에 따라 적절한 서블릿 메소드에 위임합니다. 예 : request.getMethod()"GET"과 같으면 doGet()으로 위임합니다. 그건 그렇고, 마지막 문장도 읽었 니?

어쨌든 기본적으로 매우 똑같은 일을 직접 수행해야합니다.

@Override 
public void service(HttpServletRequest req, HttpServletResponse resp) throws IOException { 
    Writer out = resp.getWriter(); 
    out.write("In Service method"); 

    if ("GET".equalsIgnoreCase(req.getMethod())) { 
     doGet(req, resp); 
    } 
    // Check other methods as well! 
} 

또는 super 메서드를 호출하여 작업을 수행 할 수 있습니다.

@Override 
public void service(HttpServletRequest req, HttpServletResponse resp) throws IOException { 
    Writer out = resp.getWriter(); 
    out.write("In Service method"); 
    super.service(req, resp); 
} 

또는 전혀 무시하지 마십시오.

+1

*** 가장 좋은 방법은 *** 서비스 방법을 재정의하지 않는 것입니다. –

+1

예, 그것은 무엇입니까 ** 절대 HttpServlet에서 서비스()를 무시하지 마십시오! ** – Joe

1

. service()은 적절한 doXXX 메소드에 위임 할 책임이 있습니다.

HttpServlet 하위 클래스가 아닌 일반 Servlets (또는 GenericServlet)에 대해 읽어 볼 수 있습니다. docs에서 볼 수있는 것은 서블릿이 프로토콜 독립적 인 반면 HttpServlet은 확실히 프로토콜 의존적이라는 것입니다.

1

HttpServlet의 서비스 메서드는 요청이 GET인지 POST인지를 실제로 확인합니다. 그러면 요청 유형에 따라 적절한 메서드가 호출됩니다.

관련 문제