프로그래밍/Servlet&JPS

04. Servlet : forward

pupu91 2022. 8. 23. 19:38
반응형

 

forward

변수의 기본 scope는 page이기 때문에 다른 서블릿으로 데이터를 공유 할수 없다.

forward 방식은 request와 response를 넣어서 위임하므로 request에 정보를 저장하여 다른 서블릿에서도 공유 할 수 있게 된다. 또한 forward 방식은 해당 서블릿의 존재를 client가 알 필요가 없어 url 자체가 변경되지 않는다. 단 서버로 전송한 데이터가 남아있는 상태로 새로고침(재요청)을 하게 되면 요청을 계속 반복하게 되어 DB에 insert하는 행위가 반복(중복) 되는 문제가 생길 수도 있다. 

 

 


 

forward 사용 방법

 

1. HTML

<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
	
	<h1 align="center">forward</h1>
	
	<form action="forward" method="post">
		<table align="center">
			<tr>
				<td>아이디 : </td>
				<td><input type="text" name="userId"/></td>
				<td rowspan="2"><button type="submit" style="height: 50px;">로그인</button></td>
				</tr>
				<tr>
					<td>비밀번호 : </td>
					<td> <input type="password" name="password"/></td>
				</tr>
				</table>
				</form>
		</table>
	</form>
</body>
</html>

 

반응형

2. forward Servlet 작성

@WebServlet("/forward")
public class ReceivelnformationServlet extends HttpServlet {
	
 protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		
        문자 인코딩
        request.setCharacterEncoding("UTF-8");
        
        userID와 password 값 가져오기
        String userId = request.getParameter("userId");
		String password = request.getParameter("password");
        
        입력 받은 id를 이용한 "xxx님 환영합니다"라는 메세지를 출려하는 응답화면을 만들기 위해
        새로운 서블릿을 위임시켜야 한다. 
        
      }
  }

 

위임할 수 있는 코드 방법

ReaqustDispatcher 인스턴스 생성 후 forward 메소드를 이용해서 요청과 응답에 대한 정보를 전달한다.

전달할 id값을 setAttribute로 전달
request.setAttribute("userId",userId); ("이름", 속성)

getRequestDispatcher 인자에 전달받을 경로 설정
RequstDispatcher rd = request.getRequestDispatcher("print")

forward 처리하기
rd.forward(request, response);

 

 

 

 

 

3. 위임 받은 서블릿 작성

@WebServlet("/print") getRequestDispatcher에 전달한 경로
public class PrintLoginSuccessServlet extends HttpServlet {
	
	
	protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		
		forward 받은 서블릿에서도 요청 방식이 get이였으면 doGet을 post였으면 doPost를 호출한다
		
		
		이전 서블릿의 setAttribute에 전달한 정보를 해당 서블릿에서 getAttribute으로 다시 꺼내온다.
		String userId = (String) request.getAttribute("userId"); 
		
		
		응답에 필요한 데이터가 확인되면 동적인 웹 페이지를 생성한다
		StringBuilder reponseText = new StringBuilder();
		reponseText.append("<!doctype html\n")
		  		 .append("<html>\n")
		  		 .append("<head>\n")
		  		 .append("</head>\n")
		  		 .append("<body>\n")
		  		 .append("<h1 align = 'center'>")
		  		 .append(userId)
		  		 .append("님 환영합니다:)")
		  		 .append("</h1>")
		  		 .append("</body>\n")
		  		 .append("</html>");
		
        인코딩 
		response.setContentType("text/html; charset=UTF-8");
		
		PrintWriter out = response.getWriter();
		out.print(reponseText.toString());
		out.flush();
		out.close();
 }
}

 

반응형