JSP 내장 객체와 액션 태그1 (D-96)

최우정·2022년 5월 16일
0

100일

목록 보기
5/17
post-thumbnail

JSP 에서는 내장 객체를 자동으로 생성해서 제공해 주기 때문에 서블릿 코드에서 개발자가 직접 작성했던 필요한 객체들을 생성하지 않고 내장 객체를 이용해서 필요한 작업을 할 수 있다.

📒 내장 객체

JSP 페이지는 웹 컨테이너에 의해 서블릿 클래스로 변환되어 사용자의 요청을 수행한다.

JSP 내장 객체(Implicit Object)는 JSP를 지원하는 웹 컨테이너에서 서블릿을 구현하는데 공통적으로 요구되는 javax.servelt 패키지 아래 8개의 객체와 예외 처리를 위한 java.lang 패키지 아래 1개의 객체를 각각 JSP 스펙에서 정해진 이름의 객체로 제공한다.

JSP 스펙에서 규정하고 있는 내장 객체는 아래와 같다.
사용자는 이들 내장 객체가 사용하는 이름과 같은 이름을 가진 변수를 JSP 페이지 내의 스클립틀릿 안에 정의, 사용하면 안된다.

내장 객체 변수명

✏️ request 객체

사용자가 서버에 웹 브라우저를 통해 페이지(자원)를 요청할 경우, 브라우저는 사용자 요청과 관련된 일련의 데이터들을 HTTP 메시지로 구성해 서버에 전송하게 된다.

HTTP 메시지는 헤더와 본문으로 구성되며, 웹 서버는 HTTP 메시지를 수신하여 그 안의 정보를 분석해 이 요청이 서블릿/JSP 요청으로 판명될 경우(요청된 URI가 배포 서술자나 어노테이션에 정의되어 있는 경우) JSP/서블릿 컨테이너에 요청에 대한 처리를 넘기게 된다.

JSP/서블릿 컨테이너는 전송 받은 HTTP 메시지를 통해 HttpServletRequest 객체를 생성하고 이를 서블릿 인스턴스에 넘겨줌으로써 서블릿이 사용자의 요청에 관련된 데이터들을 얻게 된다.

JSP 페이지에서는 이 HttpServletRequest 객체를 request란 이름의 객체로 사용한다.

📝 요청 파라미터와 관련된 메소드

# requsetTest1_Form.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Request Test</title>
<style>
h1, #commandCell {
	text-align: center;
}
table {
	margin: auto;
	width: 400px;
	border: 1px solid red;
}
</style>
</head>
<body>
	<h1>Request 예제입니다.</h1>
	<form action="requestTest1.jsp" method="post">
		<table>
			<tr>
				<td><label for = "name">이름</label></td>
				<td><input type = "text" name = "name" id = "name"></td>
			</tr>
			<tr>
				<td><label for = "gender">성별</label></td>
				<td><input type = "radio" name = "gender" value = "male" id = "gender"><input type ="radio" name = "gender" value = "female">
				</td>
			</tr>
			<tr>
				<td><label for = "hobby">취미</label></td>
				<td>
					독서<input type = "checkbox" name = "hobby"  value = "독서 " id = "hobby">
					게임<input type = "checkbox" name = "hobby"  value = "게임 " id = "hobby">
					TV시청<input type = "checkbox" name = "hobby"  value = "TV시청" id = "hobby">
					축구<input type = "checkbox" name = "hobby"  value = "축구" id = "hobby">
					기타<input type = "checkbox" name = "hobby"  value = "기타" id = "hobby">
				</td>
			</tr>
			<tr>
				<td colspan="2" id = "commandCell"><input type = "submit" value = "전송"></td>
			</tr>
		</table>
	</form>
</body>
</html>

requestTest1.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%request.setCharacterEncoding ("UTF-8");%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Request Test</title>
<style>
h1 {
	text-align: center;
}

table {
	margin: auto;
	width: 400px;
	border: 1px solid red;
}
</style>
</head>
<body>
	<h1>Request 예제입니다.</h1>
	<table>
		<tr>
			<td>이름</td>
			<td><%=request.getParameter("name") %></td>
		</tr>
		<tr>
			<td>성별</td>
			<td>
				<%if (request.getParameter("gender").equals("male")) {%>남자<%} else {%>여자<%} %>
			</td>
		</tr>
		<tr>
			<td>취미</td>
			<td>
			<%
			String[] hobby = request.getParameterValues("hobby");
			for (int i=0; i<hobby.length; i++){
			%>
			<%=hobby[i] %>&nbsp; &nbsp;	
			<%} %>
			</td>
		</tr>
	</table>
</body>
</html>

📝 HTTP 헤더 정보와 관련된 메소드들

requestTest2.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%@page import="java.util.Enumeration"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Request Test2</title>
<style>
h1 {
	text-align: center;
}
table {
	margin: auto;
	width: 400px;
	border: 1px solid red;
}
</style>
</head>
<body>
	<h1>헤더정보 예제</h1>
	<table>
		<tr>
			<td>헤더이름</td>
			<td>헤더값</td>
		</tr>
		<%
		Enumeration e =request.getHeaderNames();
		while(e.hasMoreElements()){
			String headerName=(String)e.nextElement();
		%>
		<tr>
			<td><%=headerName %></td>
			<td><%=request.getHeader(headerName) %></td>
		<%}%>
	</table>
</body>
</html>

📝 세션 정보와 관련된 메소드들

📝 쿠키, URL/URI, 요청 방식과 관련된 메소드들

requestTest3.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Request Test3</title>
<style>
h1 {
	text-align: center;
}
table {
	margin: auto;
	width: 600px;
	border: 1px solid red;
}
</style>
</head>
<body>
	<h1>쿠키, URL/URI, 요청 방식에 관련된 정보 예제</h1>
	<table border="1">
		<tr>
			<td>쿠키 정보</td>
	<%
	Cookie[] cookie=request.getCookies();
	if(cookie==null){
	%>
		<td>쿠키가 존재하지 않습니다.</td>
	<%
	} else {
		for (int i=0; i<cookie.length; i++){
			%>
			<td><%=cookie[i].getName() %>(<%=cookie[i].getValue() %>)&nbsp;&nbsp;</td>
			<%
		}
	}
	%>
		</tr>
		<tr>
			<td>서버 도메인명</td>
			<td><%=request.getServerName() %></td>
		<tr>
			<td>서버 포트번호</td>
			<td><%=request.getServerPort() %></td>
		<tr>
			<td>요청 URL</td>
			<td><%=request.getRequestURL() %></td>
		<tr>
			<td>요청 URI</td>
			<td><%=request.getRequestURI() %></td>
		<tr>
			<td>요청 쿼리</td>
			<td><%=request.getQueryString() %></td>
		<tr>
			<td>클라이언트 호스트명</td>
			<td><%=request.getRemoteHost() %></td>
		<tr>
			<td>클라이언트 IP 주소</td>
			<td><%=request.getRemoteAddr() %></td>
		<tr>
			<td>프로토콜</td>
			<td><%=request.getProtocol() %></td>
		<tr>
			<td>요청 방식</td>
			<td><%=request.getMethod() %></td>			
		<tr>
			<td>컨텍스트 경로</td>
			<td><%=request.getContextPath() %></td>
	</table>
</body>
</html>

✏️ response 객체

클라이언트의 요청에 대한 HTTP 응답 (HTTP Response)을 나타내는 개체로 웹 컨테이너에서는 javax.servlet.http.HttpServletResponse 인터페이스를 사용해 response 객체를 생성한다.

responseTest1.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%
response.sendRedirect ("responseTest2.jsp");
%>

responseTest2.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Response Test</title>
</head>
<body>
	<h1>
	현재 페이지는 responseTest2.jsp에 의해 <br>
	리다이렉트 된 페이지입니다.
	</h1>
</body>
</html>

response.sendRedirect 메소드를 사용해서 페이지를 전환하면 리다이렉트 방식으로 페이지가 전환되며 리다이렉트 방식은 요청이 변경되면 클라이언트 주소 표시줄의 URL이 변경된다.

✏️ pageContext 객체

javax.servlet.jsp.PageContext 클래스를 상속하여 웹 컨테이너가 구현한 객체로 JSP 페이지와 관련된 프로그램에서 다른 내장 객체를 얻어내거나 현재 페이지의 요청과 응답의 제어권을 다른 페이지로 넘겨주는데 사용한다.

다른 중요한 기능으로 request, session, application 처럼 내장 객체의 속성을 제어한다.

pageContextTest1.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<% 
pageContext.forward("pageContextTest2.jsp");
%>

pageContextTest2.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>pageContext Test</title>
</head>
<body>
	<%
		pageContext.include("pageContextTest3.jsp");
	%>
	<h2>pageContext의 forward 메소드로 포워딩된 페이지입니다.</h2>
</body>
</html>

pageContextTest3.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<h3>include 되는 pageContextTest3.jsp 페이지입니다.</h3>

response 객체의 sendRedirect 메소드를 사용했을 경우와 다르게 처음 실행된 pageContextTest1.jsp의 주소가 그대로 유지되어 있다.
요청과 응답에 대한 제어권을 다른 페이지로 넘기더라도 브라우저에 표시되는 주소가 유지되는 방식을 디스패치 방식이라고 한다.

이에 반해, 브라우저에 표시되는 주소가 바뀌는 방식을 리다이렉트 방식이라고 하며, 리다이렉트 방식은 이동할 페이지로 요청과 응답 객체를 새로 생성하여 전송하므로 요청 정보와 응답 정보가 유지되지 않는 특성이 있다.

✏️ session 객체

HTTP 프로토콜은 요청(request)/응답(response)의 구조로 되어 있어 서버가 요청에 대한 응답을 전송하고 나면 연결이 끊어지게(Stateless) 된다.

정보가 유지되어야 할 필요가 있는 경우를 위해 가상 연결(Virtual Connection)이라는 개념의 세션이 등장하였고, JSP에서는 session 내장 객체로 구현한다.

sessionTest1.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%
	session.setMaxInactiveInterval(10);
%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Session Test</title>
</head>
<body>
	<h2>세션 테스트</h2>
	isNew():<%=session.isNew() %><br>
	생성시간:<%=session.getCreationTime() %><br>
	최종 접속 시간:<%=session.getLastAccessedTime() %><br>
	세션ID:<%=session.getId() %><br>
</body>
</html>

10초 뒤 새로 고침

소스의 4 라인에서 클라이언트의 요청이 없으르 경우 세션 유지 시간을 10초로 설정했으므로 10초가 지나기 전에 <F5키>로 새로 고침을 해보면 동일한 ID와 생성 시간을 가진(세션이 유지되는) 화면을 볼 수 있다.

✏️ application 객체

웹 애플리케이션의 실행 환경을 제공하는 서버의 정보와 서버측 자원에 대한 정보를 얻어내거나 해당 애플리케이션의 이벤트 로그를 다루는 메소드들을 제공한다.

application은 각 웹 애플리케이션당 오직 하나만의 객체만이 생성되므로 해당 웹 애플리케이션 전체 영역에서 자원을 공유해야 할 때(방문자 수 등의 통계를 다룰 때) 주로 사용된다.

applicationTest1.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Application Test</title>
</head>
<body>
	<h2>application 테스트</h2>
	<table border="1">
		<tr>
			<td>JSP 버전</td>
			<td><%=application.getMajorVersion() %>.<%=application.getMinorVersion() %></td>
		</tr>
		<tr>
			<td>컨테이너 정보</td>
			<td><%=application.getServerInfo() %></td>
		</tr>
		<tr>
			<td>웹 애플리케이션의 실제 파일시스템 경로</td>
			<td><%=application.getRealPath("/") %></td>
		</tr>
	</table>
</body>
</html>

✏️ out 객체

서블릿/JSP 컨테이너가 응답 페이지를 만들기 위해 사용하는 출력 스트림 객체지만, JSP 에서는 out 객체를 사용하는 일은 빈번하지 않다.
표현식 태그와 out 객체의 print() 메소드는 그 처리 과정이 완전히 동일하다.

outTest1.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
	<h2>1부터 100까지의 합은
<%
	int sum = 0;
	for(int i=1; i<=100; i++){
		sum+=i;
	}
	out.print(sum+"입니다.</h2>");
%>
	</h2>

outTest2.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
    <h2>1부터 100까지의 합은
<%
	int sum = 0;
	for(int i=1; i<=100; i++){
		sum+=i;
	}
%>
<%=sum %>입니다.</h2>

outTest3.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Out Test</title>
</head>
<body>
<h2>Out 테스트</h2>
<table border="1">
	<tr>
		<td>autoFlush 여부</td>
		<td><%=out.isAutoFlush() %></td>
	</tr>
	<tr>
		<td>출력 버퍼의 크기</td>
		<td><%=out.getBufferSize() %>바이트</td>
	</tr>
	<tr>
		<td>출력 버퍼의 남은 양</td>
		<td><%=out.getRemaining() %>바이트</td>
	</tr>
</table>
</body>
</html>

✏️ config 객체

JSP 페이지가 서블릿 클래스로 변환되어 서블릿 인스턴스가 생성될 때 참조해야 할 초기 설정 정보들을 저장해 놓은 객체이다.
이러한 초기 설정 정보들은 웹 컨테이너가 구동될 때 내부에서 자체적으로 생성/관리되며 서블릿당 1개만의 객체가 생성되며 같은 서블릿 인스턴스는 동일한 config 객체를 참조하게 된다.

configTest1.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%@page import="java.util.Enumeration" %>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Config Test</title>
</head>
<body>
	<h2>config 테스트</h2>
	<table border="1">
		<tr>
			<td>초기 파라미터 이름</td>
			<td>초기 파라미터 값</td>
		</tr>
<%
	Enumeration e=config.getInitParameterNames();
	while(e.hasMoreElements()){
		String init_paramName=(String)e.nextElement();
		%>
		<tr>
			<td><%=init_paramName %></td>
			<td><%=config.getInitParameter(init_paramName) %></td>
		</tr>
		<%
	}
%>	
	</table>
</body>
</html>

✏️ page 객체

JSP 페이지에 의해 생성되는 서블릿 인스턴스 자체를 나타내는 객체이다.

✏️ exception 객체

JSP 페이지에서 예외가 발생했을 경우, 그 예외를 처리할 에러 페이지를 사용자가 지정한 경우에 해당 페이지에 전달되는 예외 객체이다.
exception 객체를 사용하기 위해서는 해당 페이지가 에러 페이지로 지정되어 있어야만 한다.

profile
비전공자 Java, JavaScript, Html, Css, C++ 공부중

0개의 댓글