뉴렉처 학습(서블릿/JSP) 19강 ~ 20강
#19강 한글 입력 문제
- 영문자는 문자 하나 당 1바이트면 충분히 표현 가능하지만, 한글, 중국어, 일본어 등의 경우 기본적으로 영문자 + 확장된 숫자를 통해 문자를 표현하기 때문에 문자 하나 당 2바이트가 사용된다.
- UTF-8 인코딩 방식은 문자 하나를 2바이트 단위로 표현, 그러나 톰캣의 기본적인 인코딩 방식은 ISO-8859-1로 문자 하나를 1바이트 단위로 인식한다. 이때 서블릿 코드에 인코딩 방식을 UTF-8로 읽어들있수 있도록 하거나, 톰캣 환경설정 내 커넥터 방식에 인코딩 방식을 기본 ISO-8859-1 에서 UTF-8로 변경하면 문 제가 해결 된다.
- 그러나, 일반적으로 톰캣은 서버 하나로 여러 서버를 운영할 수 있기 때문에 서버 환경설정은 건드리지 않는다.
package com.newlecture.web;
import java.io.IOException;
import java.io.PrintWriter;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
@WebServlet("/notice-reg")
public class NoticeReg extends HttpServlet {
@Override
protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
resp.setCharacterEncoding("UTF-8");
resp.setContentType("text/html; charset=UTF-8");
req.setCharacterEncoding("UTF-8"); // 요청 내용을 서버에서 UTF-8로 읽을 수 있도록 하는 코드
PrintWriter out = resp.getWriter();
String title = req.getParameter("title");
String content = req.getParameter("content");
out.println(title);
out.println(content);
}
}
#20강 서블릿 필터
*필터
- 요청이 서블릿으로 가기 전 인증, 권환 부여 등의 용도로 사용, 수문장 같은 역할을 수행한다.
- 한글 이용 시 기존에 request.setCharacterEncoding("UTF-8"); 코드를 사용하여 요청 값에 대해 UTF-8인코딩 방식으로 표현될 수 있도록 하였는데, 요청이 빈번히 발생할 때마다 서블릿에 설정하는 것은 번거로움이 발생, 필터를 사용하여 처리하는 것이 효율적이다.
*필터 생성 방법
- Java Resources > src에 새로운 클래스 생성
- 패키지명(Package) : www.com.newlecture.web.filter
- 클래스명(Name) : CharacterEncodingFilter
- 인터페이스 add 클릭 후 javax.servlet.Filter 클릭 후 생성
*필터 설정 방법(xml 파일을 이용한 방법)
- 필터 설정은 서블릿처럼 xml파일 이용하여 설정하거나, 어노테이션을 이용하여 설정할 수 있다.
1. xml 파일 파일 내 코 아래 코드를 입력한다.
2. 아래 코드 입력 후 실행 시 필터는 출력 되지만, 연결된 문서는 출력되지 않는다.
<?xml version="1.0" encoding="UTF-8"?>
<!--
Licensed to the Apache Software Foundation (ASF) under one or more
contributor license agreements. See the NOTICE file distributed with
this work for additional information regarding copyright ownership.
The ASF licenses this file to You under the Apache License, Version 2.0
(the "License"); you may not use this file except in compliance with
the License. You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
-->
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee
http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd"
version="4.0"
metadata-complete="false">
<!-- <servlet>
<servlet-name>na</servlet-name>
<servlet-class>com.newlecture.web.Nana</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>na</servlet-name>
<url-pattern>/hello</url-pattern>
</servlet-mapping> -->
// 필터 관련 설정
<filter>
<filter-name>characterencodingFilter</filter-name>
<filter-class>com.newlecture.web.filter.CharacterEncodingFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>characterencodingFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
<display-name>Welcome to Tomcat</display-name>
<description>
Welcome to Tomcat
</description>
</web-app>
3. chain.doFilter(request,response) : 다음 실행(흐름)을 관할하는 것.
- 필터 파일 내 아래 코드처럼 입력하여 필터 전, 후 설정 가능.
package com.newlecture.web.filter;
import java.io.IOException;
import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
public class CharacterEncodingFilter implements Filter {
@Override
public void doFilter(ServletRequest request
, ServletResponse response,
FilterChain chain)
throws IOException, ServletException {
System.out.println("before filter"); // 필터 전
chain.doFilter(request, response); // 필터
System.out.println("after filter"); // 필터 후
}
}
- 다음 것 진행 전에 뭔가 실행해야 할게 있을 경우(서블릿 실행 전 인코딩 작업 진행 할 경우) 아래 코드로 진행, 이로써 모든 서블릿은 인코딩 필터가 적용된 환경을 갖게된다.
package com.newlecture.web.filter;
import java.io.IOException;
import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
public class CharacterEncodingFilter implements Filter {
@Override
public void doFilter(ServletRequest request
, ServletResponse response,
FilterChain chain)
throws IOException, ServletException {
request.setCharacterEncoding("UTF-8");
chain.doFilter(request, response);
}
}
*필터 설정 방법(어노테이션을 이용한 방법)
1. 필터 파일 내 아래 코드 입력하여 적용 ( 기존 xml 파일을 이용한 방식에서 어노테이션을 이용한 방식으로 변경할 경우 xml파일 내 기존 필더 관련 내용 삭제해야 된다. )
package com.newlecture.web.filter;
import java.io.IOException;
import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.annotation.WebFilter;
@WebFilter("/*")
public class CharacterEncodingFilter implements Filter {
@Override
public void doFilter(ServletRequest request
, ServletResponse response,
FilterChain chain)
throws IOException, ServletException {
request.setCharacterEncoding("UTF-8");
chain.doFilter(request, response);
}
}