[JSP] 5.4 기본 객체: application

2022. 4. 8. 11:08JAVA/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 프로그래밍 기초부터 중급까지