[JSP/Servlet] Fileter

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>

댓글

Designed by JB FACTORY