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

▼ ServletConfig의 핵심 메서드

ServletConfig에 대한 정리
- 서블릿에 관한 정보를 처리하는 객체이다.
- 서블릿 객체 생성 시 자동으로 생성된다.
- 서블릿당 하나씩 존재하는 객체이다.
- init()인자로 받아 사용할 수 있다.
- HttpServlet을 상속받아 사용할 수 있다.
▼ 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
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는 동일 웹 애플리케이션 어디에서든 사용가능
-즉 공유라는 차이점이 있고 이를 생각하면서 설계하고 사용하면 되겠다. 끝.