본문 바로가기

Study/JSP

[JSP]내장객체, 액션태그, 영역객체(Scope)

내장객체

jsp의 내장객체란, jsp 페이지가 웹 컨테이너에 의해 서블릿으로 변환될 때 자동 생성되는 객체를 말하며, 클래스나 import 구문이 없어도 사용 가능하다. 변환 시 필수 내장객체가 9가지 있는데, javax.servlet 패키지 내의 8개와 java.lang 패키지의 exception 객체로 이루어져 있다.

request 객체는 클라이언트의 HTTP 요청 정보를 저장하고, reponse 객체는 그 요청에 대한 응답 정보를 저장한다. session 객체는 클라이언트의 세션 정보를 저장, pageContext 객체는 실행에 필요한 프로젝트 정보를 저장하며, application 객체는 동일한 애플리케이션의 콘텍스트 정보를 저장한다. 그리고 config 객체는 페이지 설정값(서블릿 초기화 정보)을 저장하는 객체, out 객체는 출력 스트림 객체, page 객체는 해당 페이지의 서블릿 객체다. 여기까지가 javax.servlet 패키지 객체들이고, exception 객체는 이름대로 예외를 처리한다.

 

내장객체 가운데에서도 가장 많이 쓰이는 request, response, out, session, application 객체에 대해서는 예시를 몇 가지 적었다. 아래는 request와 response 객체다.

<!-- request 객체 -->
서버 도메인명 : <%=request.getServerName()%> <br>
서버 포트번호 : <%=request.getServerPort()%> <br>

URL : <%=request.getRequestURL()%> <br>    <!-- 프로토콜 + 도메인명 + 포트번호 + URI -->
URI : <%=request.getRequestURI()%> <br>
프로토콜 : <%=request.getProtocol()%> <br>

클라이언트 호스트명 : <%=request.getRemoteHost()%> <br>
클라이언트 IP주소 : <%=request.getRemoteAddr()%> <br>

페이지 요청 방식 : <%=request.getMethod()%> <br>
프로젝트 경로 : <%=request.getContextPath()%> <br>
물리적 경로 : <%=request.getRealPath("/")%> <br>

[http 헤더 정보]
user-agent : <%=request.getHeader("user-agent")%> <br>
accept-language : <%=request.getHeader("accept-language")%> <br>
host : <%=request.getHeader("host")%> <br>
connection : <%=request.getHeader("connection")%>



<!-- response 객체 -->
<%
response.setHeader("헤더이름", 값); <br>              //request.getHeader()과 연결
response.addCookie("쿠키값"); <br>
response.sendRedirect("주소"); <br>                  //주소로 바로 이동
response.setContentType("속성값"); <br>

response.addHeader("Refresh", "n"); <br>             //n초에 한번씩 페이지 자동 새로고침
response.addHeader("Refresh", "n;url=주소"); <br>    //n초 후 해당 주소로 페이지 이동
%>

 

또한 out, application, session 객체는 이렇게 사용될 수 있다.

<!-- out 객체 -->
<% out.print("안녕하세요"); %>
버퍼 사이즈 : <%=out.getBufferSize()%> byte <br>
버퍼 사용 후 사이즈 : <%=out.getRemaining()%> byte <br>
<% out.close(); %>
버퍼 닫은 후 사이즈 : <%=out.getBufferSize()%> byte <br>



<!-- application 객체 -->
서버정보 : <%=application.getServerInfo()%> <br>
서버의 물리적 경로 : <%=application.getRealPath("/")%>



<!-- session 객체 -->
세션 ID값 : <%=session.getId()%> <br>

세션생성시간(ms) : <%=session.getCreationTime()%> <br>
최종접속시간(ms) : <%=session.getLastAccessedTime()%> <br>

<%
long cTime = session.getCreationTime();
long lTime = session.getLastAccessedTime();
long result = lTime - cTime;
%>

접속경과시간(ms) : <%=result%> <br>

세션 유지 가능시간(기본) : <%=session.getMaxInactiveInterval()%> <br>    <!-- 1800초 -->
<% session.setMaxInactiveInterval(3600); %>     <!-- 3600초로 변경 -->

 

액션태그

내장객체를 더 설명하기 전에 액션태그를 알아야 한다. 액션태그란 태그 형태로써 jsp 코드 역할을 수행하는 것으로, <jsp:OOO /> 형태로 사용한다. 이 액션태그 중 가장 많이 사용되는 것은 include, forward, param인데, <jsp:include page="">는 외부 jsp 페이지를 삽입한다. jsp 지시어인 <%@ include file="" %>도 페이지 삽입이 가능하지만 차이가 있다. 액션태그에서는 외부 페이지를 컴파일 후 include 시키고, 지시어에서는 페이지를 include 후 컴파일한다는 점이다. 보통 액션태그 삽입은 template 페이지 추가에 사용하며, 지시어 삽입은 공통으로 쓰게 될 변수가 선언된 페이지에 사용한다.

그리고 forward는 페이지를 이동시키는 역할을 하는데, 이를 포워딩이라고 한다. response.sendRedirect 와 비슷하지만 전달되는 정보의 범위가 다르다. 또한 param은 forward의 하위 격인 태그로, 페이지에 넘겨줄 추가 정보가 있다면 param을 사용하면 된다.

<!-- color.jspf 페이지 -->
<% String col = "pink"; %>



<!-- test 페이지 -->
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%@ include file="../color.jspf" %>    <!-- 지시어 삽입 -->
.
.
<body bgcolor="<%=col%>">    <!-- color.jspf 페이지의 변수 사용 -->

<jsp:include page="페이지경로">    <!-- 액션태그 삽입 -->
    <jsp:param value="param" name="param"/>    <!-- param 태그 -->
</jsp:include>

</body>

 

영역객체(Scope)

jsp 내장객체 중 특정 영역에 정보를 저장하고, 그 정보를 공유 가능한 객체를 영역객체라고 하는데, pageContext와 request, session, application이 있다. pageContext의 영역은 page, 나머지는 객체=영역이다. pageContext의 사용범위는 서블릿 인스턴스(_jspService)가 실행되는 동안, request는 클라이언트 요청이 처리되는 페이지 내에서, session은 세션이 유지되는 동안이며, application은 웹 애플리케이션(서버)이 실행되는 동안이다.

영역객체에 정보 저장은 영역객체.setAttribuute("속성명", 값) 으로 하고, 사용은 영역객체.getAttribute("속성명") 으로 한다. 받은 정보를 특정 페이지로 넘기며 이동할 때, 이동 방식에 따라 전달 가능한 영역객체가 달라진다. a 태그(하이퍼링크)와 js 코드(location.href), jsp 코드(response), 액션태그(포워딩) 방식 모두 parameter, session, application 값을 전달하지만 포워딩만이 request까지 전달할 수 있다.

그러나 포워딩 방식은 화면만 이동하기 때문에 주소는 그대로 남는다. 이 포워딩 방식은 MVC에서 사용되는데, 여기에 대해서는 나중에 설명할 것이다. 또한 jsp 페이지에서는 코드 우선순위가 jsp - html - js 순이라서 이 4가지 방식들이 동시에 적용될 수는 없다.

 

아래에 영역객체 예시 코드를 적었다. Form 페이지에서 id값을 받으면 Pro 페이지로 이동, Pro 페이지에서 영역객체들의 속성 값을 설정하고 바로 Action 페이지로 이동 후, 전달받은 모든 값을 출력하는 코드다.

Form 페이지에서는 단순히 form - input 태그를 써서 입력값을 받고 action 페이지(Pro)로 넘긴다.

그리고 Pro 페이지에서 전달받은 id를 request 객체로 저장하고 출력하지만, 이 페이지에서 머무르지 않고 Action 페이지로 넘어가기 때문에 출력된 id는 볼 수 없다. 또한 화면 하단에서 보이는 이동 방식 중 jsp 코드와 액션태그는 우선순위가 같아서, 하나를 주석 처리해야 에러가 나지 않는다. 위 코드처럼 페이지 이동 시 주소 줄에 정보(id와 pw)를 추가하여 전달하는 방법은 get 방식에서만 사용 가능하다.

이렇게 Action 페이지에서 정보를 받아 모두 출력시키면 아래 화면이 뜬다.

Pro 페이지에서 액션태그를 사용하여 넘어왔기 때문에, 주소 줄 페이지와 실제 화면 페이지가 다른 것을 볼 수 있다. 더불어 다른 이동 방식으로는 null이었을 request 객체 속성 값도 출력이 됐다.

참고로 개발자가 관리하는 attribute와 달리 parameter는 사용자의 입력을 받는 값이라 setParameter가 존재하지 않는다. 더불어 parameter 값의 데이터 타입은 무조건 String이다.

'Study > JSP' 카테고리의 다른 글

[JSP]JDBC - 이클립스와 MySQL 연결  (0) 2022.02.17
[JSP]세션(Session)과 쿠키(Cookie)  (0) 2022.02.10
[JSP]JSP와 폼 태그  (0) 2022.01.25
[JavaScript]문서 객체 모델(DOM)  (0) 2022.01.19
[JavaScript]브라우저 객체 모델(BOM)  (0) 2022.01.17