JSP 내장 객체
✒️ 2025-06-21 22:54 내용 수정
JSP 내장 객체
Scriptlet에서만 사용할 수 있는 객체
- 스크립트릿(scriptlet,
<%.. %>)은 JSP 태그#스크립트 태그 참고. - 개발자가 별도로 생성하지 않아도 바로 JSP에서 생성할 수 있는 객체로, JSP Container가 JSP를 Servlet으로 변환할 때 자동으로 생성된다.
- 참고 자료 : 푸실리's JSP_개념 정리
| 객체 | 타입 | 설명 |
|---|---|---|
| request | javax.servlet.http.HttpServletRequest |
클라이언트의 요청(request) 정보가 담긴 객체 |
| doGet(), doPost() 메서드의 첫 번째 parameter와 동일한 역할을 함 | ||
| response | javax.servlet.http.HttpServletResponse |
요청(request)에 대한 응답(response)를 보낼 때 사용하는 객체 |
| doGet(), doPost() 메서드의 두 번째 parameter와 동일한 역할을 함 | ||
| session | javax.servlet.HttpSession |
HTTP session을 구현한 객체. Session의 정보를 저장할 때 사용 |
| out | javax.servlet.jsp.JspWriter |
응답에 포함될 내용을 출력할 때 사용 |
| application | javax.servlet.ServletContext |
JSP 페이지가 속하는 웹 어플리케이션 전체에서 공유하는 객체 |
| config | javax.servlet.ServletConfig |
JSP 페이지의 설정 정보를 저장한 객체 |
| page | java.lang.Object |
JSP 페이지로부터 생성된 Servlet. JSP 페이지 객체 자신 |
| pageContext | javax.servlet.jsp.PageContext |
JSP 페이지의 context 정보를 제공 |
| exception | java.lang.Throwable |
예외 발생 시 생성되는 예외 객체isErrorPage="true"인 페이지에서만 사용 가능 |
request 객체
- 웹 브라우저(클라이언트)에서 서버의 JSP 페이지로 전달되는 정보를 저장한다.
- JSP Container는 이 정보를 처리하기 위해
javax.servlet.http.HttpServletRequest타입의 request 객체를 사용한다.
| 구분 | 메서드 | 설명 |
|---|---|---|
| 요청 파라미터 | String getParameter(String name) |
요청 파라미터 이름이 name인 값을 반환. 값이 없으면 null 반환 |
String[] getParameterValues(String name) |
요청 파라미터 이름이 name인 모든 값을 배열로 반환. 값이 없으면 null 반환 | |
java.util.Enumeration getParameterNames() |
모든 요청 파라미터의 이름과 값을 Enumeration 객체 타입으로 반환 | |
java.util.Map getParameterMap() |
모든 요청 파라미터의 이름과 값을 Map 객체 타입으로 반환 | |
| 요청 HTTP 헤더 | String getHeader(String name) |
설정한 name의 헤더 값을 반환 |
java.util.Enumeration getHeaders(String name) |
설정한 name의 헤더 목록 값을 반환 | |
java.util.Enumeration getHeaderNames() |
모든 헤더의 이름을 반환 | |
int getIntHeader(String name) |
설정한 name의 헤더 값을 정수로 반환 | |
long getDateHeader(String name) |
설정한 name의 헤더 값을 시간 값으로 반환 | |
javax.servlet.http.Cookie getCookies() |
모든 Cookie값 반환 | |
| 웹브라우저/서버 | String getRemoteAddr() |
웹 브라우저의 IP 주소 반환 |
long getContentLength() |
웹 브라우저의 요청 파라미터의 길이를 반환 | |
String getCharacterEncoding() |
웹 브라우저의 문자 인코딩을 반환 | |
String getContentType() |
웹 브라우저의 콘텐츠 유형을 반환 | |
String getProtocol() |
웹 브라우저의 요청 프로토콜을 반환 | |
String getMethod() |
웹 브라우저의 HTTP 요청 메서드(GET, POST)를 반환 | |
String getRequestURI() |
웹 브라우저가 요청한 URI 경로를 반환 | |
String getContextPath() |
현재 JSP 페이지의 웹 어플리케이션 context 경로를 반환 | |
String getServerName() |
서버의 이름을 반환 | |
int getServerPort() |
서버의 포트 번호를 반환 | |
String getQueryString() |
웹 브라우저의 전체 요청 파라미터 문자열(query string)을 반환 | |
| ServletRequest 상속 | void setAttribute(String name, Object obj) |
request 객체에 Attribute를 설정 |
<%@ 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>
<!-- 웹 페이지에서 작성한 내용을 넘겨주기 -->
<form action="request01_process.jsp" method="post">
<p> 아이디 : <input name="id"> </p>
<p> 비밀번호 : <input name="password" type="password"> </p>
<p> <input type="submit" value="전송"> </p>
</body>
</html>
<%@ 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>
<% // request 기본 객체를 이용해 웹 브라우저에서 전송된 데이터 받기
request.setCharacterEncoding("utf-8"); // 인코딩 설정
String id = request.getParameter("id");
String password = request.getParameter("password");
%>
<p> 아이디 : <%= id %> </p>
<p> 비밀번호 : <%= password %> </p>
</body>
</html>
- 첫 페이지에서 아이디와 비밀번호를 입력하고 전송 버튼을 누른다.
- 두 번째 페이지에서 아이디와 비밀번호 정보를 성공적으로 가져왔음을 알 수 있다.
- POST 방식으로 전달했기 때문에 URI에 query string(?로 시작하는 부분) 내용에 아이디와 비밀번호가 없다.
<!-- Header 정보 확인해보기 -->
<%@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>Insert title here</title>
</head>
<body>
<%
Enumeration<String> en = request.getHeaderNames();
while (en.hasMoreElements()) {
String headerName = en.nextElement();
String headerValue = request.getHeader(headerName);
out.println(headerName + " : " + headerValue + "<br>");
}
%>
</body>
</html>
response 객체
-
클라이언트의 요청(request) 처리 결과를 서버에서 웹 브라우저로 보낼 때 필요한 정보를 저장한다.
- response header와 요청 처리 결과 데이터를 웹 브라우저로 보낸다.
- HTTP header 참고.
-
JSP Container는 이 정보를 처리하기 위해
javax.servlet.http.HttpServletResponse타입의 response 객체를 사용한다. -
페이지 이동 방법
| 항목 | forward | redirect |
|---|---|---|
| 동작 | 서버 내부에서 이동 | 클라이언트에게 재요청 |
| 주소 | URL이 변경되지 않음 | URL이 변경됨 |
| 요청/응답 객체 | 그대로 전달 | 새 요청으로 처리 |
| 속도 | 빠름 | 상대적으로 느림 |
| 사용 | 내부 처리의 흐름을 유지할 때 | 외부 페이지 이동 새 요청이 필요할 때 |
| 구분 | 메서드 | 설명 |
|---|---|---|
| 페이지 이동 | void sendRedirect(String url) |
설정한 URL 페이지로 강제 이동 |
| 응답 HTTP 헤더 | void addCookie(Cookie cookie) |
cookie를 추가 |
void addDateHeader(String name, long date) |
설정한 헤더 name에 날짜와 시간 추가 | |
void addHeader(String name, String value) |
설정한 헤더 name에 value를 추가 | |
void addIntHeader(String name, int value) |
설정한 헤더 name에 정수 value 추가 | |
void setDateHeader(String name, long date) |
설정한 헤더 name에 날짜와 시간을 설정 | |
void setHeader(String name, String value) |
설정한 헤더 name에 value를 설정 | |
void setIntHeader(String name, int value) |
설정한 헤더 name에 정수 value 설정 | |
boolean containsHeader(String name) |
설정한 헤더 name이 HTTP 헤더에 포함되어 있는지 여부 반환 | |
String getHeader(String name) |
설정한 헤더 name 값 반환 | |
| 응답 컨텐츠 | void setContentType(String type) |
웹 브라우저에 응답할 MIME 유형 설정 |
String getContentType() |
웹 브라우저에 응답할 MIME 유형 반환 | |
void setCharacterEncoding(String charset) |
웹 브라우저에 응답할 문자 인코딩 설정 | |
String getCharacterEncoding() |
웹 브라우저에 응답할 문자 인코딩 반환 | |
void sendError(int status_code, String message) |
웹 브라우저에 응답할 에러 코드와 메시지를 설정 | |
void setStatus(int status_code) |
웹 브라우저에 응답할 HTTP 코드를 설정 |
- MIME(Multipurpose Internet Mail Extensions) : 전자 우편을 위한 인터넷 표준 포맷.
- ASCII가 아닌 문자 인코딩을 통해 영어 외의 다른 문자로 된 전자 우편을 주고 받을 수 있도록 한다.
- 그림, 영화, 프로그램과 같은 8 비트짜리 binary 파일을 전자 우편으로 주고 받을 수 있도록 한다.
- 참고 자료 : 위키백과 MIME
<!-- 정보를 받을 로그인 페이지 -->
<%@ 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>
<form action="response01_process.jsp" method="post">
<p> 아이디 : <input name="id"> </p>
<p> 비밀번호 : <input name="password" type="password"> </p>
<p> <input type="submit" value="전송"> </p>
</form>
</body>
</html>
<!-- 아이디와 비밀번호를 받아 로그인 실패 여부를 판단하는 파일 -->
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%!
String[][] account = {{"관리자", "1111"}, {"aaa", "1234"}, {"user", "0000"}};
%>
<%
request.setCharacterEncoding("utf-8");
String id = request.getParameter("id");
String password = request.getParameter("password");
if (id.equals(account[0][0]) && password.equals(account[0][1])) {
response.sendRedirect("response01_admin_success.jsp");
} else if (id.equals(account[1][0]) && password.equals(account[1][1])
|| id.equals(account[2][0]) && password.equals(account[2][1])) {
response.sendRedirect("response01_success.jsp");
} else {
response.sendRedirect("response01_fail.jsp");
}
%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
</body>
</html>
<!-- 일반 로그인 성공 페이지 -->
<%@ 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>
<p> 로그인을 성공했습니다. </p>
</body>
</html>
<!-- 관리자 로그인 성공 페이지 -->
<%@ 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>
<p style="font-weigth:bold; color:blue;"> 관리자 로그인을 성공했습니다. </p>
</body>
</html>
<!-- 로그인 실패 페이지 -->
<%@ 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>
<p style="color:red;">로그인에 실패했습니다.</p>
<p><a href="response01.jsp">로그인 페이지로 돌아가기</a>
</body>
</html>
-
일반 로그인 성공 시

-
관리자 로그인 성공 시

-
로그인 실패 시

out 객체
- 서버의 응답(response)에 포함될 내용을 HTML로 웹 브라우저에 표시할 때 사용하는 객체다.
| 메서드 | 설명 |
|---|---|
void print(String str) |
str을 웹 브라우저에 출력 |
void println(String str) |
str을 웹 브라우저에 줄바꿈을 적용하여 출력 |
void newLine() |
웹 브라우저에 줄바꿈을 출력 |
int getBufferSize() |
현재 출력 버퍼의 크기를 반환 |
int getRemaining() |
현재 남아 있는 출력 버퍼의 크기를 반환 |
void clear() |
현재 출력 버퍼에 저장되어 있는 내용을 웹 브라우저에 전송하지 않고 비움 |
| 이미 버퍼가 flush 되었다면 IOException 발생 | |
void clearBuffer() |
clear()와 비슷하지만 버퍼가 이미 flush되었을 때 IOException이 발생하지 않음 |
void flush() |
현재 출력 버퍼에 저장되어 있는 내용을 웹 브라우저에 전송하고 비움 |
boolean isAutoFlush() |
출력 버퍼가 채워졌을 때 자동 처리 여부 결정. true는 자동 flush, false는 수동 flush |
- entity tag 참고 자료 : ANEOK's HTML 자주 사용하는 특수문자 코드표(Entity code), W3School HTMl entities
<!-- 웹 페이지에 출력할 내용 작성 시 -->
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%!
String str = "선언문에서 만든 String";
%>
<%
out.println("out 내장 객체는 scriptlet에서만 사용할 수 있습니다.");
out.print(str);
%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
<br>
이 곳에 작성된 내용도 웹 페이지에 표시 됩니다. <br>
<%= str %>은 이렇게도 출력할 수 있습니다. <br>
위 내용에서 entity code를 사용해서 <%= str %>으로 출력했음을 알 수 있습니다.
</body>
</html>
예제
- 구구단 제작을 두 가지 방법으로 진행
- out.print()을 사용하여 html을 출력하도록 했을 때
<!-- out.print()을 사용하여 html을 출력하도록 했을 때-->
<%@ 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>
<style>
table{border: 2px solid black;
border-collapse: collapse;
}
</style>
</head>
<body>
<table border="1">
<%
for(int i = 1; i <= 9; i++) {
out.println("<tr>");
for(int j = 2; j <= 9; j++) {
out.print("<td>"+j+" * "+i+" = "+(j*i)+" </td>");
}
out.println("</tr>");
}
%>
</table>
</body>
</html>
- scriptlet으로만 작성했을 때
<%@ 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>
<style>
table{border: 2px solid black;
border-collapse: collapse;
}
</style>
</head>
<body>
<table border="1">
<% for(int i = 1; i <= 9; i++) { %>
<tr>
<% for(int j = 2; j <= 9; j++) {%>
<td>
<%= j %> * <%= i %> = <%= j*i %>
</td>
<% } %>
</tr>
<% } %>
</table>
</body>
</html>
- 두 코드의 결과물은 차이가 없다.
- 하지만 이후 사용한 Filter로 코드를 돌리는데 소요된 시간을 비교한 결과는 매우 큰 차이를 보였다.
- 다른 환경에서 진행하여 파일 이름이 조금 다르지만 gugudan.jsp이 gugudan1.jsp 이다.
- out.print()로 html을 작성한 결과보다 scriptlet으로 작성한 결과가 훨씬 빠르다.