forwarding 방식
- forward 하는 페이지로 현재 서블릿의 전권을 가지고 서버상에서 다이렉트로 이동합니다.
- 제어권이 완전히 이동하는 jsp 페이지로 가버리기 때문에 다시 서블릿으로 되돌아오지 않습니다.
- 그렇기 때문에 서블릿에서 PrintWriter 객체를 사용할 일이 없다. (응답이 이곳에서 이뤄지지 않는다는 의미입니다.
- 응답의 내용은 JSP이지만, 출력된 결과창의 주소는 서블릿의 전권을 가지고 이동했기 때문에 forwarding이 일어난 서블릿 주소가 뜨는 것을 알수 있습니다.
공통
- 서버상에서 직접 다른 페이지를 호출 하는 방식이기 때문에 페이지의 이동속도가 빠르다.
- 중요한 것은 서버상에서 바로 이동하기 때문에 브라우저를 거치지 않는 다는 것입니다.
- 모든 페이지 연결방식의 80% 이상이 forwarding 방식을 사용합니다.
- servletRequest 객체 바인딩에 대해서 잘 알고 사용해야합니다.
Page이동방법과 ServletRequest를 Attribute로 사용하기.
1. Forwarding(RequestDispatcher): 응답하지 않고 서버상에서 다른 서블릿으로 다이렉트로 요청으로 가지고 갑니다. 페이지 이동중에 이 방법이 forwarding입니다. 그렇기 때문에 servletRequest에 data(객체를)를 넣어서 가는 게 좋습니다. 왜냐하면 응답을 하지 않기 때문에 다음 서블렛이 응답하기 전까지 살아 있기 때문입니다.
- 서버상에서 바로 이동합니다.(응답을 하지 않는 다는 말입니다.)
(동일한 기능이 서로 다른 객체에 있을 때는 눈여겨 봐야합니다. )
1) request.getRequestDispatcher("-")-> 대부분 이를 대부분 사용> 상대 경로 가능
- context.getRequestDispatcher("-")-> 절대 경로만 됨
2) rdp.forward(req, res);
rdp.include(req, res);
- forwarding 방법을 사용하는 경우: 단순 검색에 많이 쓰입니다.
이동하고자 하는 페이지를 아래에 연결합니다.
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
<script type="text/javascript">
/*
* 나이를 문자로 입력 했을 때 숫자로 입력하는 메세지를 띄우고 return false 시킨다.
*/
function() {
var f = documnet.frm
if(isNaN(f.age.value)){
alert("나이는 숫자입력바랍니다.");
return false;
}
}
</script>
</head>
<body>
<h2 align="center">Register Cafe Member Form</h2>
<form name="frm" action="EntranceServlet" method="post"
onsubmit="return checkData()">
이 름<input type="text" name="name" required="required"><br>
나 이<input type="text" name="age" required="required"><br>
주 소<input type="text" name="addr" required="required"><br>
<input type="submit" value="회원가입">
</form>
</body>
</html>
package servlet.controller;
import java.io.IOException;
import java.io.PrintWriter;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import javax.servlet.RequestDispatcher;
import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import servlet.model.MemberVO;
/*
* 회원가입하면 정보를 바탕으로
* MemberVO를 생성 ArrayList에 추가
* 회원가입을 5명이면, MemberVO 5개
* ArrayList를 통째로 ServletContext에 바인딩
*/
public class EntranceServlet extends HttpServlet {
private static final long serialVersionUID = 1L;
List<MemberVO> list=Collections.synchronizedList(new ArrayList<MemberVO>());//동기화처리 해줍니다.
private ServletContext context;
@Override
public void init() throws ServletException {
/* context = getServletContext();
System.out.println("ServletContext의 주소:"+context);
context.setAttribute("list", list);
System.out.println("ServletContext에 카페 입장명단을 저장할 List를 미리 바인딩 합니다.");*/
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doProcess(request, response);
}
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doProcess(request, response);
}
protected void doProcess(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
PrintWriter out = response.getWriter();
request.setAttribute("list",list);
String name = request.getParameter("name");
int age = Integer.parseInt(request.getParameter("age"));
String addr = request.getParameter("addr");
System.out.println("1. 폼값을 받아 옵니다. ");
MemberVO vo =new MemberVO(name, age, addr);
System.out.println("2. MemberVO생성");
list.add(vo);
System.out.println("3. MemberVO를 List에 저장");//ServletContext에 바인딩 된 List에 VO가 저장
out.println(name+"님이 카페에 입장하셨습니다. ");
System.out.println(name+"님이 카페에 입장하셨습니다.");
//out.println("<a href=viewMember.jsp?name="+name+">viewMember.jsp페이지로 이동합니다.</a>");
//네이베이션
RequestDispatcher rdp=request.getRequestDispatcher("viewMember.jsp");
rdp.forward(request, response);
out.println("페이지 이동 시켰습니다. forward");
}
}
<%@page import="servlet.model.MemberVO"%>
<%@page import="java.util.List"%>
<%@ 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>
<b><%= request.getParameter("name") %>님이 방금전 회원 가입 하신 분입니다.</b><p>
<!-- request에 똑같은걸 가져왔기 때문에 getParameter로 받을 수 있습니다. -->
<hr>
<h2>전체 카페 명단 리스트</h2>
<table border="2px">
<tr>
<td>회원번호</td>
<td>이름</td>
<td>나이</td>
<td>주소</td>
</tr>
<%
//List<MemberVO> list = (List<MemberVO>)application.getAttribute("list");
List<MemberVO> list = (List<MemberVO>)request.getAttribute("list");
for(int i=0; i<list.size();i++){
%>
<tr>
<td><%= i+1 %></td>
<td><%= list.get(i).getName() %></td>
<td><%= list.get(i).getAge() %></td>
<td><%= list.get(i).getAddr() %></td>
</tr>
<%
}
%>
</table>
</body>
</html>
out.println("페이지 이동 시켰습니다. forward");
이걸 썼는데, 안나온다. 왜냐하면 forwarding하면 제어권이 다시 안돌아 오기 때문입니다.
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
<h2 align="center">단순검색</h2>
<form action="SMS" >
조회ID<input type="text" name="id" required="required">
<input type="submit" value="단순조회">
</form>
</body>
</html>
package servlet.model;
public class MemberVO {
private String id;
private String password;
private String name;
private String address;
public MemberVO() {
super();
}
public MemberVO(String id, String password, String name, String address) {
super();
this.id = id;
this.password = password;
this.name = name;
this.address = address;
}
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getAddress() {
return address;
}
public void setAddress(String address) {
this.address = address;
}
@Override
public String toString() {
return "MemberVO [id=" + id + ", password=" + password + ", name=" + name + ", address=" + address + "]";
}
}
package servlet.controller;
import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
public class SearchMemberServlet extends HttpServlet {
private static final long serialVersionUID = 1L;
public SearchMemberServlet() {
super();
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doProcess(request, response);
}
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doProcess(request, response);
}
protected void doProcess(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
/*
* Controller logic 공식
* 1. form value 받습니다.
* 2. VO객체 생성(조회일때는 vo생성 안하고 생략 가능)
* 3. MemberDAO return
* 4. biz logic 호출(이 부분이 Controller logic에 있어서 가장 중요합니다.)
* 5. 4의 결과 값을 attribute에 binding(4의 return값이 void인 경우 생략)
* 6. navigation
*/
String id =request.getParameter("id");
request.setAttribute("id", id);
request.getRequestDispatcher("resultView.jsp").forward(request, response);
//제어권이 이쪽으로 오지 않으므로 이 아래는 아무것도 실행이 안됨.
}
}
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%
String id =(String)request.getAttribute("id");
%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
<h2>조회한 id님의 정보입니다.</h2>
이름: 이재헌 <br>
조회ID: <%=id%>
</body>
</html>
2. Redirecting
'컴퓨터 프로그래밍 > servlet' 카테고리의 다른 글
page이동-RequestDispatcher-2) include (0) | 2020.06.05 |
---|---|
Controller 공식 (0) | 2020.06.05 |
Attribute (0) | 2020.06.04 |
ServletContext (0) | 2020.06.04 |
ServletContext-여러개의 객체를 list에... (0) | 2020.06.04 |