본문 바로가기

Servlet&JSP 프로그래밍

뉴렉처[Servlet/JSP] 강의 복습 1강~20강

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