초기화() 방법

그리고 몇 가지 다른 유용한 작은 것들. 물론 서블릿 초기화에 대해 이야기하고 있습니다. 이미 알고 있듯이 웹 서버는 서블릿 객체를 생성하고 컨테이너에 넣은 후 서블릿의 init() 메서드를 호출합니다 . 이 메서드를 재정의하고 필요한 모든 것을 초기화할 수 있습니다.

생성자를 사용하지 않는 이유는 무엇입니까?

서블릿 생성 프로세스는 다음과 같이 진행되기 때문입니다.

  • 상속받은 객체를 생성합니다.Http서블릿
  • 개체 만들기서블릿 컨텍스트, 해당 서블릿 변수를 추가합니다.
  • 개체 만들기서블릿 구성, 해당 서블릿 변수를 추가합니다.
  • 웹 서버가 서블릿을 컨테이너에 연결
  • init() 메서드 호출

서블릿의 생성자에서 많은 내부 변수가 아직 초기화되지 않았습니다. 컨테이너는 서블릿에 대해 아무것도 모르고 서블릿은 컨텍스트에 대해 아무것도 모릅니다. 여기서 모든 것이 명확하다고 생각합니다.

초기화될 때 설정이 있는 속성 파일을 찾는 서블릿을 작성해 보겠습니다.

public class PropertiesServlet extends HttpServlet {
    public init() {
         try (InputStream input = new FileInputStream("c:/path/to/config.properties")) {

             Properties prop = new Properties();
             prop.load(input);

             String databaseURL = prop.getProperty("db.url");
             String databaseUser = prop.getProperty("db.user ");
             String databasePassword = prop.getProperty("db.password");
	 }
  }
}

여기서 객체를 생성합니다.속성config.properties 파일에서 데이터를 로드합니다 . 글쎄, 미래에 당신은 객체에서 벗어날 수 있습니다속성예를 들어 데이터베이스에 액세스하기 위한 데이터와 같은 다양한 옵션.

속성 파일을 올바르게 로드하는 방법

그런데 서블릿이 컴퓨터에서 실행되고 있지 않으면 어떻게 됩니까?

그들이 여기에서 작성했고 세계의 다른 지역 어딘가에 있는 서버에서 실행된다고 가정해 봅시다. 또는 여러 서버. 이 경우 속성 파일을 올바르게 로드하는 방법은 무엇입니까?

좋은 질문. 일반적으로 실행할 때 서블릿은 절대 경로가 아닌 속성 파일의 상대 경로만 알고 있습니다 . 서블릿 war 파일은 어디에나 저장할 수 있기 때문입니다.

따라서 서블릿이 저장된 경로(서블릿은 이미 초기화됨)를 찾아 상대 경로를 추가해야 합니다. :)

다음과 같이 보입니다.

String path = absoluteServletParh + "relative path";

그리고 항상 그렇듯이 이러한 기본 작업에는 종종 자체 작은 "그러나"가 있습니다. 서블릿과 해당 속성 파일은 아카이브 내부에 저장됩니다 :) 물론 반드시 그런 것은 아니지만 발생합니다. 속성 파일은 종종 jar 또는 war 파일에 저장됩니다.

즉, 파일에 디스크의 실제 경로가 없을 수 있습니다. 그러나 컨테이너가 서블릿을 로드할 수 있었기 때문에 속성 파일도 로드할 가능성이 높습니다.

이렇게 하려면 클래스 로더 객체(클래스로더) 파일을 업로드하도록 요청합니다. 다음과 같이 표시됩니다.

ClassLoader loader = Thread.currentThread().getContextClassLoader();
InputStream stream = loader.getResourceAsStream("/config.properties");

Properties prop = new Properties();
prop.load(stream);

getConfig() 메서드

그런데 모든 매개변수가 특성 파일의 서블릿에 전달될 수 있는 것은 아닙니다. 예를 들어 서블릿은 분산 웹 애플리케이션의 다른 서블릿과 통신합니다.

그런 다음 컨테이너가 init() 메서드 를 호출할 때 필요한 모든 정보를 서블릿에 전달하는지 확인해야 합니다 . 더욱이 그는 그렇게합니다.

귀하의 서블릿( HttpServlet 클래스 에서 상속됨을 기억하십시오 )에는 getServletConfig() 메소드가 있습니다 . 객체를 반환하는서블릿 구성, 컨테이너에 의해 생성되고 초기화됩니다. 이 개체에는 다음 메서드가 있습니다.

getInitParameterNames() 서블릿 매개변수 이름 목록을 반환합니다.
getInitParameter(문자열 이름) 이름으로 서블릿 매개변수를 반환합니다.
getServletName() 서블릿의 고유 이름을 반환합니다.
getServletContext() 객체를 반환합니다.서블릿 컨텍스트

매개변수 목록을 반환하는 서블릿을 작성해 보겠습니다.서블릿 구성'ㅏ. web.xml 파일을 통해 위치에 배치합니다.

	<web-app> 
 	
        <servlet> 
            <servlet-name>Print-Servlet</servlet-name> 
            <servlet-class>PrintServlet</servlet-class> 
            <init-param> 
                <param-name>jdbc-driver</param-name> 
    	        <param-value>sun.jdbc.odbc.JdbcOdbcDriver</param-value> 
	        </init-param> 
        </servlet> 
  	
        <servlet-mapping> 
            <servlet-name>Print-Servlet</servlet-name> 
            <url-pattern>/print</url-pattern> 
        </servlet-mapping> 
  	
    </web-app>

서블릿은 다음 코드를 사용하여 매개변수를 가져올 수 있습니다.

public class PrintServlet extends HttpServlet {
    public void init() {
        ServletConfig config = this.getServletConfig();
        Enumeration<String> initParameterNames = config.getInitParameterNames();

        while (initParameterNames.hasMoreElements()){
       	     String key = initParameterNames.nextElement();
             System.out.println("%s: %s\n", key, config.getInitParameter(key));
    	}
  }
}