[ 필터(.java 클래스) ] 매우 매우 중요 (스노우 필터 생각하면됨)
- 이거 없으면 아무것도 안돌아감
- 솔루션 프레임워크 이런데서는 기본적으로 탑재되어 있는 기능 (spring도 기본으로 들어가 있음)
- 그래서 보통 모르고 씀 (필터클래스를 개발하는 경우는 잘 없음)
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>필터 클래스 01</title>
</head>
<body>
<form action="test04.jsp" method="post">
보낼 데이터: <input type ="text" name="data">
<input type = "submit" value = "데이터 전송">
</form>
</body>
</html>
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>필터 클래스 02</title>
</head>
<body>
도착한 데이터: ${ param.data } <!-- param붙어야 attribute -->
</body>
</html>
스프링에서 사용하는 인코딩 필터
Java폴더 안에 -> test패키지-> filter 생성
annotation 자바 문법이고 코드에 대한 설명을 나타냄
인코딩을 넣으면 한글 깨짐 해결 되지만 메서드는 속도를 느리게 함
- 필터 클래스화 할거임
대표적인 Not POJO (plain old java object)
POJO :
우리가 만들면 보통 POJO입니다.
ex) StudentVO, Car, Point, ...
일반 class 파일로 만들수있는 자바 클래스 객체
아무 기능이 없는 밍숭맹숭한
Not POJO :
e.g. 서블릿, 필터, 리스너
Not POJO
이미 기능이 많이 있다
public EncFilter() { //기본 생성자 필수
super();
// TODO Auto-generated constructor stub
}
package test;
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.http.HttpFilter;
/**
* Servlet Filter implementation class EncFilter
*/
//@를 어노테이션 annotation이라고 부름
@WebFilter("*.jsp")
public class EncFilter extends HttpFilter implements Filter {
private String encoding; //멤버변수 초기화 해야됨
/**
* @see HttpFilter#HttpFilter()
*/
public EncFilter() { //기본 생성자 필수
super();
// TODO Auto-generated constructor stub
}
/**
* @see Filter#destroy()
*/
public void destroy() {
// 필터가 메모리에서 해제될때 자동 호출
}
/**
* @see Filter#doFilter(ServletRequest, ServletResponse, FilterChain)
*/
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
// 인코딩 처리 로직 (보통 chain.doFilter위에 넣음)
//request.setCharacterEncoding("UTF-8");//"UTF-8"이 하드코딩 되어있음 : 유지보수 불리함
// --->> 상수화
request.setCharacterEncoding(this.encoding);
// --->> 설정파일을 생성해서 해당 파일의 내용을 로드(불러와서) 사용 WEB-INF하위에 XML파일
// : JAVA를 재작성하게되면 컴파일을 다시 해야 됩니다.
// : 라는건 서버거 최소 1초이상 정지 되어야 한다는거임 == 사용자가 그 시간동안 이용을 못한다
// : -->> 영업손실
System.out.println("로그ㅠㅠㅠ");
chain.doFilter(request, response); //== 이녀석이 바로 사용자의 요청
//여기 안에 사용자의 요청 정보들이 모두 저장되어있음
// 사용자의 요청정보를 보고, 무엇을 요청했는지를 찾아서 다음 페이지로 이동하기 때문에,
//이동하기 전에 인코딩 처리 해야함
}
/**
* @see Filter#init(FilterConfig)
*/
public void init(FilterConfig fConfig) throws ServletException {
// 필터가 최초로 생성될때 자동 호출
// '최초로 생성될때' 호출되기 때문에 단 1번 호출됨
//this.encoding="UTF-8"; //멤버변수 초기화
//멤버변수 초기화는 생성자의 역할인데 왜 init에서 합니까?
// Not POJO의 초기화는 init에서 합니다
// 생성자들이 이미 하는게 너무 많아; 일반적으로 Not POJO들은 생성자를 건들지 않음
//그래도 그래야하는 이링 있기 때문에 init이 있는거임
//↑이것도 하드코딩 아닌가요??
this.encoding=fConfig.getServletContext().getInitParameter("encoding");
System.out.println("로그 init 동작");
}
}
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd" id="WebApp_ID" version="3.0">
<context-param>
<param-name>encoding</param-name>
<param-value>UTF-8</param-value>
</context-param>
</web-app>