내장객체 이동성 메서드 종류 

response.sendRedirect()

pageContext.forward()

 

 

 

우선 java class를 선언하겠다.

package test;

public class TestClass {
	private String text;
	
	public TestClass() {}

	public TestClass(String text) {
		super();
		this.text = text;
	}
	public String getText() {
		return text;
	}
		this.text = text;
	}
}

위 class는 String text의 setter와 getter 그리고 파라미터로 text를 받는 생성자만 넣은 간단한 class이다.

 

위 코드의 생성자 파라미터를 받아 이동하여 페이지에 출력해주는 예제를 들어보겠다.

 

sendRedirect 예시

<%@page import="test.TestClass"%>
<%@ 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>
<%
TestClass cls = new TestClass("send");
session.setAttribute("test", cls);
// 위와 동일
// request.getSession().setAttribute("test", cls);

response.sendRedirect("send_ex2.jsp");
%>
</body>
</html>

 

send_ex2.jsp 예시

<%@ page import="test.TestClass" %>
<%@ 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>
<%
TestClass cls = (TestClass)session.getAttribute("test");
%>

<h3>TestClass 넘어온 Text : <%=cls.getText() %></h3>
</body>
</html>

설명

session.setAttribute에 값을 저장

response.sendRedirect로 이동한다.

 

sendRedirect는 request.setAttribute로 값을 저장하여 가지고 갈 수 없다.

session.setAttribute(String name, Object value) 

첫 번째 파라미터 찾을 이름, 두 번째 인수에 객체명을 지정한다.

session.getAttribute(String name)

파라미터에 setAttribute에 지정해놓은 찾을 이름을 지정한다.Object로 넘어오기 때문에 형변환은 필수이다.

 

 

 

실행화면

 


forward 예시

<%@page import="test.TestClass"%>
<%@ 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>
<%
TestClass cls = new TestClass("forward");
request.setAttribute("test", cls);

pageContext.forward("forward_ex2.jsp");
// 위와 동일
// request.getRequestDispatcher("forward_ex2.jsp").forward(request, response); 
%>
</body>
</html>

 

forward_ex2.jsp 예시

<%@page import="test.TestClass"%>
<%@ 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>
<%
TestClass cls = (TestClass)request.getAttribute("test");
%>

<h3>TestClass 넘어온 Text : <%=cls.getText() %></h3>
</body>
</html>

설명

request.setAttribute에 값을 저장 

pageContext.forward로 이동한다.

request.setAttribute(String name, Object value) 

첫 번째 파라미터 찾을이름, 두 번째 인수에 객체명을 지정한다.

request.getAttribute(String name)

파라미터에 setAttribute에 지정해놓은 찾을 이름을 지정한다.

Object로 넘어오기 때문에 형변환은 필수이다.

 

실행화면

 

session.setAttribute와 request.setAttribute의 차이점

session은 저장을 해서 가져가는 것이기 때문에 request에 비해 무겁다.

request는 단타성, 일회성이다.

 

sendRedirect란?

java Servlet에서 이동을 위한 메소드이다. 오직 이동만 한다. 데이터를 가지고 가지 않는다.

	protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
		resp.sendRedirect("sample");
	}

 

forward란?

java Servlet에서 이동을 위한 메소드이다.  클라이언트에게 받은 데이터를 가지고 이동한다.

	protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
		RequestDispatcher rd = req.getRequestDispatcher("sample");
		rd.forward(req, resp);
	}        

forward 사용예시

 

html 예시

<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>

 <h1>정보를 입력해주세요.</h1>
 <form action="packing" method="get">
 이름 : <input type="text" name="name" size="5"><br><br>
 연령대 :
 <select name="age">
 	<option value="10대">10대</option>
 	<option value="20대">20대</option>
 	<option value="30대">30대</option>
 	<option value="40대">40대</option>
 	<option value="50대">50대</option>
 </select><br><br>
 성별 :  
 <input type="radio" name="trans" value="남자">남자
 <input type="radio" name="trans" value="여자">여자<br><br>
 취미 : 
 <input type="checkbox" name="hobby" value="독서">독서
 <input type="checkbox" name="hobby" value="코딩">코딩
 <input type="checkbox" name="hobby" value="영화감상">영화감상
 <input type="checkbox" name="hobby" value="게임">게임
 <input type="checkbox" name="hobby" value="운동">운동<br><br>
 
 <input type="submit" value="제출">
 </form> 
 
</body>
</html>

Java Servlet 예시1 (forward사용)

package server;

import java.io.IOException;

import javax.servlet.RequestDispatcher;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import dto.Dto;
@WebServlet("/packing")
public class Packing extends HttpServlet{

	@Override
	protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
		String name = req.getParameter("name");
		String age = req.getParameter("age");
		String trans = req.getParameter("trans");
		String[] hobby = req.getParameterValues("hobby");
		
		// 콘솔에 찍어보기
		System.out.println(name);
		System.out.println(age);
		System.out.println(trans);
		
		if(hobby != null) {
			for (int i = 0; i < hobby.length; i++) {
				System.out.println(hobby[i]);
			}
		}
		
		Dto dto = new Dto(name, age, trans, hobby); // 데이터 연결객체
		req.setAttribute("data", dto); //포장하기 포장박스 : data
		
		//resp.sendRedirect("sample"); 사용시 데이터는 가지고 가지 않습니다.
        
		// 이민가기
		RequestDispatcher rd = req.getRequestDispatcher("sample");
		rd.forward(req, resp);
	}
}

checkbox는 데이터를 배열로 넘겨주기 때문에 getParameterValues를 사용하여야 한다.


Java Dto 예시

package dto;

public class Dto {
	private String name;
	private String age;
	private String trans;
	private String hobby[];
	
	Dto(){
		
	}

	public Dto(String name, String age, String trans, String []hobby) {
		super();
		this.name = name;
		this.age = age;
		this.trans = trans;
		this.hobby = hobby;
	}

	public String getName() {
		return name;
	}

	public void setName(String name) {
		this.name = name;
	}

	public String getAge() {
		return age;
	}

	public void setAge(String age) {
		this.age = age;
	}

	public String getTrans() {
		return trans;
	}

	public void setTrans(String trans) {
		this.trans = trans;
	}

	public String[] getHobby() {
		return hobby;
	}

	public void setHobby(String[] hobby) {
		this.hobby = hobby;
	}
}

Java Servlet 예시2

package server2;

import java.io.IOException;
import java.io.PrintWriter;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import dto.Dto;
@WebServlet("/sample")
public class Unpacking extends HttpServlet {

	@Override
	protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
		resp.setContentType("text/html; charset=utf-8");
		
		PrintWriter pw = resp.getWriter();
		
		pw.println("<html>");
		
		pw.println("<head>");
		pw.println("<title>제목</title>");
		pw.println("</head>");
		
		pw.println("<body>");
		
		pw.println("<h1>회원정보</h1>");
		
		// 출력하기
		Dto dto = (Dto) req.getAttribute("data");
		pw.println("<h3>이름 : " + dto.getName() + "</h3>");
		pw.println("<h3>연령대 : " + dto.getAge() + "</h3>");
		pw.println("<h3>성별 : " + dto.getTrans() + "</h3>");
		
		if(dto.getHobby() != null) {
			pw.print("<h3>취미 : ");
			for (int i = 0; i < dto.getHobby().length; i++) {
				if(i < dto.getHobby().length-1)
						pw.print(dto.getHobby()[i]+", ");
				else if(i == dto.getHobby().length-1) 
					pw.print(dto.getHobby()[i]);	
			}
		}
		pw.println( "</h3>");	
			
		pw.println("</body>");
			
		pw.println("</html>");
		pw.close();
	
	}
}

위 예시는 html파일에 작성을 하고 제출을 하면 Packing class에서 데이터를 받고 forward를 사용하여 Unpacking class에서 데이터를 출력하는 예시이다. 위에 언급대로 Packing class에서 sendRedirect 사용할 경우 페이지 이동은 하되, 데이터는 가져가지 않는다. 그렇기 때문에 forword를 사용한다.

 

실행화면

html 화면

 

Packing class 이클립스 console화면

 

Unpacking class 실행화면

 

+ Recent posts