2014-09-25 3 views
0

호기심에서 HttpServlet 클래스의 코드를보고 부모 클래스 "GenericServlet"이 인터페이스 "ServletConfig"에 선언 된 getServletName() 메소드를 정의한다는 것을 알았습니다. 그러나 ServletConfig의 객체 "sc"가 null이 아닌 경우 GenericServlet의 getServletName() 메소드는 "sc.getServletName()"을 호출합니다. 방법의 구현을 보려면 이클립스에서 Ctrl + 클릭을 할 때 스스로를 호출하는 것처럼 보이기 때문에이 함수가 어떻게 작동하는지 이해할 수 없습니다! HttpServlet 클래스에도 오버라이드 된 구현이 없습니다! 여기 getServletName()은 Java에서 어떻게 작동합니까?

는 GenericServlet의 구현의 스냅 샷입니다 :

public String getServletName() { 
    ServletConfig sc = getServletConfig(); 
    if (sc == null) { 
     throw new IllegalStateException(
      lStrings.getString("err.servlet_config_not_initialized")); 
    } 

    return sc.getServletName(); 
} 

사람이 날 계몽 수 ..

+1

스스로 부르는 것이 아닙니다. GenericServlet이 this.getServletName()이 아닌 servletConfig.getServletName()을 호출 중입니다. GenericServlet은 ServletConfig 인터페이스를 쉽게 구현하지만, servletConfig는 아닙니다. 그것은 init (ServletConfig config) 메소드를 통해 serveltConfig 객체를 얻고 있습니다.그런 다음 getServletName() 메서드에서이 호출을 config.getServletName() 메서드에 전달하는 프록시 역할을합니다. 여기서 이해하지 못하는 부분은 무엇입니까 ?? – Gas

+0

네가 맞다. @Gas하지만 ServletConfig의 getServletName()이 단지 추상적 인 메소드이기 때문에 서블릿의 이름을 반환하는 방법은 내가 얻지 못하는 것이다. 또한 GenericServlet 클래스에서 "sc.getServletName()"을 Ctrl + 클릭하여 구현을 확인하면 다시 같은 방법으로 우리를 데려 갈 것입니다! 나는 String (Servlet의 이름)이 어디에서 본질적으로 반환되는지 알고 싶다. –

답변

3

javax.servlet.GenericServletServletConfig 인터페이스를 구현하지만 ServletConfig .IT 사용의 실제 구현을 포함하지 않는 container에 의해 제공되고 init 메서드를 호출하는 config 개체를 사용하여 위임 할 수 있습니다.

GenericServlet

init(ServletConfig config) 방법은 파라미터로 (톰캣위한 StandardWrapperFacade OBJ이다) ServletConfig 오브젝트를 취해 container 호출시 config 가변 인스턴스에 대한 참조를 저장한다.

  • 초기화 방법

    public void init(ServletConfig config) throws ServletException { 
    this.config = config;//assign config to the instance variable 
    this.init(); 
    } 
    
  • getServletName 방법

    public String getServletName() { 
        ServletConfig sc = getServletConfig();//returns the ref of instance variable i.e. config 
        if (sc == null) { 
         throw new IllegalStateException(
          lStrings.getString("err.servlet_config_not_initialized")); 
        } 
    
        return sc.getServletName();//call method on config object 
        } 
    } 
    


    그 때문에 그것은 CURR에 getServletName()를 호출 아니에요 엔트 예 (this는) 대신 서블릿을에 약식 동안 servlet container에 의해 전달되는 config 객체를 부르고있다.


또한 servlet Life-Cycle 봐야한다.

톰캣의 경우 org.apache.catalina.core.StandardWrapperServletConfig 인터페이스의 실제 구현을 제공합니다.

UPDATE : -

당신이 다음 object.getClass().getName(); 방법을 사용할 수있는 기본이되는 클래스의 이름을 얻고 싶다면.

+1

Thanks @Vikrant 나는 또한 실제 구현이 어딘가에 있어야한다고 생각하고 있었다. 그리고 여러분이 지우고, org.apache .catalina.core.StandardWrapper (Tomcat은 getName()을 다시 호출하여 이름을 반환합니다). :) 이전에 내 질문에 전화가 재귀 적이라고 오해되었다고 생각합니다. 왜냐하면 sc.getServletName()에서 Ctrl + 클릭을 일일이 클릭하기 때문에 동일한 방법으로 날 데려갔습니다! 어쨌든, 고마워. :) –

관련 문제