RequestDispatcher는 같은 웹 애플리케이션 내에서 다른 리소스로 요청을 전달하거나 포함하는 데 사용되는 객체이다.
이는 Servlet API의 일부이며 웹 애플리케이션에서 Model-View-Controller (MVC) 아키텍쳐를 구현하는 데 일반적으로 사용된다.RequestDispatcher 인터페이스는 foward()와 include() 두 가지 메서드를 제공한다.
- forward() 메서드는 JSP 페이지와 같은 다른 리소스로 제어를 전송하는 데 사용되며,
- include() 메서드는 다른 리소스의 출력을 현재 페이지의 출력에 포함시키는 데 사용된다.
즉, RequestDispatcher는 다른 페이지나 서블릿으로 현재 요청을 보내거나 다른 페이지나 서블릿의 출력을 현재 페이지에 포함시키는 데 사용된다.
이를 통해 웹 애플리케이션에서 유연한 처리가 가능해지며, 코드의 재사용성이 높아진다.
// servlet name
RequestDispatcher rd = getServletContext().getNamedDispatcher("loginServlet");
// url
RequestDispatcher rd = getServletContext().getRequestDispatcher("/login");
RequestDispatcher rd = request.getRequestDispatcher("/login");
rd.forward(req, resp);
rd.include(req, resp);
sendRedirect는 클라이언트가 서버에게 요청을 보내고 서버가 redirect를 보내면 클라이언트가 다시 서버에게 받은 url을 요청하는 것이고, forward는 클라이언트가 서버에게 요청을 보냈을 때 다른 api로 전달을 하여 처리 후 클라이언트에게 응답을 하는 것이다.
즉 다시 말하면 redirect는 클라이언트가 한번 더 서버에게 요청을 하여 응답을 받는 구조이고 forward는 클라이언트 요청 한번으로 서버에서 직접 유동적으로 처리하여 응답을 받는 구조이다.
Servlet Filter는 Java Serlver API에서 제공하는 기능 중 하나로, HTTP 요청과 응답을 처리하기 전에 그 사이에 추가적인 처리를 수행할 수 있도록 해주는 컴포넌트이다.
Filter는 일종의 체인 형태로 동작한다.
클라이언트가 서버에 요청을 보내면, 이 요청은 Filter 체인의 맨 앞에서부터 순차적으로 각 Filter를 거치며 필터링된다.
필터링은 일반적으로 요청과 응답의 헤더와 바디를 수정하거나, 인증과 권한 부여를 위한 처리, 요청과 응답에 대한 로깅 등의 작업을 수행한다.Filter는 다음과 같은 장점을 제공한다.
- 중복 코드 제거: 여러 서블릿에서 공통으로 사용되는 코드를 Filter로 분리하여 중복을 제거할 수 있다.
- 보안 강화: Filter를 이용하여 모든 요청에 대한 보안 검사나 인증 처리 등을 통합적으로 수행할 수 있다.
- 코드 가동성 향상: 서블릿 코드에서 비즈니스 로직과 관계 없는 처리를 Filter로 분리하여 코드 가동성을 향상시킬 수 있다.
Filter는 javax.servlet.Filter 인터페이스를 구현하여 작성된다.
또한 web.xml 파일에서 필터의 매핑과 순서를 설정할 수 있다.
최근에는 @WebFilter 어노테이션을 사용하여 필터를 등록하는 방법도 제공된다.
Servlet Container가 수행한 특정한 타입의 동작(이벤트)을 감지하여 해당 이벤트에 대해 별도의 작업을 수행하는 객체
ServletContextListener: 웹 애플리케이션 시작, 종료 이벤트에 대한 이벤트 리스너이다. 핸들러 메서드에서는 ServletContext에 대한 참조를 얻을 수 있다.
ServletContextAttributeListener: ServletContext에 속성을 추가, 제거, 수정할 때 발생하는 것에 대한 이벤트 리스너이다. 핸들러 메서드에서는 추가하거나 제거, 수정된 attribute정보를 얻을 수 있다.
HttpSessionListener: HTTP 세션의 시작, 종료 이벤트에 대한 이벤트 리스너이다. 핸들러 메서드에서는 현재 세션 객체를 얻을 수 있다.
HttpSessionAttributeListener: HttpSession에 속성을 추가하거나 제거, 수정 되었을 때에 대한 이벤트 리스너이다. 핸들러 메서드에서는 추가하거나 제거, 수정된 attribute 정보를 얻을 수 있다.
ServletRequestListner: 클라이언트로부터의 요청으로 인한 ServletRequest 생성과 응답 이후 ServletRequest 제거시에 대한 이벤트 리스너이다. 핸들러 메서드에서는 요청에 관련된 정보와 ServletContext에 대한 참조를 얻을 수 있다.
ServletRequestAttributeListener: ServletRequest에 속성을 추가하거나 제거, 수정되었을 때에 대한 이벤트 리스너이다. 핸들러 메서드에서는 추가하거나 제거, 수정된 attribute 정보를 얻을 수 있다.
<form method='post' action='login' enctype=''>
...
</form>
MIME(Multipurpose Internet Mail Extensions) 타입은 웹에서 파일의 형식을 구분하기 위해 사용된다.
**자주 사용하는 MIME TYPE
위와 같은 MIME 타입은 서블릿과 JSP에서 응답(Response)을 생성할 때 Content-Type 헤더에 설정하여 클라이언트(웹 브라우저)가 올바르게 인식하도록 해야 한다.
MIME-Version: 1.0
Content-Type: multipart/mixed; boundary=frontier
This is a meesage with multiple parts in MIME format.
--frontier
Content-Type: text/plain
This is the body of the message.
--frontier
Content-Type: application/octet-stream
Content-Transfer-Encoding: base64
PGh0bWw+CiAgPGhlYWQ+CiAgPC9oZWFkPgogIDxib2R5PgogICAgPHA+VGhpcyBpcyB0aGUg
Ym9keSBvZiB0aGUgbWVzc2FnZS48L3A+CiAgPC9ib2R5Pgo8L2h0bWw+Cg==
--frontier--

ServletContainerInitializer 인터페이스는 Servlet 3.0 버전에서 새롭게 도입된 인터페이스로, 웹 애플리케이션이 시작될 때 서블릿 컨테이너에 의해 호출되는 클래스의 초기화를 담당한다. 이 인터페이스를 구현하는 클래스는 웹 애플리케이션이 시작될 때 자동으로 호출된다.
ServletContainerInitializer 인터페이스는 onStartup() 메서드를 정의하고 있다. 이 메서드는 Set<Class\<?>> 클래스 목록과 ServletContext 객체를 매개변수로 받는다. Set<Class\<?>>은 ServletContainerInitializer 구현체가 처리할 클래스나 인터페이스의 집합을 지정한다. ServletContext 객체는 웹 애플리케이션의 ServletContext를 나타낸다.
@HandlesTypes 어노테이션은 onStartup() 메서드에서 처리할 클래스나 인터페이스를 지정하는 데 사용된다. 예를 들어, @HandlesTypes(MyIterface.class)로 지정하면 ServletContainerInitializer 구현체는 MyInterface를 구현한 모든 클래스를 찾아 초기화한다. 이를 활용해 원하는 타입의 클래스를 찾아 초기화할 수 있다.
ServletContainerInitializer는 서블릿 컨테이너의 확장 가능성을 높이고, 전통적인 web.xml 파일을 대체할 수 있는 방법으로 사용된다. 이를 통해 프로그래머는 보다 유연하게 웹 애플리케이션을 구성할 수 있다.
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@ include file="/some/path/content.html" %>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
<%= "Hello, World!" %>
<%= 17 * 5 %>
<%= request.getParameter('name' %>
<%! String name = "James" %>
<%!
public int minus(int i, int j) {
return i - j;
}
%>
JSP(Java Server Pages)에서 <%! %>는 선언문(Declaration)을 나타내는 태그이다.
이 태그는 JSP 페이지의 전역 범위(Global scope)에서 사용할 수 있는 변수, 메소드, 클래스 등을 선언할 때 사용된다.선언문(Declaration)은 JSP 페이지에서 Java 코드를 작성할 때 사용된다.
이 코드는 JSP 페이지를 서블릿(Servlet)으로 변환할 때 전역 범위(Global scope)에 선언된다.
따라서 JSP 페이지 내에서 선언한 변수나 메소드는 서블릿에서 사용할 수 있다.
<%
int a = 3;
int b = 2;
if (a > b) {
out.println(minus(a, b));
}
%>
<% if (x < 0) { %>
<p>negative</p>
<% } else { %>
<p>zero or positive</p>
<% } %>
<table>
<tr>
<% for (i = 0; i < 10; i++) { %>
<td><%= i + 1 %></td>
<% } %>
</tr>
</table>
위 두개의 주석 차이는 html 주석은 html 파일 내부에 나타나고 jsp 주석은 html 파일 내부에 나타나지 않는다.

| 객체 | 타입 | 설명 |
|---|---|---|
| page | javax.servlet.jsp.HttpJspPage | page의 Servlet 인스턴스 |
| config | javax.servlet.ServletConfig | ServletConfig |
| request | HttpServletRequest | 요청 객체 |
| response | HttpServletResponse | 응답 객체 |
| out | javax.servlet.jsp.JspWriter | page 컨텐츠 풀력용 스트림 |
| session | javax.servlet.http.HttpSession | 세션 |
| application | javax.servlet.ServletContext | ServletContext |
| pageContext | javax.servlet.jsp.PageContext | JSP page의 실행 context |
| exception | java.lang.Throwable | 처리되지 않은 에러나 예외 |
include는 해당 URL로 제어권을 넘기지만 include처리가 끝나면 다시 제어권은 원래의 페이지로 돌아옴 (즉 해당 페이지에 삽입하는 것과 같음)
forward는 요청과 응답에 대한 제어권을 URL로 지정된 주소로 영구적으로 넘김. -> 종료
POJO는 주요 Java 오브젝트 모델, 컨벤션 또는 프레임워크를 따르지 않는 Java 오브젝트를 의미한다.
Springframework의 주요기술인 IoC, DI, AOP, PSA 기술들을 이용해서 POJO로 개발할 수 있게 해주는 기능 기술이다.
| prefix | name | URI | 내용 |
|---|---|---|---|
| c | core | http://java.sun.com/jsp/jstl/core | 변수 지원, URL 관리, 흐름 제어 등 |
| fn | function | http://java.sun.com/jsp/jstl/functions | 문자열 조작 등 |
| fmt | formatting | http://java.sun.com/jsp/jstl/fmt | 로케일, 타임존, 날짜, 시간 화폐 포멧팅 등 |
| x | xml | http://java.sun.com/jsp/jstl/xml | XML 처리 |
| sql | sql | http://java.sun.com/jsp/jstl/sql | 데이터 소스 설정, SQL 쿼리 수행 등 |