2022. 4. 8. 11:08ㆍJAVA/Servlet&JSP
application 기본 객체란 무엇인가?
- 특정 웹 어플리케이션에 포함된 모든 JSP 페이지는 하나의 application 기본 객체를 공유함
- application 기본 객체를 이용하여 초기 설정 정보를 읽어올 수 있거나 서버 정보를 읽어옴
- 웹 어플리케이션이 제공하는 자원을 읽어올 수 있음
1. 웹 어플리케이션 초기화 파라미터 읽어 오기
<context-param> 태그를 통한 애플리케이션 초기화 파라미터 설정
<context-param>
<description>파라미터 설명(필수 아님)</description>
<param-name>파라미터 이름</param-name>
<param-value>파라미터값</param-value>
</context-param>
- WEB-INF/web.xml 파일에서 설정
- 애플리케이션 초기화 파라미터 설정시 application 기본 객체의 메서드를 이용하여 초기화 파라미터 사용가능함
application 기본 객체가 제공하는 초기화 파라미터 관련 메서드
메서드 | 관련 타입 | 설명 |
getInitParameter(String name) | String | 이름이 name인 웹 어플리케이션 초기화 파라미터의 값을 읽어옴, 존재하지 않을 경우 null 리턴 |
getInitParameterNames() | Enumeration | 웹 어플리케이션 초기화 파라미터의 이름 목록을 리턴 |
WEB-INF/web.xml (초기화 파라미터 추가)
<context-param>
<description>로깅 여부</description>
<param-name>logEnabled</param-name>
<param-value>true</param-value>
</context-param>
<context-param>
<description>디버깅 레벨</description>
<param-name>debugLevel</param-name>
<param-value>5</param-value>
</context-param>
</web-app>
readInitParameter.jsp
<%@page import="java.util.Enumeration"%>
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>초기화 파라미터 읽어오기</title>
</head>
<body>
초기화 파라미터 목록
<ul>
<%
Enumeration e = application.getInitParameterNames();
while(e.hasMoreElements())
{
String initParamName = (String) e.nextElement();
%>
<li>
<%= initParamName %> = <%= application.getInitParameter(initParamName) %>
</li>
<%
}
%>
</ul>
</body>
</html>
웹 어플리케이션 초기화 파라미터 용도
- 웹 어플리케이션의 초기화 작업에 필요한 설정 정보를 저장하기 위해 사용됨
- 데이터베이스 연결과 관련된 설정 파일의 경로
- 로깅 설정 파일
- 웹 어플리케이션의 주요 속성 정보를 담고 있는 파일의 경로
2. 서버 정보 읽어 오기
application 기본 객체는 현재 사용 중인 웹 컨테이너에 대한 정보를 읽어 오는 메서드를 제공합니다.
메서드 | 리턴 타입 | 설명 |
getServerInfo() | String | 서버 정보를 구함 |
getMajorVersion() | String | 서버가 지원하는 서블릿 규악의 메이저 버전을 리턴함 |
getMinorVersion() | String | 서버가 지원하는 서블릿 규약의 마이너 버전을 리턴함 |
viewServerInfo.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>서버 정보 출력</title>
</head>
<body>
서버 정보 : <%= application.getServerInfo() %><br>
서블릿 규약 메이저 버전 : <%= application.getMajorVersion() %><br>
서블릿 규약 마이너 버전 : <%= application.getMinorVersion() %><br>
</body>
</html>
3. 로그 메시지 기록하기
application 기본 객체는 웹 컨테이너가 사용하는 로그 파일에 로그 메시지를 기록할 수 있도록 메서드를 제공합니다.
메서드 | 리턴 타입 | 설명 |
log(String msg) | void | 로그 메시지 msg를 기록 |
log(String msg, Throwable throwable) | void | 로그 메시지 msg를 기록, 예외정보도 함계 로그 파일에 기록함 |
useApplicationLog.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
<%
application.log("로그 메시지 기록을 확인합니다.");
%>
로그 메시지를 기록합니다.
</body>
</html>
JSP 페이지는 자체적으로 log 메서드를 통해서 로그 메시지를 기록할 수 있습니다.
useApplicationLog2.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
<%
log("로그 메시지 기록2"); //JSP가 자체저으로 제공하는 log() 메소드를 사용해도 된다.
%>
로그 메시지를 기록합니다.
</body>
</html>
4. 웹 어플리케이션의 자원 구하기
JSP 페이지에서 웹 어플리케이션 폴더에 속한 파일을 사용하고 싶은 경우, 절대 경로를 사용해서 출력하는 예제입니다.
readResourceDirectly.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%@ page import="java.io.*" %>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
<%
FileReader fr = null;
char[] buff = new char[512];
int len=-1;
try{
//notice.txt로부터 내용을 읽어 오는 FileReader생성(자원의 절대 경로 사용)
fr = new FileReader("C:\\Users\\qkdlf\\Study\\Language\\jsp\\jsp2\\src\\main\\webapp\\Chapter05\\notice.txt");
//notice.txt로부터 읽어 온 데이터를 out 기본 객체를 사용하여 웹 브라우저에 출력한다.
while((len=fr.read(buff))!=-1)
{
out.print(new String(buff,0,len));
}
}catch(IOException ex){
out.println("예외 발생: " + ex.getMessage());
}finally{
if(fr!=null)
try{
fr.close(); //라인 13에서 생성한 FileReader를 종료한다.
}catch(IOException ex)
{
}
}
%>
</body>
</html>
notice.txt
본 사이트는 에제 사이트입니다.<br>
이 내용은 <b>notice.txt</b>에 있습니다.
위의 결과를 통해서 notice.txt의 내용이 올바르게 출력된 것을 볼 수 있습니다. 하지만 파일을 읽어올때 절대경로를 사용했기 때문에 유지보수의 관점에서는 적절하지는 않습니다. 만약 notice.txt의 경로가 변경된다면 notice.txt를 참조하는 절대 경로도 변경되어야 하기 때문입니다. 1~2개 정도라면 상관없지만 100개라고 생각한다면 매우 부적절할 것입니다.
절대 경로를 통한 읽기 문제를 해결하기 위해서 application 기본 객체는 웹 애플리케이션의 자원에 접근할 수 있는 메서드를 제공하고 있습니다.
메서드 | 리턴 타입 | 설명 |
getRealPath(String path) | String | |
getResource(String path) | java.net.URL | 웹 어플리케이션 내에서 지정한 경로에 해당하는 자원에 접근할 수 있는 URL 객체를 리턴함 |
getResourceAsStream(String path) | java.io.InputStream | 웹 어플리케이션 내에서 지정한 경로에 해당하는 자원으로부터 데이터를 읽어 올 수 있는 InputStream을 리턴함 |
웹 어플리케이션 내에서의 경로
application 기본 객체를 비롯해서 웹 어플리케이션 내에 있는 자원을 사용할 때는 웹 어플리케이션 폴더를 기준으로 자원의 경로를 지정하게 됩니다. 예를 들어 웹 어플리케이션 폴더가 [톰캣]/webapps/Chapter05라면 이때 웹 어플리케이션 폴더인 [톰캣]/webapps/Chapter05 폴더는 웹 어플리케이션 내에서의 경로로는 "/"에 해당됩니다.
readResourceUsingApplication.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%@ page import="java.io.*" %>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
<%
String resourcePath = "/Chapter05/notice.txt"; //웹 어플리케이션 내에서의 경로 사용
%>
자원의 실제 경로:<br>
<%= application.getRealPath(resourcePath)%>
<br>
----------------------<br>
<%= resourcePath %> 의 내용<br>
----------------------<br>
<%
BufferedReader br = null;
char[] buff = new char[512];
int len=-1;
try{
br = new BufferedReader(new InputStreamReader(application.getResourceAsStream(resourcePath)));
while((len=br.read(buff))!= -1)
{
out.print(new String(buff,0,len));
}
}catch(IOException ex)
{
out.println("예외 발생: " + ex.getMessage());
}finally{
if(br!=null)
try{
br.close();
}catch(IOException ex)
{
}
}
%>
</body>
</html>
저같은 경우 이클립스에서 컴파일하기 때문에 웹 어플리케이션 기준이 webapps 폴더로 맞추어져 있습니다. 따라서 웹 어플리케이션 폴더인 webapps 폴더 밑에 Chapter05 하위 폴더가 있는 구조입니다. 위 예제의 "/" 경로는 webapps 폴더입니다.
다음 예제는 application.getResource() 메서드를 호출하여 URL 객체를 리턴하고 URL 객체를 사용하여 InputStream을 가져와 읽는 예제입니다.
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%@ page import="java.io.*" %>
<%@ page import="java.net.URL" %>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
<%
String resourcePath = "/Chapter05/notice.txt"; //웹 어플리케이션 내에서의 경로 사용
BufferedReader br = null;
char[] buff = new char[512];
int len=-1;
try{
URL url = application.getResource(resourcePath); // 지정한 경로에 해당하는 자원과 관련된 URL 객체 생성
// url.openStream() 메서드를 사용하여 자원으로부터 데이터를 읽어오는 InputStream을 생성한다.
// 아래의 코드는 application.getReourceAsStream(recourcePath)와 동일하다.
br = new BufferedReader(new InputStreamReader(url.openStream()));
while((len=br.read(buff))!= -1)
{
out.print(new String(buff,0,len));
}
}catch(IOException ex)
{
out.println("예외 발생: " + ex.getMessage());
}finally{
if(br!=null)
try{
br.close();
}catch(IOException ex)
{
}
}
%>
</body>
</html>
References
source code : https://github.com/yonghwankim-dev/JSP2.0/tree/master/jsp2/src/main/webapp/Chapter05
JSP 2.0 프로그래밍 기초부터 중급까지
'JAVA > Servlet&JSP' 카테고리의 다른 글
[JSP] 5.6 JSP 기본 객체의 속성(Attribute) 사용하기 (0) | 2022.04.08 |
---|---|
[JSP] 5.5 JSP 기본 객체와 영역 (0) | 2022.04.08 |
[JSP] 5.3 기본 객체: pageContext (0) | 2022.04.07 |
[JSP] 5.2 기본 객체: out (0) | 2022.04.07 |
[JSP] 5.1 기본 객체 (0) | 2022.04.07 |