앞서 post방식과 get방식에서의 한글처리는 코드의 중복도 많아질 뿐더러 효율이 그다지 좋지 않은 코딩방법이라고 할수있습니다.
그러면 어떤 방법으로 코딩을하면 좀더 효율적인 방법일까요??
filter를 이용하는 방법이 있습니다.
필터라는 것은 뭔가를 걸러낸다는 의미이죠.
필터에 인코딩을 넣어주게 되면 통신을 할때 Filter가 한번 걸러서 데이터를 전송을 하게 되는데 데이터가 요청되고 응답될때 인코딩되어 전송이 될수 있겠죠.
필터는 인터페이스 이기 때문에 클래스를 만들어서 구현을 해야합니다.
doFilter부분이 가장 중요하다고 할수있습니다.
package com.servlet.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 TempFilter implements Filter {
@Override
public void init(FilterConfig arg0) throws ServletException {
System.out.println(" -- filter init() --");
}
@Override
public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain)
throws IOException, ServletException {
System.out.println(" -- filter doFilter() --");
// reqeust filter
req.setCharacterEncoding("UTF-8");
chain.doFilter(req, res);
// response filter
}
@Override
public void destroy() {
System.out.println(" -- filter destroy() --");
}
}
TempFilter클래스를 만들어 보았습니다.
해당 클래스는 Filter 인터페이스를 상속받고 있습니다.
이렇게 Filter인터페이스를 상속받게 되면 구현해야하는 추상메서드는 init(), doFilter(), destory() 3가지가 있습니다.
init() 메서드는 필터가 처음 생성될때 한번 들리는 곳이며 destroy() 메서드는 필터가 소멸될때 들리는 곳입니다.
실질적으로 기능의 역할을 하는곳은 doFilter() 메서드라는 것이죠.
doFIlter() 메서드를 보면 매개변수로 chain이라는것이 있습니다.
서버와 클라이언트간에 데이터를 왔다갔다 하게 해주는 핵심 객체는 request와 response인데 req와 res를 이용해 dofilter를 실행시켜줍니다.
이게 실행되기 이전에 요청된 데이터 req.setCharacterEncoding("UTF-8");을 통해 인코딩을 해주게 됩니다.
chain.doFIlter(req, res);을 실행하기 전 부분이 request부분입니다.
사용자로부터 데이터가 오게되었을때 한글이 깨지지 않게 서버에서 제대로 인코딩을 해야합니다.
그래서 doFilter 이전에 인코딩을 하는것이빈다.
req로 들어와서 인코딩을 하고 필터를 거져서 res로 나가게 되는것입니다!
하지만 이렇게 클래스만 만들었다고 해서 웹컨테이너가 필터를 찾을수는 없습니다.
그래서 web설정파일인 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>lec15Pjt001</display-name>
<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>
<!-- filter -->
<filter>
<filter-name>tempFilter</filter-name>
<filter-class>com.servlet.filter.TempFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>tempFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
</web-app>
web.xml에서 filter를 이용하여 매핑을 하게되고 url-pattern의 경우 /*는 서버에 들어오는 모든 경로에서 들어오는 것을 필터링 해달라는 뜻으로 매핑이 되어있습니다.
이 글은 실전 JSP (renew ver.) - 신입 프로그래머를 위한 강좌를 수강하며 공부한 내용을 정리한 글입니다.
https://www.inflearn.com/course/실전-jsp_renew/dashboard
'Java 관련 > JSP & Servlet' 카테고리의 다른 글
[JSP & Servlet] DAO와 DTO (0) | 2022.08.24 |
---|---|
[JSP & Servlet] JDBC (0) | 2022.08.23 |
[JSP & Servlet] JSP Servlet의 한글처리 (0) | 2022.08.21 |
[JSP & Servlet] Session (1) | 2022.08.20 |
[JSP & Servlet] Cookie (0) | 2022.08.19 |