반응형
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>
- print() 메소드로 쓴 내용이 먼저 버퍼에 들어가게 됨
- clearBuffer() 메소드로 버퍼 안의 내용을 지워버림 → 1.의 print() 메소드 안 문자열이 출력되지 않음
- 버퍼의 크기 관련 정보-getBufferSize() [현재 페이지에 설정된 버퍼의 크기를 가져옴-page 지시어로 따로 선언하지 않았으므로 기본값 8KB로 출력]
- 버퍼의 크기 관련 정보-getRemaining() [남은 버퍼의 크기를 알려줌-버퍼 플러시 전]
- flush() 메소드-버퍼에 담긴 내용을 강제로 플러시함 (원래 버퍼는 모두 채워졌을 때 플러시되면서 내용을 출력함)
- 버퍼의 크기 관련 정보-getRemaining() [남은 버퍼의 크기를 알려줌-버퍼 플러시 후]
- 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>
- getInitParameter() 메소드로 web.xml에 설정한 초기화 매개변수를 읽어 옴(web.xml에서 “INIT_PARAM”을 설정하지 않았을 경우 null 반환)
- getRealPath() 메소드로 현재 예제를 작성 중인 폴더의 물리적 경로(필자의 경우”/02ImplicitObject”)를 얻어와서 출력 → 인수로 ‘컨텍스트 루트를 제외한’ 경로 입력
- 선언부에 정의한 메소드-”/02ImplicitObject”의 물리적 경로 반환 [이때 필요한 서블릿 컨텍스트를 this로부터 얻음)
- 선언부에 정의한 메소드 2-”/02ImplicitObject”의 물리적 경로 반환 [이때 필요한 서블릿 컨텍스트를 매개변수로 받음)
- this를 이용하는 3.을 호출
- 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>
반응형
'자바(JAVA) > JSP 웹 프로그래밍 공부 (성낙현의 JSP 자바 웹 프로그래밍 참고)' 카테고리의 다른 글
JAVA/JSP 8. 내장 객체의 영역(Scope) - page 영역, request 영역 (0) | 2023.04.30 |
---|---|
JAVA/JSP 7. 내장 객체의 영역(Scope) - 정의, 데이터 전송 객체(DTO) 준비 (0) | 2023.04.15 |
JAVA/JSP 5. 내장 객체 - 내장 객체란? Request, Response 객체 (0) | 2023.03.23 |
JAVA/JSP 4. JSP 파일 기본 구조 (2) | 2023.03.08 |
JAVA/JSP 3. 동적 웹페이지로의 여정과 JSP (0) | 2023.02.28 |