# Load-on-Startup ?
load-on-startup은 실행 우선순위를 정해서
클라이언트가 요청하지 않아도, 미리 객체를 생성할 수 있다.
즉,
eomcs.servlet.ex06.Servlet02 이라는 패키지 경로에 있는
ex06.s2 객체를 요청없이 미리 실행한다.
또한 web에 ex06/s1 을 요청하였으므로 서버를 시작하면
두 가지의 서버 init이 실행된 것이다.
# Filter 객체 사용
애노테이션을 통해서도 값을 전달 할 수 있다.
필터 객체는 해당 경로로 실행되는 모든 경로에 대해
해당 param 값을 전달하는 역할을 한다.
# Context Param
필터와 서블릿이 공유하는 컨텍스트 파라미터는
웹 애플리케이션 전역에 걸쳐서 공통 설정값을 관리한다.
# 필터와 컨텍스트 파라미터의 차이 ?
필터: 필터는 특정 서블릿이나 URL 패턴에 매핑되어, 해당 서블릿이나 패턴과 관련된 요청 및 응답을 가로채고 처리하거나 변경하는 역할을 수행한다. 필터는 주로 특정 작업을 수행하기 위해 요청 처리 전후에 실행되며, 필터의 적용 범위는 서블릿이나 패턴마다 다를 수 있다.
컨텍스트 파라미터: 컨텍스트 파라미터는 웹 애플리케이션 전체에 걸쳐 공통적인 설정 값을 저장하는 데 사용된다.
이 값들은 서블릿이나 JSP 페이지에서 웹 애플리케이션 내의 어떤 곳에서든 접근할 수 있다.
컨텍스트 파라미터는 서로 다른 서블릿 간에 설정 값을 공유하거나 애플리케이션의 동작을 조정하는 데 사용된다.
* forwarding/including
# Foward 예제
ex07/servlet01 에서는 op가 "+"인 연산에 대해서 수행한다.
만약 op가 "-"일 경우에는 servlet02으로 포워딩하여 "-" 연산을 수행하고
결과값을 출력한다.
이때, PrintWriter 설계도에 따라 작성된 out 객체에
out.println("더하기 계산 결과:") 가 버퍼로 담긴다.
포워딩 할때 이전 서블릿이 출력한 내용이 버려지므로,
해당 버퍼는 버려지고 Servlet02가 실행된다.
그래서 결과값으로는 "빼기 계산 결과"만 앱 화면이 나타나는 것이다.
인클루딩(Including)은 웹 애플리케이션 내에서 한 서블릿이나 JSP 페이지가 다른 서블릿이나 JSP 페이지의 실행 결과를 포함하여 사용하는 메커니즘이다. 인클루딩을 통해 한 페이지에서 다른 페이지의 내용을 포함하거나 결합할 수 있다.
인클루딩은 주로 웹 애플리케이션의 코드 중복을 줄이고, 모듈화된 컴포넌트를 재사용하기 위해 사용된다.
이를 통해 여러 페이지에서 공통적으로 사용되는 부분을 한 곳에서 유지보수할 수 있다.
# Forward와 Includ의 차이점
이를 응용하면 Include를 통해서 상단 웹 페이지와 하단 웹페이지를 유지한 상태에서
중단 메뉴구성 페이지만 교체해서 사용할 수가 있다.
* Refrsh vs Redirect
// 리프래시
// => 서버로부터 응답을 받고 "내용을 출력"한 후
// 지정된 시간이 경과되면 특정 URL을 자동으로 요청하도록 만들 수 있다.
// => 보통 웹 페이지를 자동으로 이동시키고 싶을 때 사용한다.
// => 예
// 예1: 로그인 후 메인페이지로 자동 이동
// 예2: 메일을 전송한 후 메일 목록 페이지로 자동 이동
// 예3: 게시글 등록한 후 게시글 목록으로 자동 이동
// 예4: 결제 완료 후 결제 상태 페이지로 자동 이동
상대경로 사용
response.setHeader("Refresh", "3;url=s100");
절대경로 사용
response.setHeader("Refresh", "3;url=/ex08/s100");
* Redirect
// 리다이렉트
// => 클라이언트의 요청을 받은 후 콘텐트를 보내는 대신
// 다른 페이지의 URL을 알려줄 때 사용한다.
// => 웹 브라우저는 응답 받는 즉시 해당 페이지를 요청한다.
// 웹 서버로부터 콘텐트를 받지 않았기 때문에 어떤 것도 출력하지 않는다.
// 바로 다른 페이지로 이동한다.
// => 리프래시와 달리 서버는 콘텐트(message-body)를 보내지 않는다.
// => 사용 예:
// - 로그인 후 로그인 결과를 출력하지 않고 즉시 메인 화면으로 보내고 싶을 때
// - 결제완료 후 결과를 출력하지 않고 즉시 결제 상태 페이지로 보내고 싶을 때
// => 리다이렉트 HTTP 응답 프로토콜
//
// HTTP/1.1 302 <----- 리다이렉트 응답 상태 코드
// Location: s100 <----- 리다이렉트 URL
// Content-Type: text/html;charset=UTF-8
// Content-Length: 0
// Date: Tue, 02 Apr 2019 03:38:45 GMT
// 빈 줄
// <---- 콘텐트를 보내지 않는다. 즉 message-body가 없다.
//
* foward 사례
/board/add 에서 등록이 실패한다면 foward 를 통해서
오류 전용 페이지로 넘겨줌으로써 오류를 처리한다.
* refresh 사례
/board/list 에서 /board/add 명령을 주었지만
/board/add가 실패했을 경우에는 "*"초간 오류 텍스트를 출력하고
/board/list로 이동한다.
* redirect 사례
/board/add 에서 등록이 성공한다면 redirect 를 통해서
/board/list 페이지로 이동시킨다.
가장 좋은 조합은 /board/add 가 성공했을 경우 redirect를 통해 특정문구없이
board/list로 이동하는 것이며,
/board/add 가 실패했을 경우 foward를 통해서
오류 문구 전용 ErrorServlet으로 이동하고 web에서 오류문구를 출력하며
다시 /board/list로 최종적으로 이동한다.
발생할 수 있는 문제점
포워드를 사용하여 /board/add가 성공했을 경우에 board/list로 보내는 경우,
클라이언트의 주소창에는 여전히 /board/add의 주소가 표시될 수 있다.
포워드는 서버 내부에서의 이동이기 때문에 클라이언트는 새로운 URL로 이동한 것처럼 보이지 않는다.
# 리다이렉트 (Redirect)와 포워드 (Forward)의 차이점 ?
https://dev-with-gpt.tistory.com/285
* URL 구분