[JSP/Servlet] Fileter
- BACKEND/Servlet&JSP
- 2017. 5. 19. 09:42
Filter : 사용자가 요청한 서블릿 실행 전, 후에 호출되는 web component, 여러 서블릿의 공통 작업을 처리하도록 구현
Client ---> Filter ---> Servlet
(클라이언트)<--- (필터)<--- (서블릿)
Interface로 Filter생성 --> lifecycle 메소드 선언 --> 오버라이딩 해서 lifecycle 메소드 재정의
o life cycle 메소드
- void init (FilterConfig)
- void destroy()
- void doFilter(req, res, Filterchain) --> Filterchain ( 다음에 일할 컴포넌트를 호출하는 기능 제공)
o Filter 객체 ( web.xml)에 등록
ex) <filter>
<filter-name> </filter-name>
<filter-class> </filter-class>
<init-param> </init-param> <-- 초기파라미터
</filter>
<filter-mapping>
<filter-name> </filter-name>
<url-pattern> </url-pattern>
</filter-mapping>
o URL 등록
/url : 1개의 url등록
/경로/* : 디렉토리경로 하위 경로 모두 매핑
/* : 어플리케이션 하위 경로 모두 매핑
*.확장자 : 확장자 매핑
web.xml
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://xmlns.jcp.org/xml/ns/javaee" xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd" version="3.1">
<display-name>FilterExam</display-name>
<welcome-file-list>
<welcome-file>index.jsp</welcome-file>
</welcome-file-list>
<!-- Filter 등록 -->
<filter>
<filter-name>encodingFilter</filter-name>
<filter-class>filter.EncodingFilter</filter-class>
<init-param>
<param-name>encoding</param-name>
<param-value>UTF-8</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>encodingFilter</filter-name>
<url-pattern>/*</url-pattern>
<!-- url-pattern : 사용자가 요청한 url의 servlet/jsp의 실행 전후로 일해라 -->
</filter-mapping>
<servlet>
<servlet-name>a</servlet-name>
<servlet-class>servlet.AServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>a</servlet-name>
<url-pattern>/a</url-pattern>
</servlet-mapping>
<servlet>
<servlet-name>b</servlet-name>
<servlet-class>servlet.BServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>b</servlet-name>
<url-pattern>/b</url-pattern>
</servlet-mapping>
<servlet>
<servlet-name>c</servlet-name>
<servlet-class>servlet.CServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>c</servlet-name>
<url-pattern>/c</url-pattern>
</servlet-mapping>
</web-app>
EncodingFilter.java
package filter;
import java.io.IOException;
import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
/**
* Filter 구현
* 1. javax.servlet.Filter 인터페이스 implements
* 2. lifecycle (callback) 메소드 오버라이딩)
* 3. web.xml에 등록
*/
public class EncodingFilter implements Filter{
private String encoding; //초기 파라미터 encoding을 저장할 변수
@Override
public void destroy() {
//Filter 객체가 소멸되기 전에 호출 되는 메소드
System.out.println("EncodingFilter.destroy() 실행");
}
@Override
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
throws IOException, ServletException {
// 사용자 요청(Servlet이나 JSP)이 들어올때 마다 호출 되는 메소드
System.out.println("EncodingFilter.doFilter()-전처리 작업");
request.setCharacterEncoding(encoding);
//사용자가 요청한 Servlet/JSP 가 실행 - 사용자가 요청한 컴포넌트 호출
chain.doFilter(request, response);
System.out.println("EncodingFilter.doFilter()-후처리 작업");
}
@Override
public void init(FilterConfig config) throws ServletException {
// Filter 객체가 생성되고 호출되는 초기화 메소드 - Web Application 시작시 객체가 생성됨
// 매개변수 : FilterConfig = 이 Filter객체가 일할 때 필요한 정보제공 => 초기파라미터
this.encoding = config.getInitParameter(encoding);
System.out.println("EncodingFilter.init() 실행"+encoding);
}
}
AServlet, BServlet, CServlet.java
package servlet;
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 AServlet extends HttpServlet{
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
System.out.println(req.getParameter("address"));
req.getRequestDispatcher("/index.jsp").forward(req, resp);
}
}
package servlet;
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 BServlet extends HttpServlet{
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
System.out.println(req.getParameter("address"));
req.getRequestDispatcher("/index.jsp").forward(req, resp);
}
}
package servlet;
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 CServlet extends HttpServlet{
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
System.out.println(req.getParameter("address"));
req.getRequestDispatcher("/index.jsp").forward(req, resp);
}
}
index.jsp
<%@ page contentType="text/html;charset=UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
<h1>AServlet호출</h1>
<form action="/FilterExam/a" method="post">
주소 : <input type="text" name="address"> <input type="submit" value="AServlet호출">
</form>
<h1>BServlet호출</h1>
<form action="/FilterExam/b" method="post">
주소 : <input type="text" name="address"> <input type="submit" value="BServlet호출">
</form>
<h1>CServlet호출</h1>
<form action="/FilterExam/c" method="post">
주소 : <input type="text" name="address"> <input type="submit" value="CServlet호출">
</form>
</body>
</html>
'BACKEND > Servlet&JSP' 카테고리의 다른 글
[JSP/Servlet] FileUpload 개념 파일 (0) | 2017.06.16 |
---|---|
[JSP/Servlet] Annotation (0) | 2017.05.30 |
[JSP/Servlet] 초기파라미터를 제공하는 EL 예제 (0) | 2017.05.17 |
[JSP/Servlet] JSTL (0) | 2017.05.17 |
[JSP/Servlet] Expression Language 정의 및 간단한 확인 예제 (0) | 2017.05.16 |