자바(JAVA)/JSP 웹 프로그래밍 공부 (성낙현의 JSP 자바 웹 프로그래밍 참고)

JAVA/JSP 6. 내장 객체 - out 객체, application 객체, exception 객체

개발학생 2023. 3. 30. 22:03
반응형

3. out 객체

  • 웹 브라우저에 변수 등의 값을 출력할 때 주로 사용 → 대부분의 상황에서는 (1장에서 학습한) 표현식 <%= %>이 더 편리함
  • 스크립틀릿 내에서 변수를 웹 브라우저에 출력해야 한다면 이 객체 사용(표현식 대신!)
  • 버퍼를 사용 - 출력되는 모든 정보가 버퍼에 먼저 저장된 후 웹 브라우저에 출력됨
//OutMain.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<html>
<head><title>내장 객체 - out</title></head>
<body>
    <%
    // 버퍼 내용 삭제하기
    out.print("출력되지 않는 텍스트");    //1. 버퍼에 저장  
    out.clearBuffer();    //2. 버퍼를 비움(윗 줄의 출력 결과 사라짐) 

    out.print("<h2>out 내장 객체</h2>");

    // 버퍼 크기 정보 확인
    out.print("출력 버퍼의 크기 : " + out.getBufferSize() + "<br>");    //3. 
    out.print("남은 버퍼의 크기 : " + out.getRemaining() + "<br>");    //4.

    out.flush();    //5. 버퍼 내용 출력 
    out.print("flush 후 버퍼의 크기 : " + out.getRemaining() + "<br>");    //6.

    //7. 다양한 타입의 값 출력
    out.print(1);
    out.print(false);
    out.print('가');
    %>
</body>
</html>
  1. print() 메소드로 쓴 내용이 먼저 버퍼에 들어가게 됨
  2. clearBuffer() 메소드로 버퍼 안의 내용을 지워버림 → 1.의 print() 메소드 안 문자열이 출력되지 않음
  3. 버퍼의 크기 관련 정보-getBufferSize() [현재 페이지에 설정된 버퍼의 크기를 가져옴-page 지시어로 따로 선언하지 않았으므로 기본값 8KB로 출력]
  4. 버퍼의 크기 관련 정보-getRemaining() [남은 버퍼의 크기를 알려줌-버퍼 플러시 전]
  5. flush() 메소드-버퍼에 담긴 내용을 강제로 플러시함 (원래 버퍼는 모두 채워졌을 때 플러시되면서 내용을 출력함)
  6. 버퍼의 크기 관련 정보-getRemaining() [남은 버퍼의 크기를 알려줌-버퍼 플러시 후]
  7. print() 메소드를 이용해 다양한 타입의 데이터를 출력하는 예 (문자열, 문자, 숫자, boolean 등)
  • OutMain.jsp 실행 결과 → print()를 사용하면서 버퍼가 채워지다가, flush()로 모두 출력된 후 크기가 복원된 것을 알 수 있음

 

4. application 객체

  • 웹 애플리케이션당 하나만 생성되며, 모든 JSP 페이지에서 접근할 수 있음
  • ServletContext 타입
  • 주로 웹 애플리케이션 전반에서 이용하는 정보를 저장하거나, 서버의 정보, 서버의 물리적 경로 등을 얻어오는 데 사용
//WebContent/WEB-INF/web.xml

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://xmlns.jcp.org/xml/ns/javaee" xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd" id="WebApp_ID" version="4.0">
	  <display-name>MustHaveJSP</display-name>
	  <welcome-file-list>
		    <welcome-file>index.html</welcome-file>
		    <welcome-file>index.htm</welcome-file>
		    <welcome-file>index.jsp</welcome-file>
		    <welcome-file>default.html</welcome-file>
		    <welcome-file>default.htm</welcome-file>
		    <welcome-file>default.jsp</welcome-file>
		</welcome-file-list>

<!-- 컨텍스트 초기화 매개변수 -->
<!-- <context-param>태그를 만들고, 그 안에 초기화 매개변수의 이름과 값 입력 -->
	  <context-param>
		    <param-name>INIT_PARAM</param-name>
		    <param-value>web.xml에 저장한 초기화 매개변수</param-value>
	  </context-param>
</web-app>
//ApplicationMain.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<html>
<head><title>내장 객체 - application</title></head>
<body>
    <h2>web.xml에 설정한 내용 읽어오기</h2>
    초기화 매개변수 : <%= application.getInitParameter("INIT_PARAM") %>    //1.

    <h2>서버의 물리적 경로 얻어오기</h2>
    application 내장 객체 : <%= application.getRealPath("/02ImplicitObject") %>    //2.

    <h2>선언부에서 application 내장 객체 사용하기</h2>
    <%!
    public String useImplicitObject() {    //3.
        return this.getServletContext().getRealPath("/02ImplicitObject");    //4.
    }
    public String useImplicitObject(ServletContext app) {
        return app.getRealPath("/02ImplicitObject");
    }
    %>
    <ul>
        <li>this 사용 : <%= useImplicitObject() %></li>    //5.
        <li>내장 객체를 인수로 전달 : <%= useImplicitObject(application) %></li>    //6.
    </ul>
</body>
</html>
  1. getInitParameter() 메소드로 web.xml에 설정한 초기화 매개변수를 읽어 옴(web.xml에서 “INIT_PARAM”을 설정하지 않았을 경우 null 반환)
  2. getRealPath() 메소드로 현재 예제를 작성 중인 폴더의 물리적 경로(필자의 경우”/02ImplicitObject”)를 얻어와서 출력 → 인수로 ‘컨텍스트 루트를 제외한’ 경로 입력
  3. 선언부에 정의한 메소드-”/02ImplicitObject”의 물리적 경로 반환 [이때 필요한 서블릿 컨텍스트를 this로부터 얻음)
  4. 선언부에 정의한 메소드 2-”/02ImplicitObject”의 물리적 경로 반환 [이때 필요한 서블릿 컨텍스트를 매개변수로 받음)
  5. this를 이용하는 3.을 호출
  6. application 내장 객체를 인수로 하여 4.를 호출
  • 실행 결과-빨간색으로 지워진 부분은 사용자 이름 부분
    → 세 가지 모두 동일한 결과가 출력됨 (단, 사용 방법이 조금씩 다름)
    • 스크립틀릿, 표현식: application 내장 객체를 그대로 사용
    • 선언부: application 내장 객체 바로 사용 불가능 (this로 application 내장 객체를 얻어오거나, 인수로 전달해야 사용 가능)
  • 작성한 jsp 파일을 실행하면, 이클립스는 별도의 디렉토리를 생성하여 서블릿 변환과 컴파일 진행
    → ApplicaionMain.jsp파일에 대한 서버의 물리적 경로가 엄청나게 길어짐

 

5. exception 객체

  • 오류명 출력, 오류 페이지 처리
HTTP 에러 코드 에러 의미  조치 방법
404 Not Found : 클라이언트가 요청한 경로에서 문서를 찾을 수 없음 URL 상의 경로명이나 파일명이 제대로 입력되었는지 확인
405 Method Not Allowed : 허용되지 않은 메소드
→ GET 방식 혹은 POST 방식으로 요청했는데, 이를 처리할 컨트롤러가 없는 것
주로 서블릿으로 개발할 때 발생
-> doGet(), doPost() 메소드가 적절히 오버라이딩 되었는지 확인
500 Internal Server Error : 서버 내부 오류
→ 코드에 오타가 있거나 로직에 문제가 있어, 웹 서버가 요청 사항 수행 불가
가장 많이 발생하는 에러
-> 개발 중인 코드를 전반적으로 확인하여 오류 처리

 

  • 에러가 발생했을 때, 에러벌로 출력할 페이지를 분기하는 방법 - 에러 코드를 정수로 명시하고, 해당 에러 발생 시 웹 브라우저에 출력할 페이지와 경로 지정(편의상 Exception.jsp에서 모든 에러 처리)
//WebContent/WEB-INF/web.xml

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://xmlns.jcp.org/xml/ns/javaee" xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd" id="WebApp_ID" version="4.0">
	  <display-name>MustHaveJSP</display-name>
	  <welcome-file-list>
		   ...
	  </welcome-file-list>

	  <context-param>
		    ...
	  </context-param>

<!-- 에러 페이지 처리하기 -->
  <error-page>
    <error-code>404</error-code>
    <location>/02ImplicitObject/Exception.jsp</location>
  </error-page>
  <error-page>
    <error-code>405</error-code>
    <location>/02ImplicitObject/Exception.jsp</location>
  </error-page>
  <error-page>
    <error-code>500</error-code>
    <location>/02ImplicitObject/Exception.jsp</location>
  </error-page>

</web-app>

 

  • Error500.jsp의 에러 출력 페이지
    ->웹 브라우저 주소표시줄에는 여전히 Error500.jsp라는 파일명이 보이지만, 실제로 출력된 것은 Exception.jsp의 내용
//Error500.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>page 지시어 - errorPage, isErrorPage 속성</title>
</head>
<body>
<%
int myAge = Integer.parseInt(request.getParameter("age")) + 10;  // 에러 발생
out.println("10년 후 당신의 나이는 " + myAge + "입니다.");  // 실행되지 않음
%>
</body>
</html>
//Exception.jsp - Error500.jsp의 에러 출력 페이지

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<html>
<head><title>내장 객체 - exception</title></head>
<body>
<%
int status = response.getStatus();  // response 내장 객체로부터 에러 코드 확인

// 에러 코드에 따라 적절한 메시지 출력
if (status == 404) {
    out.print("404 에러가 발생하였습니다.");
    out.print("<br/>파일 경로를 확인해주세요.");
}
else if (status == 405) {
    out.print("405 에러가 발생하였습니다.");
    out.print("<br/>요청 방식(method)을 확인해주세요.");
}
else if (status == 500) {
    out.print("500 에러가 발생하였습니다.");
    out.print("<br/>소스 코드에 오류가 없는지 확인해주세요.");
}
%>
</body>
</html>

반응형