6강 - Context 사이트 추가하기
Context란 물리적으로는 서로 다른 루트 폴더로 구성되어있지만, 실행할때는 같은 루트의 폴더에 있는것 처럼 설정
설정방법: apache-tomcat-9.0.41 -> conf -> server.xml 에서 실제 경로와 가상 경로를 지정해준다.
ex. 가상경로: it 실제경로: C:\tools\apache-tomcat-9.0.41\webapps\ITWeb
<Context path="it" docBase="C:\tools\apache-tomcat-9.0.41\webapps\ITWeb" privileged="true" />
7강 - Servlet 프로그램 만들기
Servlet은 Server Application Let(서버 어플리케이션 조각)이라고 한다.
Servlet은 service() 메소드를 통해서 클라이언트에게 보여줄 웹 문서를 작성한다.
WAS는 HttpServlet의 추상클래스를 통해서 Servlet들을 참조하고 해당 Servlet을 찾아 servic 메소드를 실행한다.
8강 - Servlet 객체 생성과 실행
WEB-INF는 직접호출(요청)은 불가능하며, 약속된 mapping방식으로 요청해야한다.
-> web.xml에서 편집하여 mapping 해줌으로써 요청가능(WAS는 요청한 페이즈를 web.xml에서 찾아서 servlet을 보여준다.)
ex.
http://../hello ="/hello" 요청=> <servlet-mapping> ="na"서블릿 실행=> <servlet> ==> Nana라는 class파일 실행
<servlet-name>na</servlet-name> <servlet-name>na</servlet-name>
<url-pattern>/hello</url-pattern> <servlet-class>Nana</servlet-class>
</servlet-mapping> </servlet>
9강 - Client에게 출력(브라우저) 보여주기
HttpServletRequest - 입력 도구
HttpServletResponse - 출력 도구
[Stream으로 출력]
OutputStream os = response.getOutputStream(); //byte단위의 입,출력시 Stream 사용
PrintStream out = new PrintStream(os, true); //문자열 출력을 편하게 쓰는 PrintStream 사용,
//true는 버퍼를 채울때까지 기다리지 말고 print했을때 바로 출력하게 하는 옵션
[Writer으로 출력]
PrintWriter out = response.getWriter();
out.println("Hello Servlet");
11강 - 이클립스를 이용한 서블릿 프로그래밍
이클립스 B이클립스 Dynamic Web Project에서 Home 디렉토리는 WebContent 이다.
url에 Context 명이 프로젝트 명으로 사용하면 안좋다.
JSPPrj 프로젝트 우측클륵 -> Properties -> Web Project Settings -> Context root: / 로 설정
http://http://localhost:8080/JSPPrj/index.html ===> http://http://localhost:8080/index.html 변경
12강 - Anotation을 이용해서 Servlet mapping 하기
서블릿 클래스 우에 @WebServlet("/hello") 을 써줌으로써 url을 "http://.../hello"로 했을때 해당 서블릿을 불러오게 맵핑
#주의!
어노테이션 사용시 web.xml에 가서
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="true">
"true" -> "false" 로 설정 변경
true로 설정하면 다른 곳에서 설정하지 않고 모든 설정이 web.xml에 있으니 web.xml에서만 찾아라!
false로 설정하면 web.xml 이외에도 설정을 했으니 다른 곳에도 찾아보라!(설정을 web.xml 말고 다른곳에서도 설정가능)
13강 - Servlet 출력 형식의 이해
클라이언트는 요청한 결과를 웹문서로 인식한다.
--> println을 했어도 브라우저에서는 웹문서로 인식했기 떄문에 내려쓰기를 하지 않는다.
브라우저에 컨텐츠 형식을 알려주지 않는 경우: 브라우저는 자의적으로 해석을 한다.
(Explorer의 경우: html로 해석 / Chrome의 경우: text로 해석)
따라서 웹 문서를 보낼때 어떤 형식의 문서를 보낼지 설정해야한다. (14강에서 설명함)
14강 - 한글 출력과 컨텐츠 형식 지정하기
한글이 깨지는 이유
1) 웹서버에서 ISO-8859-1 인코딩 방식으로 클라이언트에게 결과를 보낼때 1byte씩 보내게 된다.
한글은 2byte임으로 깨지게 되는것이다.
2) 웹서버에서 UTF-8 인코딩 방식으로 클라이언트에게 결과를 보낼때는 2byte씩 보내지만, 클라이언트가 해석할때 EUC-KR의 방식으로 해석하면 이상하게 출력됨.
# 한글 출력과 컨텐츠 형식 지정하는 방법.
response.setresponse.setCharacterEncoding("UTF-8");
//웹서버에서 앞으로 출력(보내는) 컨텐츠는 UTF-8 인코딩 방식이다.
response.setContentType("text/html; charset=UTF-8");
//웹서버에서 컨텐츠를 보내는데 클라이언트(브라우저)에서 UTF-8 인코딩 방식으로 읽어야한다.
//"text/html"은 컨텐츠의 형식은 html문서이다.
15강 - GET 요청과 쿼리 스트링
GET요청이란, http://localhost/hello 에서 hello 라는 servlet 문서를 요청하는 것이다.
무엇을 달라고 하는 요청에는 옵션이 있을 수 있다.
ex. http://localhost/hello?cnt=3
(위와 같은 옵션 "cnt=3"을 QueryString 이라고 한다.)
이와 같이 클라이언트의 옵션 요청에 서버에서 옵션값을 받으려면 request.getParameter("cnt") 같이 받아준다.
(cnt 의 값 타입은 String임으로 int형으로 변환해준다.)
ex. int cnt = ex. int cnt = Integer.parseInt(request.getParameter("cnt"));
16강 - 기본값 사용하기
클라이언트가 GET요청시 추가적인 옵션 값을 입력안했을때 에러가 발생함 ==> default일때를 위한 조건식 추가
http://localhost/hello?cnt=3 ==> "3" 이 전달(문자열3)
http://localhost/hello?cnt= ==> "" 이 전달(빈문자열)
http://localhost/hello? ==> null값이 전달
http://localhost/hello ==> null값이 전달
String temp = request.getParameter("cnt"); //임시변수로 담아두기
int cnt = 100;
if(temp != null && !temp.equals(""))
cnt = Integer.parseInt(temp);
for(int i = 0; i < cnt; i++)
out.println((i+1) + ": 안녕 Servlet~~~~ <br />");
17강 - 사용자 입력을 통한 GET요청
input 태그의 속성 name은 사용자가 입력한 값을 실어 나르는 역할을 한다.
form 태그의 action 속성에는 Servlet 매핑 주소를 쓴다.
18강 - 입력할 내용이 많은 경우 POST 요청
GET 요청으로 URL을 타고 값이 전달되면 값을 보내는데 한계발생 --> POST요청 방식
form태그에서 값을 전달할때 옵션을 부여할 수 있다. (method="")
Default로 옵션을 부여하지 않으면 GET요청
method="POST"로 옵션 부여하면 POST 요청(URL을 타고 가면 보안상 문제발생 및 데이터 보내는데 한계발생)
POST로 요청하면 데이터는 문서요청 Body에 넣어서 전달된다.(요청 Body는 데이터에 크기 상관없이 전부 보낸다.)
19강 - POST 요청시 한글 입력 문제
클라이언트가 UTF-8 인코딩 방식으로 한글(2byte)을 입력하여 데이터를 웹 서버에 보내면,
웹 서버는 ISO-8859-1 인코딩 방식으로 1byte씩 읽어들이기 때문에 깨지는 한글이 깨지는 현상 발생!
===> 웹 서버에서 클라이언트의 값을 읽어들이는 과정을 ISO-8859-1 이 아닌 UTF-8로 읽어들인다고 해야한다.
설정방법: request.setCharacterEncoding("UTF-8");
20강 - Servlet 필터
클라이언트로 부터 입력받은 한글 데이터를 처리하는 Servlet 마다 request.setCharacterEncoding("UTF-8");를 써줘야하는 상황이 발생
==> 대안: 서블릿이 실행하기 전,후 로 실행되는 서블릿 필터를 만들어준다.
필터 실행은 톰캣이 처음 실행할때 필터가 실행되며, 요청이 올때마다 전,후로 실행된다.
필터 클래스 생성 방법
클래스 생성 -> 인터페이스 Add -> Filter 검색 -> servlet Filter 추가
필터 설정
방법1. web.xml에 등록
<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> (모든 url에 대해서 필터가 동작하게 한다.)
</filter-mapping>
방법2. 어노테이션
필터클래스 위에 해당 어노테이션 작성
@WebFilter("/*") //필터를 적용할 url을 괄호 안에 작성 해준다.
Filter 인터페이스 작성
System.out.println("before filter"); ------ 1
chain.doFilter(request, response); ------ 2
System.out.println("after filter"); ----- 3
순서1)
before filter 출력
순서2)
chain.doFilter(request, response);
(역할: 요청이 오면 다음 Filter 또는 해당 Servlet으로 넘어가게 결정 할 수 있는 역할을 한다.(관문소 및 이정표 역할))
순서 3)
반환후 after filter 가 출력된다.
따라서 한글 데이터 값을 웹서버로 전송했을때 깨지는 현상을 filtering 해주려면
request.setCharacterEncoding("UTF-8"); //요청 받은 값을 UTF-8 로 읽어들인다고 웹서버에 설정한 뒤
chain.doFilter(request, response); //검문소를 통과후 Servlet으로 진행하게 한다.
출처: 뉴렉처
www.youtube.com/watch?v=u6-D8CJbsmo&list=PLq8wAnVUcTFVOtENMsujSgtv2TOsMy8zd&index=14
'Servlet&JSP 프로그래밍' 카테고리의 다른 글
뉴렉처[Servlet/JSP] 강의 복습 58강~68강 (0) | 2021.01.15 |
---|---|
뉴렉처[Servlet/JSP] 강의 복습 51강~57강 (0) | 2021.01.14 |
뉴렉처[Servlet/JSP] 강의 복습 34강~50강 (0) | 2021.01.11 |
뉴렉처[Servlet/JSP] 강의 복습 28강~33강 (0) | 2021.01.08 |
뉴렉처[Servlet/JSP] 강의 복습 23강~27강 (0) | 2021.01.07 |