Recent Posts
Recent Comments
Link
11-21 14:38
Today
Total
관리 메뉴

삶 가운데 남긴 기록 AACII.TISTORY.COM

request 상태 정보 유지 본문

DEV&OPS/Java

request 상태 정보 유지

ALEPH.GEM 2022. 6. 15. 16:29

Redirect

sendRedirect(String location) 메소드를 이용하여 새로운 location으로 request를 재지정 할 수 있습니다.

WebContent 경로 아래에 site.html 파일을 작성합니다.

<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>포털 사이트</title>
</head>
<body>
<form action="portalSite">
	<input type="radio" name = "site" value="naver">네이버<br>
	<input type="radio" name = "site" value="daum">다음<br>
	<input type="radio" name = "site" value="zum">줌<br>
	<input type="radio" name = "site" value="google">구글<br>
	<input type="submit" value="이동">
</form>
</body>
</html>

작업중인 패키지 경로에 새 서블릿 SendRedirectTest.java를 생성합니다.

package net.aacii.test;

import java.io.IOException;

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

@WebServlet("/portalSite")
public class SendRedirectTest extends HttpServlet {

	@Override
	protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
		String param = req.getParameter("site");
		if(param.equals("naver")) {
			resp.sendRedirect("https://www.naver.com");
		}else if(param.equals("daum")) {
			resp.sendRedirect("https://www.daum.net");
		}else if(param.equals("zum")) {
			resp.sendRedirect("https://zum.com");
		}else if(param.equals("google")) {
			resp.sendRedirect("https://www.google.co.kr");
		}
	}
	
}

 

RequestDispatcher

Redirect는 다른 웹 어플리케이션이나 외부 사이트로도 요청(request)를 재지정 할 수 있지만 RequestDispatcher는 동일한 웹 어플리케이션 내의 요청을 재지정 하는 것입니다.

다음 예제는 forward() 메소드를 이용하는 예제입니다.

새 서블릿 DispatcherTest.java를 작성합니다.

package net.aacii.test;

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

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

@WebServlet("/dispatcher1")
public class DispatcherTest extends HttpServlet {

	@Override
	protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
		resp.setContentType("text/html;charset=UTF-8");
		PrintWriter out = resp.getWriter();
		out.print("<h3>Dispatcher1 수행결과</h3>");
		
		ServletContext sc = this.getServletContext();
		RequestDispatcher rd = sc.getRequestDispatcher("/dispatcher2");
		rd.forward(req, resp);	//request와 response 객체를 인수로 전달해서 정보를 유지한채로 이동
		out.close();
	}
	
}

그리고 새로운 서블릿 DispatcherTest2.java를 작성합니다.

package net.aacii.test;

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;

@WebServlet("/dispatcher2")
public class DispatcherTest2 extends HttpServlet {

	@Override
	protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
		resp.setContentType("text/html;charset=UTF-8");
		PrintWriter out = resp.getWriter();
		out.print("<h3>Dispatcher2 수행결과</h3>");
		out.close();
	}
	
}

dispatcher1 에서 dispatcher2으로 forward

DispatcherTest.java 서블릿에서 rd.forward(req, resp); 부분을 rd.include(req,resp); 으로 수정하면 아래와 같이 하나의 화면에 두개의 서블릿 결과가 포합되어 표시됩니다.

 

 

Request 상태 정보 유지

foward()나 include() 메소드의 인수값으로 request와 response 객체를 전달하기 때문에 이동 후 페이지에서도 상태 정보를 유지할 수 있습니다.

먼저 WebContet 경로에 book.html을 작성합니다.

<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>책등록</title>
</head>
<body>
	<form action="bookReg" method="post">
		책제목: <input type="text" name="title"><br>
		저자: <input type="text" name="author"><br>
		출판사: <input type="text" name="publisher"><br>
		<input type="submit" value="등록">
	</form>
</body>
</html>

Book이라는 정보를 관리하기 위한 객체(인스턴스)를 생성하기 위한 클래스 Book.java 를 작성합니다.

package net.aacii.test;

public class Book {
	private String title;
	private String author;
	private String publisher;
	public String getTitle() {
		return title;
	}
	public void setTitle(String title) {
		this.title = title;
	}
	public String getAuthor() {
		return author;
	}
	public void setAuthor(String author) {
		this.author = author;
	}
	public String getPublisher() {
		return publisher;
	}
	public void setPublisher(String publisher) {
		this.publisher = publisher;
	}
	
}

그리고 이를 처리하기 위한 서블릿 BookTest1.java 를 작성합니다.

package net.aacii.test;

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

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;

@WebServlet("/bookReg")
public class BookTest1 extends HttpServlet {

	@Override
	protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
		resp.setContentType("text/html;charset=UTF-8");
		PrintWriter out = resp.getWriter();
		
		req.setCharacterEncoding("UTF-8");
		
		String title = req.getParameter("title");
		String author = req.getParameter("author");
		String publisher = req.getParameter("publisher");
		
		Book book = new Book();
		book.setTitle(title);
		book.setAuthor(author);
		book.setPublisher(publisher);
		
		req.setAttribute("book", book);
		
		RequestDispatcher rd = req.getRequestDispatcher("bookOutput");
		rd.forward(req, resp);
		out.close();
	}

}

다음은 RequestDispatcher로 /bookOutput으로 forward한 후 결과를 처리하기 위한 서블릿 BookTest2.java 를 작성합니다.

package net.aacii.test;

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;

@WebServlet("/bookOutput")
public class BookTest2 extends HttpServlet {

	@Override
	protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
		resp.setContentType("text/html;charset=UTF-8");
		PrintWriter out = resp.getWriter();
		
		Book book = (Book)req.getAttribute("book");
		
		out.print("<h3>책제목: "+book.getTitle() + "</h3>");
		out.print("<h3>저자: "+book.getAuthor() + "</h3>");
		out.print("<h3>출판사: "+book.getPublisher() + "</h3>");

		out.close();
	}

}

request에 parameter를 submit

 

forward 후에도 book 객체가 전달

 

 

 

 

 

 

 

 

 

728x90

'DEV&OPS > Java' 카테고리의 다른 글

리스너 Listener  (0) 2022.06.20
필터 Filter  (0) 2022.06.15
세션을 이용한 로그인  (0) 2022.06.14
세션 Session  (0) 2022.06.14
쿠키 Cookie  (0) 2022.06.14