[서블릿/JSP] 강의 정리 2 - GET, POST, 한글 출력

별의개발자커비·2023년 8월 2일
0

JSP

목록 보기
28/31
post-thumbnail

11 - 이클립스를 이용한 서블릿 프로그래밍

web.xml에서 매핑하고 실행

  • 패키지 내 파일명으로 수정


12 - 어노테이션을 이용한 URL 매핑

@WebServlet("/hi") 어노테이션 이용


13 - 서블릿 출력 형식을 지정해야 하는 이유


14 - 한글과 콘텐츠 형식 출력하기

해결 1 보낼 때: 한글을 지원하는 문자코드 UTF-8로 인코딩해서 보내기

이렇게 ?는 아예 보낼 때부터 인코딩이 안된 경우이므로

reponse.setCharacterEncooding("UTF-8")

해결2 받을 때: 브라우저에서 받을 때도 UTF-8로 받기

이건 보낼 때는 잘 보냈는데 받을 때 인코딩이 안된 경우

reponse.setContentType("text/html; charset=UTF-8")

= 이건 html 문서인데 UTF-8로 문자를 읽어라

결과

15 - GET 요청과 쿼리스트링

쿼리스트링

hello?cnt=3
hello 페이지에 cnt=3 옵션을 줄 수 있는게 쿼리스트링

16 - 기본값 사용하기

이전에 default로 쉽게하는 방법이 있었던 것 같음

17 - 사용자 입력을 통한 GET 요청

get으로 form 제출했을 때

form에 method를 post로 안해놓으니까 url의 쿼리스트링으로 정보가 가는구나! 전달할 정보가 1개, 간단하면 쓰면 되겠다.

기본으로 입려되어있는 meta-charset 태그 바꾸는 방법

  • 이전에 3개 다 바꿔놓으라고 했던게 이걸 바꾸기 위해서였구나!

18 - 입력할 내용이 많은 경우는 POST 요청


GET: 주소에 제출값이 다 노출돼 보아 문제점/ url 길이 제한이 있기 때문에
→ POST를 씀

POST로 가도 실제 Form Data에는 이런 주소로 들어감

19 - 한글 입력 문제

POST 제출시 한글 깨지는 문제
전달할 때 깨진걸까? 출력하면서 깨진걸까?
이 설정으로 서블릿에서 화면으로 reponse 보낼 때, 그리고 그 화면에서 받을 때 둘 다 UTF-8로 인코딩 잘 되어있음

그렇다면 문제는, POST form에서 UTF-8인 한글로 정보를 보냈는데 UTF-8로 안 받아서 깨지는 것!

- 멀티바이트 문자 전송 문제

  • 문자는 실제로는 숫자로 대칭됨: 문자 1개 당, 숫자 1개(1byte)
    • 영문자는 문자 1개 당 1byte
    • 한글은 문자 1개 당 2byte
  • 그렇게, 사용자는 서버에 2byte 단위로 되어있는 한글로 form 내용 전달
  • 그런데, 서버 쪽에서는 1byte 단위로 되어있는 ISO-8859-1로 인식 (톰캣 기본 설정이라)
    • 한글 3글자가(6byte) 왔는데 6글자로(6byte) 인식하려니 깨짐

- 해결 방법

서블릿에다 사용자 전달 값request을 읽어들이기 전에 utf-8으로 읽어들이겠다 라는 설정을 먼저 하고 파라미터를 읽어야함

request.setCharacterEncooding("UTF-8")
  • 단, tomcat의 server.xml(환경설정)에서 connector의 encoding을 utf-8로 바꿀 수 있으나,
    웬만하면 톰캣 서버 설정을 손대지 않는다.
    • 서버 하나로 여러 서비스(사이트)를 돌릴 수 있는데, 나의 설정을 위해 다른 서비스가 영향을 받으면 안되니까.

20 - 서블릿 필터(Servlet Filter)

  • 기존 request 인코딩 처리 제거
  • 한글 읽어들일 일이 많아서 모든 서블릿에서 하나 하나 다 해주는 것은 불편
  • 따라서, 모든 request이 올 때 인코딩을 되고 지나가게하는 필터를 쓰는 것!

Fileter 클래스

Servlet의 필터 interface 상속받아서 생성

Filter의 실행. 2번?

  1. 톰캣이 처음 실행될 때 실행되고
  2. 그 후부터는 요청이 있을 때 마다 실행됨

필터 적용방법 2가지

  1. web.xml에 설정 (서블릿 설정 처럼)
  2. @어노테이션으로 설정

1. web.xml에 설정

<filter-class> : 위의 filter 내용 쓴 파일 경로(패키지 포함)

이렇게 하면 /* 모든 url에 대해서 characterEncodingFilter가 적용됨

FilterChain


근데 filter 출력문은 나오는데 원래 reg 내용은 안나올까?

  • cha-Filter 클래스의 hello filter가 실행은 됐는데 ,
  • 이 필터 클래스가 실행된 다음에 이 요청을 서블릿 실행하는 쪽으로 전이를 할까 말까는
  • 이 필터 클래스 단에서 설정하는 것이라서!

그래서, filterChain!

이 흐름을 다음으로 넘겨줄 것인가를 결정하는 것

  1. 요청이 오면 필터를 실행함 before filter
  2. chain.dofilter(request, reponse) 로 다음 필터 또는 서블릿이 실행되게 흐름을 넘김 : 조건 등을 통해서 흐름을 관할
  3. 다른 거 실행되고 결과가 여기로 다시 오고 나서 after filter 실행됨

그래서, 인코딩 적용은

우리는 모든 서블릿이 실행되기 전에 인코딩 작업을 하려고하기 때문에 dofilter 전에 넣어주면 됨

2. @어노테이션에 설정

매핑할 주소만 적용하려고 만든 필터 클래스 위에 @WebFilter로 넣어주면
: web.xml의 <filter> 설정 모두 대체 가능!

profile
비전공자 독학러. 일단 쌔린다. 개발 공부👊

0개의 댓글