본문 바로가기
👨‍💻 2. 웹개발_Back end/2-4 JSP & Servlet

[JSP & Servlet] 4장 서블릿과 JDBC (4) - 필터 사용하기

by 달님🌙 2021. 10. 14.
반응형

 

1. 필터 사용하기

 

1. 필터 사용하기

- 필터가 없는 경우

 

2. 필터 넣기

- 필터가 있는 경우 요청과 응답을 하기전에 필터를 거쳐서 진행

- 필터는 한 개 또는 여러 개 넣어줄 수 있음

 

3. 필터 실행

- 서블릿에서 필터를 거처 웹 페이지로 가게됨

- 추상객체에서 init(), doFilter(), destroy() 메소드를 상속받아서 구현하게됨

 

4. 필터 용도

예시) charset을 쓸때도 사용 가능 

request.setCharacterEncoding("UTF-8");

 

5. 필터 만들기

 

6. 필터 만들기 실습

 

 

CharacterEncodingFilter.java

package spms.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;

public class CharacterEncodingFilter implements Filter {
	FilterConfig config;
	
	@Override
	public void init(FilterConfig config) throws ServletException {
		this.config = config;
		
	}
	
	@Override // 요청이 들어올 때마다 doFilter() 호출
	public void doFilter(ServletRequest request, ServletResponse response, FilterChain nextFilter) throws ServletException, IOException {
		//필터 처리 작업은 다음 필터로 전송 전에 작성
		request.setCharacterEncoding(config.getInitParameter("encoding"));
		//다음 필터로 전송하는 메소드
		//다음 필터가 존재하지 않으면 서블릿의 service() 메소드 호출
		nextFilter.doFilter(request, response);
	}
	
	@Override
	public void destroy() {
	}
}

 

7. 필터 적용하는 두 가지 방법

 

1) web.xml 이용

 

2) web.xml 방법 실습

MemberAddServlet.java 파일에서 48번째 라인 주석 처리

 

web.xml 파일에서 필터선언 부분과 필터 URL 매핑 부분 주석 처리

<?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" id="WebApp_ID" version="3.1">
  <display-name>_06_JDBCServlet</display-name>
  
  <!-- 컨텍스트 초기화 매개변수 -->
  <context-param>
  	<param-name>driver</param-name>
  	<param-value>com.mysql.jdbc.Driver</param-value>
  </context-param>
  <context-param>
  	<param-name>url</param-name>
  	<param-value>jdbc:mysql://localhost/studydb?serverTimezone=UTC</param-value>
  </context-param>
  <context-param>
  	<param-name>username</param-name>
  	<param-value>study</param-value>
  </context-param>
  <context-param>
  	<param-name>password</param-name>
  	<param-value>study</param-value>
  </context-param>
  
  <!-- 필터 선언 -->
  <!-- <filter>
  	<filter-name>CharacterEncodingFilter</filter-name>
  	<filter-class>spms.filter.CharacterEncodingFilter</filter-class>
  	<init-param>
  		<param-name>encoding</param-name>
  		<param-value>UTF-8</param-value>
  	</init-param>
  </filter>-->
  
  <!-- 필터 url 매핑 -->
  <!-- /* : 모든 url 요청에 적용 -->
  <!--<filter-mapping>
 	<filter-name>CharacterEncodingFilter</filter-name>
 	<url-pattern>/*</url-pattern> 
  </filter-mapping>-->
  
  <welcome-file-list>
    <welcome-file>index.html</welcome-file>
    <welcome-file>index.htm</welcome-file>
    <welcome-file>index.jsp</welcome-file>
    <welcome-file>default.html</welcome-file>
    <welcome-file>default.htm</welcome-file>
    <welcome-file>default.jsp</welcome-file>
  </welcome-file-list>
</web-app>

 

실행 화면 - 한글 깨져있음

 

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" id="WebApp_ID" version="3.1">
  <display-name>_06_JDBCServlet</display-name>
  
  <!-- 컨텍스트 초기화 매개변수 -->
  <context-param>
  	<param-name>driver</param-name>
  	<param-value>com.mysql.jdbc.Driver</param-value>
  </context-param>
  <context-param>
  	<param-name>url</param-name>
  	<param-value>jdbc:mysql://localhost/studydb?serverTimezone=UTC</param-value>
  </context-param>
  <context-param>
  	<param-name>username</param-name>
  	<param-value>study</param-value>
  </context-param>
  <context-param>
  	<param-name>password</param-name>
  	<param-value>study</param-value>
  </context-param>
  
  <!-- 필터 선언 -->
 <filter>
  	<filter-name>CharacterEncodingFilter</filter-name>
  	<filter-class>spms.filter.CharacterEncodingFilter</filter-class>
  	<init-param>
  		<param-name>encoding</param-name>
  		<param-value>UTF-8</param-value>
  	</init-param>
  </filter>
  
  <!-- 필터 url 매핑 -->
  <!-- /* : 모든 url 요청에 적용 -->
<filter-mapping>
 	<filter-name>CharacterEncodingFilter</filter-name>
 	<url-pattern>/*</url-pattern> 
  </filter-mapping>
  
  <welcome-file-list>
    <welcome-file>index.html</welcome-file>
    <welcome-file>index.htm</welcome-file>
    <welcome-file>index.jsp</welcome-file>
    <welcome-file>default.html</welcome-file>
    <welcome-file>default.htm</welcome-file>
    <welcome-file>default.jsp</welcome-file>
  </welcome-file-list>
</web-app>

 

실행 화면 - 한글이 잘 나오게됨

* 동일한 이름으로 회원을 추가하면 add화면에서 list 화면으로 이동이 안됨

 

3) 애노테이션으로 필터 지정 (자주 사용하지 않는 방법임)

 

4) 애노테이션 방법 실습

web.xml 파일 다시 주석 처리하고 CharacterEncodingFilter.java 파일에 애노테이션 추가

package spms.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;
import javax.servlet.annotation.WebFilter;
import javax.servlet.annotation.WebInitParam;

//애노테이션 방법
@WebFilter(
		urlPatterns = "/*",
		initParams = {
				@WebInitParam(name = "encoding", value = "UTF-8")
		}
)

public class CharacterEncodingFilter implements Filter {
	FilterConfig config;
	
	@Override
	public void init(FilterConfig config) throws ServletException {
		this.config = config;
	}
	
	@Override
	public void doFilter(ServletRequest request, ServletResponse response, FilterChain nextFilter) throws ServletException, IOException {
		//필터 처리 작업은 다음 필터로 전송 전에 작성
		request.setCharacterEncoding(config.getInitParameter("encoding"));
		//다음 필터로 전송하는 메소드
		//다음 필터가 존재하지 않으면 서블릿의 service() 메소드 호출
		nextFilter.doFilter(request, response);
	}
	
	@Override
	public void destroy() {}
}

 

실행 화면 - 한글이 잘 나오게됨

 

반응형

댓글