-> 블로그 이전

[JSP] out 객체 & pageContext 객체 & application 객체

2022. 3. 18. 22:21Language`/JSP (Java Server Page)

Out 객체

- JSP 페이지 내의 비-스크립트 요소들(HTML & 텍스트)은 out 기본 객체에 그대로 전달된다

- 값을 출력하는 표현식의 결과값도 out 기본 객체에 전달된다

 

- 출력 메소드는 기본적으로 print() / println() / newLine()이 제공된다

 

※ out.println()을 통한 개행

out.println()을 사용하면 웹 페이지에서 개행이 될까?

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@ page trimDirectiveWhitespaces="true" %>
<html>
<head>
    <title>Title</title>
</head>
<body>
<%
    out.println("Hello ");
    out.println("World ");
    out.print("??");
%>
</body>
</html>

<결과 예측>

Hello 

World

??

 

<실제 결과>

실제로 웹 페이지에서는 개행이 되지 않았다

Why?

HTML 코드 내에서만 개행이 이루어졌다

 

실제로 JSP 페이지는 일단 자바 소스코드로 변환이되고, 해당 자바 소스코드는 서블릿 클래스로 컴파일이 되는데 이 과정에서 "Hello " / "World " / "??" 를 HTML 코드 관점에서 보면 그냥 1줄로 표기되는 방식이다. 따라서 실제 웹 페이지에서 개행을 하려면 println()안에 <br>을 넣어줘서 서블릿 클래스가 <br>을 인식하도록 해줘야 한다

 

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@ page trimDirectiveWhitespaces="true" %>
<html>
<head>
    <title>Title</title>
</head>
<body>
<%
    out.println("Hello <br>");
    out.println("World <br>");
    out.print("??");
%>
</body>
</html>

 

 

out 객체와 buffer의 관계

- JSP 페이지가 사용하는 버퍼는 실제로 out 객체가 내부적으로 사용하는 버퍼랑 동일하다

<%@ page buffer = "16kb" %>

>> 이 코드는 실질적으로 out 객체가 16Kb 크기의 버퍼를 내부적으로 사용한다는 코드이다

메소드 설명
int getBufferSize() 버퍼의 크기 return
int getRemaining() 현재 남아있는 버퍼의 크기 return
void clear() 버퍼 내용 비우기
>> 버퍼가 이미 flush된 상태이면 IOException 에러 발생
void clearBuffer() 버퍼 내용 비우기
>> 버퍼가 이미 flush된 상태여도 예외가 발생하지 않는다
void flush() 버퍼 flush
>> 버퍼 내용을 Client에게 전송
boolean isAutoFlush() autoFlush가 "true"로 설정되어 있으면 "return true"
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@ page trimDirectiveWhitespaces="true" %>
<html>
<head>
    <title>Title</title>
</head>
<body>
<%
    out.println("버퍼 크기 : " + out.getBufferSize() + "<br>");
    out.println("남은 버퍼 크기 : " + out.getRemaining() + "<br>");
    out.println("AutoFlush 여부 : " + out.isAutoFlush());
%>
</body>
</html>

- 따로 page 디렉티브를 통해서 autoFlush를 설정해주지 않으면 autoFlush의 default value는 "true"이다

- 그리고 buffer의 default value는 "8kb"이다

 

 


pageContext 객체

- pageContext 객체를 직접 사용하는 경우는 드물고, 커스텀 태그를 구현할 때는 사용된다

  • 기본 객체 구하기
  • 속성 처리
  • 페이지 흐름 제어
  • 에러 데이터 구하기

 

기본 객체 접근 메소드

메소드 설명
ServletRequest getRequest() request 기본 객체 return
ServletResponse getResponse() response 기본 객체 return
HttpSession getSession() session 기본 객체 return
ServletContext getServletContext() application 기본 객체 return
ServletConfig getServletConfig() config 기본 객체 return
JspWriter getOut() out 기본 객체 return
Exceptioin getException() exception 기본 객체 return
>> 해당 JSP 페이지가 에러 페이지인 경우에만 의미가 있다
Object getPage() page 기본 객체 return

 


application 객체

- 특정 Web-Application에 포함된 모든 JSP 페이지는 하나의 application 객체를 공유한다

- application 객체는 W-A의 대부분의 정보를 보유하고 있다

  • 초기 설정 정보
  • 서버 정보
  • 자원 정보
  • Client 정보
  • ....

 

1) W-A 초기화 파라미터 정보 읽기

- W-A에서 사용할 수 있는 초기화 파라미터는 "WEB-INF\web.xml" 파일에 <context-param> 태그를 통해서 추가

<context-param>
    <description>파라미터 설명(필수 X)</description>
    <param-name>파라미터 이름</param-name>
    <param-value>파라미터 값</param-value>
</context-param>
메소드 설명
String getInitParameter(String name) 이름이 "name"인 W-A 초기화 파라미터 값을 읽어온다
>> 없으면 null 리턴
Enumeration<String> getInitParameterNames() W-A 초기화 파라미터 이름 목록을 return
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@ page import="java.util.*" %>
<html>
<head>
    <title>W-A 초기화 파라미터 정보</title>
</head>
<body>
<%
    Enumeration<String> emr = application.getInitParameterNames();
    while(emr.hasMoreElements()){
        String name = emr.nextElement();
        out.println(name + " : " + application.getInitParameter(name) + "<br>");
    }
%>
</body>
</html>

>> 주로 DB 연결과 관련된 설정 경로 / 로깅 설정 파일 / 주요 속성 정보를 담고 있는 파일 경로 등을 지정할 때 초기화 파라미터를 사용한다 :: 그러면 모든 JSP 페이지가 해당 파라미터들을 사용할 수 있다

 

 

2) 서버 정보 읽기

- 현재 사용하고 있는 웹 컨테이너(WAS)에 대한 정보를 읽어올 수 있다

메소드 설명
String getServerInfo() 서버 정보 구하기
Strinig getMajorVersion() 서버가 지원하는 서블릿 규약의 메이저 버전 return
>> 버전의 정수 부분 return
String getMinorVersion() 서버가 지원하는 서블릿 규약의 마이너 버전 return
>> 버전의 소수 부분 return
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>Title</title>
</head>
<body>
<%
    out.println("서버 정보 : " + application.getServerInfo() + "<br>");
    out.println("메이저 버전 : " + application.getMajorVersion() + "<br>");
    out.println("마이너 버전 : " + application.getMinorVersion() + "<br>");
%>
</body>
</html>

>> 톰캣 10.0.17 버전이 서블릿 5.0 규약을 지원한다

 

3) 로그 메시지 기록

- WAS가 사용하는 로그 파일에 로그 메시지를 기록할 수 있다

메소드 설명
void log(String msg) msg를 로그로 남기기
void log(String msg, Throwable throwable) msg를 로그로 남기고 Exception 정보도 함께 기록
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>Title</title>
</head>
<body>
<%
    application.log("로그 기록 Test");
%>
</body>
</html>

 

3) W-A 자원(파일) 읽기

- JSP 페이지에서 W-A 폴더에 위치한 파일을 이용할 때 사용

메소드 설명
String getRealPath(String path) 지정한 경로 "path"에 해당하는 자원의
시스템상에서의 경로 return
java.net.URL getResource(String path) 지정한 경로 "path"에 해당하는 자원에 접근할 수 있는
URL 객체 return
java.io.InputStream getResourceAsStream(String path) 지정한 경로 "path"에 해당하는 자원으로부터 데이터를
읽어올 수 있는 InputStream return

 

Example) /chap05/poem.txt의 데이터 읽기

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@ page import="java.io.*" %>
<html>
<head>
    <title>Title</title>
</head>
<body>
<%
    char [] buffer = new char[1024];
    int c;

    String resourcePath = "/chap05/poem";
    String realPath = application.getRealPath(resourcePath);
    out.println("실제 경로 : " + realPath + "<br><br>");

    out.println("## poem.txt 데이터 읽기 ##<br>");
    try{
        BufferedReader br = new BufferedReader(new InputStreamReader(
                application.getResourceAsStream(resourcePath), "UTF-8"
        ));

        while((c = br.read(buffer, 0, buffer.length)) > 0){
            out.print(new String(buffer, 0, c));
        }
    } catch(IOException e){
        out.println("Exception 발생 : " + e.getMessage());
    }
%>
</body>
</html>

>> 시가 1줄로 나오는 이유는 poem.txt의 데이터를 결국 서블릿 클래스로 컴파일해서 JSP 페이지가 Client에게 전송되는데 서블릿 클래스에서 개행을 의미하는 <br>이 시에 없기 때문에 1줄로 나온다

 

## 시에 <br> 추가하기 ##