77일차 Servlet API 핵심 클래스1

쿠우·2022년 7월 15일
0

ServletConfig API

  • 객체에 web.xml 에서 설정한 정보를 담고 있다.

▼ GenericServlet은 Servlet 인터페이스의 구현체이지만 ServletConfig의 구현체이기도 하다

▼ ServletConfig의 핵심 메서드

ServletConfig에 대한 정리

  • 서블릿에 관한 정보를 처리하는 객체이다.
  • 서블릿 객체 생성 시 자동으로 생성된다.
  • 서블릿당 하나씩 존재하는 객체이다.
  • init()인자로 받아 사용할 수 있다.
  • HttpServlet을 상속받아 사용할 수 있다.

Web.xml을 이용해 초기화 정보를 받아오는 예제

▼ web.xml 부분
-알아볼 부분
(1)servlet-mapping + (servlet > servlet-name + servlet-class + (initparam > param-name + param-value))의 구조확인
(2)jdbc연결을 위한 초기화 정보를 고정해 놓는 거

  <servlet>
  	<servlet-name>InitParamServlet</servlet-name>
  	<servlet-class>org.zerock.myapp.servlet.InitParamServlet</servlet-class>
  	
  	<init-param>
  		<param-name>jdbcDriver</param-name>
  		<param-value>oracle.jdbc.OracleDriver</param-value>
  	</init-param>
  	
  	<init-param>
  		<param-name>jdbcUrl</param-name>
  		<param-value>jdbc:oracle:thin:@db20220510181319_high?TNS_ADMIN=C:/opt/OracleCloudWallet/ATP</param-value>
  	</init-param>
  	
  	<init-param>
  		<param-name>user</param-name>
  		<param-value>HR</param-value>
  	</init-param>
  	
  	<init-param>
  		<param-name>pass</param-name>
  		<param-value>Oracle12345678</param-value>
  	</init-param>
  </servlet>
  
 <servlet-mapping>
 	<servlet-name>InitParamServlet</servlet-name>
 	<url-pattern>/InitParam</url-pattern>
 </servlet-mapping>
  

▼web.xml에 초기화한 파라미터 얻는 서블릿 사용방법
알아볼 부분
(1) 초기화 방법은 두가지지만 초기화한 정보를 얻어내는 방법은 .getInitParameter() 하나다.
(2) service부분이 아닌 곳에서 초기화정보를 얻어야 한다는 점
(3) init메서드 생성 부분에서 super.init(config)을 꼭해야한다는 점

public class InitParamServlet extends HttpServlet {
	private static final long serialVersionUID = 1L;	
	
	protected void service(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {
		log.trace("service() invoked");

		//-----------------------초기화 파라미터를 얻어오는 1번째 용법---------------------------
		try {
			// web.xml파일에서 getInitParameter()를 통해 초기화한 파라미터 얻기
			// service메소드 안에서 10000명이 요청하면 10000번을 얻어온다. 
			//이렇게 되면 오래 걸릴 때 줄서기를 해야한다. 
			// 따라서 딱 한번 읽고 진행해야한다.
//			String dirPath = this.getInitParameter("dirPath");
//			String userid = this.getInitParameter("userid");
			
//			log.info("\t + dirPath:{} , userid:{}", dirPath, userid);
			
			
			
			// 비지니스 로직 수행 - 현재의 날짜와 시간을 얻어라!
			String sql = "SELECT current_date FROM dual";
			PreparedStatement pstmt = conn.prepareStatement(sql);
			
			ResultSet rs =pstmt.executeQuery();
			
			Date now = null;
			
			if(rs.next()) {
				now = rs.getDate("current_date");
			}
			
//			=== 응답문서생성 ===
			
			response.setContentType("text/html; charset = UTF-8");
			@Cleanup
			PrintWriter out = response.getWriter();
			
			
			out.println("<h1> CurrentTime:"+ now +"</h1>");
			out.flush();
		} catch (Exception e) {
			throw new ServletException(e);
		}
	} // service

//-----------------------초기화 파라미터를 얻어오는 2번째 용법---------------------------
	

	private Connection conn;
	
	
	@Override
	public void init(ServletConfig config) throws ServletException {
		// 통상, 서블릿에서 사용될 자원객체를 생성하는 역할을 한다 
		try {
		
		 //HttpServlet을 상속받아 직접 서블릿 클래스를 만들때 init() 메서드를 오버라이딩 하지 않는다면 
		 //기본적으로 GenericServlet의 init()메서드가 호출된다.
		// init을 오버라이딩 할 때 반드시 부모의 init을 오버라이딩해줘야한다.
        //이 코드가 없으면 서블릿이 ServletConfig 객체를 저장하지 못하게 된다.
		super.init(config); // 이 실행 문장은 지워도 됩니까 ? (아주 중요한 질문)

		log.trace("init({}) invoked.", config);
		
		
		//초기화 파라미터 얻기 
		String jdbcDriver = config.getInitParameter("jdbcDriver"); //this.~~으로 하면 NullPointer 에러뜸
		String jdbcUrl = config.getInitParameter("jdbcUrl");	
		String user = config.getInitParameter("user");	
		String pass = config.getInitParameter("pass");	
		
		log.info("\t + jdbcDriver:{} , jdbcUrl:{} ,user:{}, pass:{}", jdbcDriver, jdbcUrl ,user,pass);
		
		// Oracle Cloud ATP에 대한 JDBC Connection 생성
		Class.forName(jdbcDriver);
		this.conn = DriverManager.getConnection(jdbcUrl,user,pass);
		
		} catch(Exception e) {
			throw new ServletException(e);  // Original Exception을 ServletExeption으로  Wrapping
		} // try - catch 
	}// init
	
	@Override
	public void destroy() {	// 통상, 서블릿에서 사용된 자원객체를 해제하는 역할을 한다 
		log.trace("destroy invoked");
		
		try{
			if(this.conn != null && !this.conn.isClosed())
			this.conn.close();
		}catch(SQLException e){;;}
	}// destroy
	
} // end class

어노테이션을 이용해 초기화 정보를 받아오는 예제 (잘 안씀)

@WebServlet(
		urlPatterns = { "/InitParamAnno" }, 
		initParams = { // 초기화 파라미터
				@WebInitParam(name = "dirPath", value = "_DIRPATH_", description = "디렉토리경로"), 
				@WebInitParam(name = "userid", value = "아이디")
		})
public class InitParamAnnoServlet extends HttpServlet {
	private static final long serialVersionUID = 1L;
       
	@Override
	protected void service(HttpServletRequest req, HttpServletResponse res) 
		throws ServletException, IOException {
		log.trace("service invoked");
		
		String dirPath = this.getInitParameter("dirPath");
		String userid = this.getInitParameter("userid");
		
		log.info("\t + dirPath:{} , userid:{}", dirPath, userid);
		
	}// service
	
}// end class

Servlet Context API

  • 웹어플리케이션을 의미하는 객체라고 생각하는게 이해하기 좋다.

ServletContext는 웹 어플리케이션(Context)마다 하나씩 생성되는 객체로서, 다수의 JSP 파일
과 서블릿에서 공유해서 사용할 수 있다.
이 부분에서 공유데이터 영역의 LifeCycle에 대해서 알아야한다.

위 사진과 요고만 알아도 끝

  • App scope 영역은 항상 동작해야하는 영역
  • Session은 로그인 같은 잠시 유지해야하는 영역
  • Request는 단발성 사용 영역
  • Page는 거의 사용 안함

▼ web.xml 부분
-알아볼 부분
(1)context-param>param-name + param-value의 구조확인

	<context-param>
		<param-name>driver</param-name>
		<param-value>oracle.jdbc.driver.OracleDriver</param-value>
	</context-param>

	<context-param>
		<param-name>savePath</param-name>
		<param-value>C:/temp/upload</param-value>
	</context-param>

▼ web.xml 부분

@WebServlet("/ContextParam")
public class ContextParamServlet extends HttpServlet {
	private static final long serialVersionUID = 1L;

	protected void service(HttpServletRequest req, HttpServletResponse res) throws ServletException, IOException {
		log.trace("service invoked");
		
		
		//Context Parameters를 얻어보는데 어떻게 얻을까?
		// 웹어플리케이션(=Context)마다, 오직 1개씩 생성되는 `ServletContext` 객체를 먼저 얻는다.
		
//		ServletContext sc =this.getServletContext(); // 1번 방법
		ServletContext sc =req.getServletContext();	// 2번 방법
		HttpSession session = req.getSession();
		HttpServletRequest request = req;
		
		
		String driver = sc.getInitParameter("driver");
		String savePath = sc.getInitParameter("savePath");
				
		log.info("\t + dirver: {} , savePath: {}", driver, savePath );
		
	}// service

}// end class


마지막으로 ServletConfig와 ServletContext의 비교 설명

(1)똑같이 xml에 정의는 한다.
(2)ServletConfig 다른곳에서 사용될 수 없다! servlet-class에 선언된 곳에서만 사용가능
(3)ServletContext는 동일 웹 애플리케이션 어디에서든 사용가능
-즉 공유라는 차이점이 있고 이를 생각하면서 설계하고 사용하면 되겠다. 끝.

profile
일단 흐자

0개의 댓글