개발새발

4. [DB 연결 웹 앱] redirect & forward - BE 본문

[부스트코스] 웹프로그래밍/DB 연결 웹 앱

4. [DB 연결 웹 앱] redirect & forward - BE

재래김유진 2019. 11. 21. 23:12
728x90
반응형

1) redirect

: 서버가 클라이언트에게 어떤 URL로 이동하라는 요청을 보내는 것을 리다이렉트 (302코드)

ex) 게시판 글 작성 후 글 목록으로 이동

 

[리다이렉트 (redirect) ]

  • 리다이렉트는 HTTP프로토콜로 정해진 규칙이다.
  • 서버는 클라이언트의 요청에 대해 특정 URL로 이동을 요청할 수 있다. 이를 리다이렉트라고 한다.
  • 서버는 클라이언트에게 HTTP 상태코드 302로 응답하는데 이때 헤더 내 Location 값에 이동할 URL 을 추가한다. 클라이언트는 리다이렉션 응답을 받게 되면 헤더(Location)에 포함된 URL로 재요청을 보내게 된다. 이때 브라우저의 주소창은 새 URL로 바뀌게 된다..
  • 클라이언트는 서버로부터 받은 상태 값이 302이면 Location헤더값으로 재요청을 보내게 된다. 이때 브라우저의 주소창은 전송받은 URL로 바뀌게 된다. (클라이언트는 요청을 2번보냄)
  • 서블릿이나 JSP는 리다이렉트하기 위해 HttpServletResponse 클래스의 sendRedirect() 메소드를 사용한다.

 

<% response.sendRedirect("redirect02.jsp") %>

[생각해보기]

1. 리다이렉션의 장점과 단점에 대해서 알아봅시다.

redirect를 사용하여 응답 페이지를 부르면 사용자가 실수 혹은 고의로 글쓰기 응답 페이지에서 새로고침을 누른다고 하더라도, 처음의 요청 정보는 존재하지 않으므로 게시물이 여러 번 등록되지 않습니다.

단점? 리다이렉트는 get방식을 사용하기 때문에 url에 노출되서 보안에 좋지 않다.  

 

 

2) forward

출처 http://java.scwcd.jobs4times.com/Web-Container-Model.html

[forward란?]

  1. 웹 브라우저에서 Servlet1에게 요청을 보냄
  2. Servlet1은 요청을 처리한 후, 그 결과를 HttpServletRequest에 저장
  3. Servlet1은 결과가 저장된 HttpServletRequest와 응답을 위한 HttpServletResponse를 같은 웹 어플리케이션 안에 있는 Servlet2에게 전송(forward)
  4. Servlet2는 Servlet1으로 부터 받은 HttpServletRequest와 HttpServletResponse를 이용하여 요청을 처리한 후 웹 브라우저에게 결과를 전송 

FrontServlet.java

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
package examples;
 
 
import javax.servlet.RequestDispatcher;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
 
/**
 * Servlet implementation class FrontServlet
 */
@WebServlet("/Front")
public class FrontServlet extends HttpServlet {
    private static final long serialVersionUID = 1L;
 
    public FrontServlet() {
        super();
        // TODO Auto-generated constructor stub
    }
 
    protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        int diceValue = (int)(Math.random()*6)+1;    //diceValue 이 값을 request에 맡길거임
        request.setAttribute("dice", diceValue);
        
//sendRedirect 같이 도와주는 객체 (RequestDispatcher)
        RequestDispatcher requestDispatcher = request.getRequestDispatcher("/next"); //forward 해야할 경로는 반드시 '/' 로 시작
        requestDispatcher.forward(request, response);
    }
 
}
 
 

 

NextServlet.java

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
package examples;
 
 
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
 
 
@WebServlet("/next")
public class NextServlet extends HttpServlet {
    private static final long serialVersionUID = 1L;
 
    public NextServlet() {
        super();
        // TODO Auto-generated constructor stub
    }
 
    protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
          response.setContentType("text/html");
            PrintWriter out = response.getWriter();
            out.println("<html>");
            out.println("<head><title>form</title></head>");
            out.println("<body>");
 
            int dice = (Integer)request.getAttribute("dice");    //맡긴값 가져오기
            out.println("dice : " + dice);
            for(int i = 0; i < dice; i++) {
                out.print("<br>hello");
            }
            out.println("</body>");
            out.println("</html>");
    }
 
}
 
 
 

 

 

++NextServlet.java 를 JSP파일로도 만들수 있음

FrontServlet.java에 forward 해야할 경로 ("/dice.jsp") 로 해줘야함 

 

 

3) servlet & jsp연동

서블릿과 jsp는 서로 상호 보완적인 관계를 가지고 있다. 

서블릿은 로직을 구현하기 좋지만 html 출력은 불편함 (왜냐면, 자바기 때문에)

jsp는 로직구현은 불편 html 출력은 편리.

so, 서블릿과 jsp를 잘 사용하기 위해 forward가 사용된다.

 

// 로직은 서블릿이 수행하고 결과는 JSP에서 보여주고 

 

servlet & jsp 연동

 

LogicServlet.java


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
package examples;
 
 
import javax.servlet.RequestDispatcher;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
 
@WebServlet("/Logic")
public class LogicServlet extends HttpServlet {
    private static final long serialVersionUID = 1L;
 
    public LogicServlet() {
        super();
        // TODO Auto-generated constructor stub
    }
 
    protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        int v1 = (int)(Math.random()* 100)+1;
        int v2 = (int)(Math.random()* 100)+1;
        
        int result = v1 + v2;
        
        request.setAttribute("v1", v1);
        request.setAttribute("v2", v2);
        request.setAttribute("result", result);
        
        RequestDispatcher rd = request.getRequestDispatcher("/result.jsp");    //요청할 경로
        rd.forward(request, response);
        
    }
 
}
 
 

 

result.jsp

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
<%@ 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>
 
    ${v1 } + ${v2 } = ${result } <!-- el문법 -->
 
<%
    int v1 = (int)request.getAttribute("v1");
    int v2 = (int)request.getAttribute("v2");
    int result = (int)request.getAttribute("result");
%>
 
<%=v1%> + <%=v2 %> = <%=result %>
 
</body>
</html>
 
 

++자바코드들이 나오게되면 파일을 수정하거나 디자이너들이 수정하면 거부감이 들수있다.

그래서 자바코드가 없어지고 이것을 누구든 사용하기 편하게 대체할수 없을까? 

=> 그래서 나온게 EL & JSTL

 

[생각해보기]

1. 객체지향에서 객체는 관련된 것들을 모아서 가지고 있는 특징이 있습니다. 웹 페이지 URL도 관련된 URL이 있습니다. 예를 들어, 게시판 글쓰기, 읽기, 목록 보기 등은 모두 게시판과 관련된 URL일 것입니다. 하지만 지금까지의 예제들을 보면 서블릿은 하나의 URL만 처리하고 있습니다. 하나의 서블릿이 여러 개의 요청을 받을 수는 없을까요?
(힌트 : 서블릿 URL mapping에서 와일드카드('*'기호)를 사용하는 방법에 대해서 조사해보세요.)

  - web.xml에 <url-pattern>을 /*로 바꿔준다.

 

[참고링크] web.xml url-pattern /와 /* 의 차이점

https://lng1982.tistory.com

 

web.xml url-pattern / 와 /* 의 차이점

[*.do에서 /* 로 바꾸게 된 이유] 스프링 3.1 샘플 프로젝트의 web.xml(DD) 구성 시 url-pattern을 *.do와 같이 설정하였다. 이유는 단순하다. 프로젝트를 진행할 때 항상 *.do를 사용했기 때문이다. 하지만 REST..

lng1982.tistory.com

 

728x90
반응형
Comments