Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
Tags
- 완전탐색
- 알고리즘
- 반복문
- 최소공배수
- 완전 탐색
- 동적계획법
- fragment identifier
- python
- Dynamic Programming
- Stack
- 에라토스테네스의 체
- 2017 카카오 코드
- pandas
- 순열
- HashSet
- 규칙찾기
- 문자열
- 프로그래머스
- HashMap
- 메뉴리뉴얼
- 점프와 순간이동
- dfs
- 쿼드압축 후 개수세기
- 튜플
- 영문자 확인
- 조합
- 보이어무어
- Java
- 후위 표기법
- 어려웠던 문제
Archives
- Today
- Total
csmoon1010의 SW 블로그
JSP의 redirect & forward - (부스트코스) 본문
1. redirect
- HTTP프로토콜로 정해진 규칙
- 정의 : 서버가 클라이언트의 요청에 대해 클라이언트의 특정 URL로 이동을 요청하는 것
- 동작과정
- 서버 : HTTP 상태코드 302로 클라이언트에게 응답 (헤더 내 Location 값에 이동할 URL 추가)
- 클라이언트 : 헤더(Location)에 포함된 URL로 서버에게 재요청 (브라우저의 주소창은 새 URL로 바뀜)
- 사용 메소드 : HttpServletResponse 클래스의 sendRedirect() 메소드
※ 주의할 점 : redirect01.jsp 요청 때와 redirect02.jsp 요청 때의 Request, Response 객체는 다름
cf> HTTP 상태코드 : developer.mozilla.org/ko/docs/Web/HTTP/Status
cf> 참고할만한 글 : ideveloper2.dev/blog/2020-02-09--%EB%A6%AC%EB%8B%A4%EC%9D%B4%EB%A0%89%EC%85%98%EA%B3%BC-%EB%B6%80%ED%95%98%EA%B7%A0%ED%98%95/
2. forward
- Servlet이나 JSP가 요청을 처리하다가, 추가적인 처리를 같은 웹 어플리케이션에 포함된 다른 서블릿이나 JSP에게 위임
- 동작과정
- 웹 브라우저 : Servlet1에게 요청 전송
- Servlet1 : 요청을 처리한 후, 그 결과를 HttpServletRequest에 저장
- Servlet1 : 결과가 저장된 HttpServletRequest와 응답을 위한 HttpServletResponse를 같은 웹 어플리케이션 안에 있는 Servlet2에게 전송(forward)
- Servlet2 : Servlet1으로 부터 받은 HttpServletRequest와 HttpServletResponse를 이용하여 요청을 처리한 후 웹 브라우저에게 결과를 전송
- redirect와의 차이점
- 동일한 Request, Response 객체를 사용함
- URL에는 변화가 없음
[예제]
- FrontServlet : 주사위를 던져서 나온 값(1~6까지의 random 수)을 Request객체에 담아 Forward
- NextServlet : 전달받은 수만큼 hello를 출력
package examples;
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;
@WebServlet("/front")
public class FrontServlet extends HttpServlet {
private static final long serialVersionUID = 1L;
public FrontServlet() {
super();
}
protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// TODO Auto-generated method stub
int deviceValue = (int)(Math.random() * 6) + 1;
request.setAttribute("dice", deviceValue);
RequestDispatcher requestDispatcher = request.getRequestDispatcher("/next"); //같은 웹 어플리케이션 내에서
requestDispatcher.forward(request, response);
}
}
package examples;
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("/next")
public class NextServlet extends HttpServlet {
private static final long serialVersionUID = 1L;
public NextServlet() {
super();
}
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"); //Object --> Integer 형변환
out.println("dice : " + dice +"<br>");
for(int i = 0; i < dice; i++) {
out.print("hello<br>");
}
out.println("</body>");
out.println("</html>");
}
}
※ 프로그램 로직 개발이 편리한 Servlet과 HTML 태그 출력이 편리한 JSP의 특성을 반영
→ Servlet에서 로직을 처리한 뒤 "forward"를 통해 JSP에서 결과값을 출력!
3. servlet & jsp의 연동 (forward)
- Servlet : 프로그램 로직 수행에 유리 (IDE 등에서 좀 더 지원)
- JSP : 결과를 출력하기에 Servlet보다 유리 (필요한 html문을 그냥 입력)
⇨ 프로그램 로직 수행은 Servlet에서, 결과 출력은 JSP에서!!
[예제]
- LogicServlet : 1~100사이의 랜덤수 2개를 더하는 로직
- result.jsp : 전달받은 값의 결과를 html로 출력
package examples;
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;
@WebServlet("/logic")
public class LogicServlet extends HttpServlet {
private static final long serialVersionUID = 1L;
public LogicServlet() {
super();
}
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 requestDispatcher = request.getRequestDispatcher("/result.jsp");
requestDispatcher.forward(request, response);
}
}
<%@ page language="java" contentType="text/html; charset=EUC-KR"
pageEncoding="EUC-KR"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="EUC-KR">
<title>Insert title here</title>
</head>
<body>
EL표기법으로 출력합니다.<br>
${v1} + ${v2} = ${result} <br><br>
스클립틀릿과 표현식을 이용해 출력합니다.<br>
<%
int v1 = (Integer)request.getAttribute("v1");
int v2 = (Integer)request.getAttribute("v2");
int result = (Integer)request.getAttribute("result");
%>
<%=v1 %> + <%=v2 %> = <%=result %>
</body>
</html>
'웹 > 백엔드' 카테고리의 다른 글
JSP의 JSTL & EL - (부스트코스) (0) | 2021.04.05 |
---|---|
JSP의 Scope - (부스트코스) (0) | 2021.03.30 |
JSP의 기초 - (부스트코스) (0) | 2021.03.13 |
Servlet _ 작성 방법 / 라이프 싸이클 / Request, Response 객체 (부스트코스) (0) | 2021.01.29 |
Servlet _ 개발환경 (부스트코스) (0) | 2021.01.27 |
Comments