Servlet3

33
서서서 3.0 With gradle [email protected] m

description

jsp, servlet3.0, gradle

Transcript of Servlet3

Page 1: Servlet3

서블릿 3.0

With gradle

[email protected]

Page 2: Servlet3

간단 웹서버를 통한 흐름파악

Sun.net.httpserver 를 통해서 요청에 대한 처리를 알아보자 .1.웹서버 객체 생성 ( 이때 포트 점유 )2.컨텍스트 생성3.핸들러 생성4.핸들러에서 응답이 정상일 경우Body data 반환5. 핸들러에서 응답이 오류일 경우오류코드 반환

Page 3: Servlet3

Simple web server

https://gist.github.com/sjyun/cab188a22a755914ce90#file-simpleserver

// 서버객체 및 핸들러 생성server.createContext("/home", new WebserverHandler());

// 응답에 대한 처리sendResponseHeaders

Page 4: Servlet3

설정Build.gradle 전체내용 -> https://gist.github.com/sjyun/62217adf6891abaca6af

Servlet3.0 의존관계 설정dependencies{providedCompile 'javax.servlet:javax.servlet-api:3.1.0'}

참조하는 저장소 설정repositories { jcenter() mavenCentral()}

직접적으로 관련있는 설정은 2 가지이다 .

Page 5: Servlet3

url 설정

3.0@WebServlet(“컨텍스트명” )

Web.xml 이 없어도된다 .

2.5

Page 6: Servlet3

Context 설정

• @WebServlet(name="HelloServlet", urlPatterns ={"/hello"} )

귀찮다면@WebServlet("/hello")https://gist.github.com/sjyun/

f5510acf1d7952920f63#file-helloservlet

Page 7: Servlet3
Page 8: Servlet3

Init 메소드

• Init 메소드는 말 그대로 한번만 호출된다 .• Annotation 을 이용한 Hello 예제를

실행하면 최초 실행 시 한번만 호출되고 doGet 메소드는 웹 페이지를 호출할 때마다 호출된다 .

Page 9: Servlet3
Page 10: Servlet3

초기 파라미터 전달

• @ 을 이용한 context 생성과 init메소드를 알았다면 이제 생성 시에 파라미터를 전달해보자 .

• initParams 를 사용하면 된다 .Initparam @webInitParam(key, value)받을 때는 servletConfig.getInitParameter(“key”);

Page 11: Servlet3

• https://gist.github.com/sjyun/9a13c8bb7223d5d3b368#file-initparamservlet

Page 12: Servlet3

• Context 생성때 @ 사용한 것과 마찬가지로

초기화파라메터를 전달하고자 할 때<init-param> 대신 사용할 수 있고 init

메소드에서 servletConfig 를 인자로 해서

값을 전달 받을 수 있다 .

Page 13: Servlet3

본문내용 출력

• https://gist.github.com/sjyun/0dd739aed6134179821a#file-helloservlet2

자바는 IO 에 대해서 스트림을 사용하기 때문에 getOutputStream 을 이용해서 브라우저로 전송하거나Writer 객체를 얻어서 출력할 수 있다 . 여기에서는Writer 객체로 출력해보자 .

Writer 객체를 얻기 전에 각 서버 상황에 맞춰서캐릭터셋을 맞춰준다 .response.setCharacterEncoding("utf-8");

Page 14: Servlet3

서블릿 흐름요약• 서블릿이 메모리에 로드되어 있는지 확인한다 .• 최초 로딩이라면 메모리에 로딩하고 init() 메소드를 호출한다 .• 서비스메소드를 호출한다 .• 결과값을 클라이언트에게 리턴한다 .• 같은 요청일 경우에는 doGet,doPost 만 수행한다 .

Page 15: Servlet3

LifeCycle 예제

• https://gist.github.com/sjyun/fd113218a5b038f20b9e#file-servletlifecycle Service 메소드는 doGet 과

doPost 중 호출할 메소드를 결정하고 destory 메소드는컨테이너가 종료되었을 때호출된다 . 즉 브라우저가 닫혀도 호출되지 않지만컨테이너인 톰캣이 종료되면호출된다 .

Page 16: Servlet3

폼데이터 처리

https://gist.github.com/sjyun/45142420083dc8514013#file-form-html

Page 17: Servlet3

요청에 대한 응답처리

Form action 값과 서블릿 @ 의 urlPattern 일치여부 확인Request.getParameter(“ 필드명” ) //name 속성

Page 18: Servlet3

HTTP 요청방식 요약• HTTP 데이터 전송방식에 대한 차이• Get• 데이터를 쿼리스트링형식으로 전송• • Post• Application/x-www-form-urlencoded: • 데이터를 스트림형태로 인코딩하여 전달할 때

사용되는 전송방식•  • Multipart/form-data: 파일업로드시

사용되는 전송방식

Page 19: Servlet3

Multipart 데이터처리

Page 20: Servlet3

• Upload 요청 jsp 생성• https://gist.github.com/sjyun/61ff5b947a3455e15ffc#file-

gistfile1-java

Css 사용이유는 텍스트필드와 파일전송용 필드를 UI 적으로구분하기 위해서이다 .Upload 경로는 실제로 로컬에 해당 경로를 만들거나가상디렉토리 설정을 통해서 매핑하면 된다 .

Form 설정에 enctype=”multipart/form-data” Input type=“file”

Page 21: Servlet3

MultipatConfig 속성 요약

Annotaion 명 설명

@fileSizeThreshold

fileUpload 시 에 메 모 리 에 저 장 되 는 임시파일 사이즈 크기를 정의합니다 . [자료형 :int]

@location 파일이 업로드되었을 때 저장할 디렉토리를 지정합니다 . [ 자료형 : String ]

@maxFileSize

업 로 드 할 파 일 의 최 대 사 이 즈 크 기 를 지정합니다 . [ 자료형 :long ]

@maxRequestSize

request 시에 최대 사이즈를 지정합니다 . 자료형 [long]

Page 22: Servlet3

Annotation 이 부담된다면 ..

• <multipart-config>• <location>/tmp</location>• <max-file-size>20848820</max-file-

size>•

<max-request-size>418018841</max-request-size>

• <file-size-threshold>1048576</file-size-threshold>

• </multipart-config>

Page 23: Servlet3

업로드 응답처리 서블릿• https://gist.github.com/sjyun/a4461f3959df82ae713f#file-

uploadservlet-java

• request.getPart 메소드를 이용해서 참조• request.getPart 메소드를 이용해서 Part 객체를 생성

• getInputStream 메소드를 이용해서 파일의 내용을 저장

• 파일의 이름은 Part 객체에서 getHeader 메소드를 사용하면 header 정보를 이용해서 얻을 수 있다 .

Page 24: Servlet3

파일선택 후 업로드

• Part Header = {0}form-data; name="file"; filename=“test.jpg"

• part contentType = image/jpeg• new File oklogo.jpg c:/upload 에

생성되었습니다 .

Page 25: Servlet3

비동기

톰캣 커넥터 유형

  Java Blocking ConnectorBIO

Java Non Blocking ConnectonNIO

APR/native ConnectorAPR

Classname Http11Protocol Http11NioProtocol

Http11AprProtocol

Tomcat version 3.x onwards 6.x onwards 5.5.x onwardsSupport polling No Yes YesPooling size N/A MaxConnections MaxConnectionsRead Http Request

Blocking Non Blocking Blocking

Read Http Body Blocking Sim Blocking BlockingWrite Http response

Blocking sim Blocking Blocking

Wait for next Request

Blocking Non Blocking Non Blocking

SSL Support Java SSL Java SSL Open SSLSSL Handshake Blocking Non blocking BlockingMax Connections Max Connections Max Connections maxConnections

Page 26: Servlet3

comet

• HTTP 프로토콜의 특성상 (stateless) 상태를 지속적으로 유지할 수 없고 연결과 종료를 반복하는 데 comet 이란 이렇게 클라이언트가 보낸 요청에 대해서 서버가 바로 응답과 연결 종료를 반복해서 처리하지 않고 클라이언트가 보낸 요청에 대해서 서버가 대기하고 있다가 해당 요청에 대한 이벤트가 발생하면 응답을 하고 처리하는 방식입니다 . 기존에 HTTP1.1 프로토콜로 설정된 서블릿 컨테이너는 요청에 대해서 대기하지 않고 쓰레드를 생성해서 처리하기 때문에 비동기방식으로 처리하기 위해서는 프로토콜 설정을 NIO 로 변경하여야 한다 .

Page 27: Servlet3

Server.xml 비동기 설정• <connector connectiontimeout="20000"

port="8080" protocol="HTTP/1.1" redirectport="8443"/>

• -->• <!— 변경한 내용• <Connector URIEncoding="UTF-8"

connectionTimeout="20000" port="8080" •

protocol="org.apache.coyote.http11.Http11NioProtocol" redirectPort="8443" useComet="true"/>

• ….. 중략

Page 28: Servlet3

서블릿 비동기 설정

• @WebServlet(name="AsyncServlet", urlPatterns="/async", asyncSupported=true)

• AsyncContext 인터페이스• 비동기 요청을 처리하기 위한 Context 로서 ,

AsyncContext 인터페이스를 이용해서 request 에 대한 timeout 을 지정하거나 처리를 완료했을 때 complete 메소드를 호출할 수 있다 .

Page 29: Servlet3

HttpServletRequest 의 startAsync 메소드

• AsyncContext 를 이용해서 초기화된 Request, response 를 인자로 받아서 비동기요청에 대한 준비를 시작한다 .

Page 30: Servlet3

비동기서블릿 작성https://gist.github.com/sjyun/b329e07ce490ee484d97#file-asyncservlet

기존에 사용했던 WebServlet Annotation 외에 asyncSupported 라는 속성을 추가했다 . 이 속성을 true 로 하면 servlet3.0 을 지원하는 서블릿컨테이너에서 작성한 서블릿 코드는 비동기처리가 가능해진다 .

요청을 대기해야 함으로 서블릿을 먼저 실행시키자 .

Page 31: Servlet3

Client 페이지 작성

• https://gist.github.com/sjyun/847f6089141df4703e96#file-async-client

Page 32: Servlet3

클라이언트 실행

비동기 테스트를 위해서 ..

2 개를 띄우자 .현재내용 하단에 내용이 출력될것이다 .

Page 33: Servlet3

• 끝