-
[JSP/Servlet] 서블릿 라이프 사이클 - JSP 페이지 사이클카테고리 없음 2020. 10. 31. 17:27
■ 들어가기
- 뇌를 자극하는 JSP&Servlet (김윤명/한빛미디어). 을 공부하며 정리하는 블로그
■ 목차
1. JSP 페이지의 jspInit 메서드와 jspDestroy 메서드
2. 서블릿의 환경을 표현하는 ServletContext 객체
1. JSP 페이지의 jspInit 메서드와 jspDestroy 메서드
- 지금까지는 서블릿 클래스의 초기화(init)/마무리(destroy) 작업 과정을 살펴 보았고
- JSP 페이지도 서블릿으로 변환 후 처리되기 때문에,
자동으로 호출되는 jspInit 메서드와 jspDestroy 메서드에 대해 알아본다.
1-1. jspInit 메서드와 jspDestroy 메서드의 작성 방법
1) jspInit 메서드는 서블릿 클래스의 init 메서드 작성 방법과 비슷
- 파라미터가 없는 메서드로 생성
- 리턴 타입은 void 로 지정
- public 으로 선언
- 단, throws 절은 쓸 수 없음
<!-- jspInit 메서드 골격 -->
public void jspInit() {
TODO
}2) jspDestroy 메서드는 서블릿 클래스의 destroy 메서드 작성 방법과 비슷
- 파라미터가 없는 메서드로 생성
- 리턴 타입은 void 로 지정
- public 으로 선언
3) jspInit(), jspDestroy() 메서드는 jsp 페이지 내 "선언부" 안에 기술하여야 함!
※ jsp 문법 형태
- <% %> (ex. 지시자, 스크립팅 요소)
- ${ } (익스프레션 언어, expression language, EL)
- XML 태그 형태 (ex. <jsp:forward>, <c:if>, <c:forEach>, ... )
※ 지시자(directive) : <%@ ~~ %> 형태
스크립팅 요소
└ 스크립틀릿(scriptlet): <% ~~~ %> 형태, java 명령문 사용 가능하며 웹 서버에서 실행됨
└ 익스프레션(expression): <%= ~~~ %> 형태, java식(변수명, 연산자 포함된 식 등) 사용 가능 & 웹 서버에서 실행
└ 선언부(declaration): <%! ~~~ %> 형태, 변수/메서드 선언 가능
※ 참고 : 주석
<!-- HTML 주석 -->
/* Java 주석 */
// Java 주석
<%-- JSP 주석 --%>- [잠깐] 익스프레션 언어와 익스프레션 차이는 뭔가요?
익스프레션 언어(EL) 익스프레션 표현 ${ cnt + 1 } <%= cnt + 1 %> 의미 cnt는 애트리뷰트의 이름 cnt는 java 프로그래밍 언어 변수 이름 - 애트리뷰트는 setAttribute, getAttribute, removeAttribute 메서드를 통해 저장되고 관리되는 데이터를 의미
- 익스프레션 언어는 ${ 와 } 사이에, 익스프레션은 <%= 와 %> 사이에 기술함
1-2. JSP 페이지의 초기화 파라미터
- JSP 페이지는 서블릿 클래스와 달리 web.xml 파일에 등록하지 않아도 웹 브라우저에서 호출 가능
- but, 초기화 파라미터를 기재하기 위해서는 web.xml 파일에 등록 필요!
<!-- web.xml 파일 내 JSP 페이지 등록 방법 -->
<web-app>
<servlet>
<servlet-name>winners-jsp</servlet-name>
<jsp-file>/Winners.jsp</jsp-file> <!-- jsp 페이지 본래 URL 경로명, 반드시 / 로 시작 -->
<init-param> <!-- jsp 페이지에 초기화 파라미터 지정하는 엘리먼트 -->
<param-name>FILE_NAME</param-name>
<param-value>winner-list.txt</param-value>
</init-param>
</servlet>
<servlet-mapping>
<servlet-name>winners-jsp</servlet-name>
<url-pattern>/winners</url-pattern> <!-- jsp 페이지 새로운 URL 경로명, 반드시 / 로 시작 -->
</servlet-mapping>
</web-app>- jsp 페이지에서 getInitParameter 메서드를 호출하여 web.xml에 기재한 초기화 파라미터 값 사용 가능
- getInitParameter 메서드는 모든 서블릿 클래스의 슈퍼클래스인 javax.servlet.GenericServlet 클래스에 속함
( jsp 페이지도 웹 컨테이너에 의해 서블릿 클래스로 변환되기 때문에 getInitParameter 메서드 호출 가능! )
String filename = getInitParameter("초기화 파라미터의 이름") ;
2. 서블릿의 환경을 표현하는 ServletContext 객체
- 서블릿이 속한 웹 애플리케이션 디렉터리와 웹 컨테이너에 관련된 환경 정보는
javax.servlet 패키지에 있는 ServletContext 인터페이스에서 가져올 수 있음
2-1. 서블릿의 환경 정보를 가져오는 방법
- 서블릿 클래스 / jsp 페이지의 환경에 관련된 정보는
javax.servlet.ServletContext 인터페이스 타입의 객체를 이용해서 얻을 수 있음
/* ServletContext 타입의 객체 구하기 - getServletContext 메서드 호출 */
ServletContext context = getServletContext() ;※ 참고 : ServletContext 인터페이스 API 규격서 ( docs.oracle.com/javaee/7/api/toc.htm )
getServerInfo() : 서블릿이 속하는 웹 서버의 종류 리턴
getMajorVersion() / getMinorVersion() : 웹 컨테이너가 지원하는 서블릿 규격서의 메이저/마이너 버전 리턴
2-2. 웹 애플리케이션의 초기화 파라미터 값을 가져오는 방법 : getInitParameter()
- web.xml 파일에 서블릿의 초기화 파라미터를 기재 & 웹 컴포넌트에서 그 값을 가져오는 방법 외에
- web.xml 파일에 모든 웹 컴포넌트에서 호출 가능한 설정 방법 이용
<!-- web.xml 파일 내 웹 애플리케이션의 초기화 파라미터 기재 -->
<web-app>
...
<context-param>
<param-name>파라미터 이름</param-name>
<param-value>파라미터 값</param-value>
</context-param>
...
</web-app>- 위와 같이 설정하면 web.xml 파일이 속한 웹 애플리케이션 디렉터리의 모든 웹 컴포넌트에서 읽을 수 있음
- 서블릿 클래스에서 사용하기 위해서는
1) getServletContext 메서드를 통해 ServletContext 객체 구하고
2) 그 객체에 대해 getInitParameter 메서드 호출
- JSP 페이지에서 사용하기 위해서는
1) appliation 내장 변수에 대해 getInitParameter 메서드를 호출
2-3. 로그 메시지를 기록하는 log 메서드
- 지금까지 로그 기록을 위해서는 PrintWriter 타입의 객체를 생성해서 열고 닫았는데
- ServletContext 인터페이스의 log 메서드를 이용하면 바로 로그 메시지 기록 가능
- log 메서드 호출 시 파라미터로 로그 메시지를 넘겨주어야 함
- log 메서드는 파라미터로 전달된 메시지를 톰캣설치디렉터리 내 logs 디렉터리 안에 "localhost.yyyy-mm-dd.log" 라는 이름으로 기록
application.log("인사하기 JSP 페이지가 호출되었습니다.") ;
2-4. 같은 웹 애플리케이션에 속하는 웹 컴포넌트들끼리 데이터를 주고 받는 방법
- ServletContext 인터페이스의 setAttribute, getAttribute, removeAttribute 메서드는
같은 웹 애플리케이션 디렉터리에 있는 웹 컴포넌트들끼리 데이터를 공유할 수 있도록 만드는 메서드
- setAttribute() : 웹 애플리케이션에 할당된 공유 데이터 영역에 데이터를 저장하는 기능
- getAttribute() : 해당 영역에 있는 데이터를 읽어오는 기능
- removeAttribute() : 해당 영역의 데이터를 삭제하는 기능
- 호출 방법 :
application.setAttribute("데이터 이름", "데이터 값") ;
String str = (String) application.getAttribute("데이터 이름") ;
application.removeAttribute("데이터 이름") ;- 위의 방법은 세션 데이터를 관리하는 방법과 차이가 없지만
- 실제로는 세션 데이터 영역이 아니라 웹 애플리케이션에 할당된 데이터 영역에 데이터를 저장
2-5. 웹 애플리케이션에 관련된 파일 경로명을 가져오는 메서드 : getContextPath()
- getContextPath() : ServletContext 인터페이스 중 웹 애플리케이션의 URL 경로명을 리턴
String appPath = application.getContextPath() ;
- getRealPath() : 웹 애플리케이션 디렉터리 내 파일의 경로명을 절대 경로명으로 바꾸어 리턴
String absolutePath = application.getRealPath("/sub1/Intro.html") ;