JSP + Servlet | 내장 객체 2/2

파과·2022년 7월 13일
0

JSP + Servlet

목록 보기
6/33
post-custom-banner

포워드 방식으로 이동하기

JSP에서 다른 페이지로 이동하기 위한 방법은 두 가지가 있다.

  1. 리다이렉트 방식
  2. 포워드 방식
  • 리다이렉트 방식은 response 객체의 sendRedirect()로 페이지를 이동한다. 페이지를 이동하면서 request와 response객체는 유지되지 않는다.

  • 포워드 방식은 requestDispatcher 객체의 forward()를 사용한다. requestDispatcher는 request객체의 getRequestDispatcher() 메소드를 호출하여 얻어낸다. 그리고 forward()메소드를 호출하면 getRequestDispatcher()메소드의 매개변수로 지정한 페이지로 이동하게 된다.

RequestDispatcher dispatcher = request.getRequestDispatcher("200_forwardResult.jsp);
dispatcher.forward(request, response);
  • 포워드 방식은 서버 상에서 페이지가 이동되기 때문에 브라우저는 알아채지 못하고, URL도 변경되지 않는다(사용자가 내부적으로 일어나는 일을 감지할 수 없다). 또한 기존의 request와 response는 유지된다.

  • sendRedirect()에서는 쿼리 스트링 형태로 데이터를 전송했지만, forward()에서는 기존 request객체가 그대로 유지되기 때문에 setAttribute()메소드로 request객체에 속성값(속성이름, 속성값 순)으로 데이터를 저장해 보내준다.

request.setAttribute("age", 20);

이동한 페이지에서 속성값을 얻어와 사용할 때는 getAttribute() 사용.
리턴타입이 Object이므로 int변수에 저장하려면 cast연산자 사용한다.

int age = (Integer)request.getAttribute("age");

sendRedirect() 로 한글을 전송하려면 URLEncoder.encode() 메소드로 묶어줘야 한다.
forward() 메소드는 한글 전송을 위해 별다른 처리를 하지 않아도 된다. (물론 변수에 저장할 때 cast연산자 사용해줘야 한다.)

예시 - 성년만 입장 가능한 사이트 만들기

forwardForm.jsp : 나이 입력폼 페이지
forwardTest.jsp : 입력받은 나이가 19세 미만이면 페이지 이동이 불가능하고, 나이가 20세 이상이면 forwardResult.jsp로 이동시킴.
forwardResult.jsp : 전송한 나이와 이름 출력 페이지

forwardForm.jsp

<%@ 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>
	입장하시려면 나이를 입력해 주세요. <br>
	<form action="200_forwardTest.jsp">
		<input type="text" name="age">
		<input type="submit" value="입장"> 
	</form>
</body>
</html>

forwardResult.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%
	String age = request.getParameter("age");
	String name = (String)request.getAttribute("name");
%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body bgcolor=pink>

forward 방식으로 이동된 페이지 <br>
나이: <%=age %>
이름: <%=name %>

</body>
</html>

forwardTest.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>

<% 
	int age = Integer.parseInt(request.getParameter("age"));
	if(age <= 19){
		%>
		<script type="text/javascript">
			alert("19세 미만이므로 입장 불가능");
			history.go(-1)
		</script>
		<%
	}else{
		request.setAttribute("name", "성윤정");
		RequestDispatcher dispatcher = request.getRequestDispatcher("200_forwardResult.jsp");
		dispatcher.forward(request, response);
	}
%>

application 내장 객체

application 내장 객체는 하나의 웹 애플리케이션을 관리하고 웹 애플리케이션 안에서의 자원을 공유한다. 하나의 웹 애플리케이션이란 하나의 웹 프로젝트를 의미한다.

application 객체도 request처럼 정보(자원)을 속성에 저장해 다른 페이지에 전달할 수 있다.

application.setAttribute("name", "application man");

application객체에 저장된 내용은 한 프로젝트 내의 모든 JSP 페이지에서 공통적으로 사용할 수 있게 된다.

내장 객체의 영역

내장 객체의 영역은 객체의 유효기간이라고도... 한다. 객체가 얼마 동안 살아있는가? 를 지정해 주는 것이 영역. 영역은 총 4개가 있다.

영역설명
page하나의 JSP페이지를 처리할 때 사용되는 영역
request하나의 요청을 처리할 때 사용되는 영역
session하나의 브라우저와 관련된 영역
application하나의 웹 애플리케이션과 관련된 영역

page 영역

브라우저 요청이 들어오면 JSP페이지가 실행된다. 실행된 페이지는 요청에 대해 새로운 하나의 page영역을 갖게 되고, 이에 해당하는 pageContext 내장 객체를 할당받는다(객체가 메모리에 로딩된다). 이렇게 생성된 객체에 정보를 저장하면 해당 페이지 내에서만 사용할 수 있다.

request 영역

브라우저에 오는 한 번의 요청 - 주소창에 URL 입력 또는 링크 클릭 시 브라우저가 웹 서버에 전송하는 요청이 하나의 request 영역이 된다. 하나의 요청을 처리하는 데 사용되는 모든 JSP페이지를 포함한다.

사용자가 페이지를 요청하면 요청한 페이지와 요청받은 페이지 사이에 request 내장 객체에 정보를 저장할 수 있다. 브라우저가 결과를 받으면 그 요청과 관련된 request 내장 객체는 사라진다. 즉 브라우저가 요청을 할 때마다 새로운 request 내장 객체가 생성되고 매번 새로운 request 영역이 생성된다.

이전 페이지에서 입력된 값(파라미터)을 getParameter()로 가져오거나, setAttribute()로 직접 원하는 정보를 저장해 다음 페이지에서 getAttribute()를 사용해 얻어올 수 있다.

session 영역

session이란 웹 브라우저를 닫기 전까지 페이지를 이동하더라도 사용자의 정보를 잃지 않고 서버에 보관할 수 있도록 하는 객체.

application 영역

페이지, 요청, 세션은 모두 하나의 application 영역에 속한다.

내장 객체 영역 유효 범위 테스트

firstPage : pageContext, request, session, application 객체에 새로운 속성을 추가한 후 secondPage.jsp 페이지로 포워딩한다. 여기서 설정한 속성 값은 브라우저에 출력할 수 없기 때문에 콘솔 창에 출력해서 확인한다.
secondPage : firstPage에서 설정한 속성 값을 브라우저에 출력한다.
thirdPage : secondPage의 [또 다른 페이지]를 클릭하여 리다이렉트 방식으로 요청되는 페이지. firstPage에서 설정한 속성 값을 브라우저에 출력한다.


//first page
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<% 
	pageContext.setAttribute("name", "page mmm");
	request.setAttribute("name", "request mmm");
	session.setAttribute("name", "session mmm");
	application.setAttribute("name", "application mmm");
	
	System.out.println("210_firstPage.jsp: ");
	System.out.println("하나의 페이지 속성: " + pageContext.getAttribute("name"));
	System.out.println("하나의 요청 속성: " + request.getAttribute("name"));
	System.out.println("하나의 세션 속성: " + session.getAttribute("name"));
	System.out.println("하나의 애플리케이션 속성: " + application.getAttribute("name"));
	request.getRequestDispatcher("210_secondPage.jsp").forward(request, response);
%>

//second page

<%@ 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>
	하나의 페이지 속성: <%=pageContext.getAttribute("name")%><br>
	하나의 요청 속성: <%=request.getAttribute("name")%><br>
	하나의 세션 속성: <%=session.getAttribute("name")%><br>
	하나의 애플리케이션 속성: <%=application.getAttribute("name")%><br>
	
	<a href="210_thirdPage.jsp">또 다른 페이지</a>
</body>
</html>

//third page
<%@ 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>
	하나의 페이지 속성: <%=pageContext.getAttribute("name")%><br>
	하나의 요청 속성: <%=request.getAttribute("name")%><br>
	하나의 세션 속성: <%=session.getAttribute("name")%><br>
	하나의 애플리케이션 속성: <%=application.getAttribute("name")%><br>
</body>
</html>
post-custom-banner

0개의 댓글