서블릿 3.0
With gradle
darkandark90@gmail.com
간단 웹서버를 통한 흐름파악
Sun.net.httpserver 를 통해서 요청에 대한
처리를 알아보자 .
1.웹서버 객체 생성 ( 이때 포트 점유 )
2.컨텍스트 생성
3.핸들러 생성
4.핸들러에서 응답이 정상일 경우
Body data 반환
5. 핸들러에서 응답이 오류일 경우
오류코드 반환
Simple web server
https://gist.github.com/sjyun/cab188a22a755
914ce90#file-simpleserver
// 서버객체 및 핸들러 생성
server.createContext("/home", new
WebserverHandler());
// 응답에 대한 처리
sendResponseHeaders
설정
Build.gradle 전체내용 ->
https://gist.github.com/sjyun/62217adf6891abaca6af
Servlet3.0 의존관계 설정
dependencies{
providedCompile
'javax.servlet:javax.servlet-
api:3.1.0'
}
참조하는 저장소 설정
repositories {
jcenter()
mavenCentral()
}
직접적으로 관련있는 설정은 2 가지이다 .
url 설정
3.0
@WebServlet(“ 컨텍
스트명” )
Web.xml 이 없어도
된다 .
2.5
Context 설정
• @WebServlet(name="HelloServlet",
urlPatterns ={"/hello"} )
귀찮다면
@WebServlet("/hello")
https://gist.github.com/sjyun/f5510ac
f1d7952920f63#file-helloservlet
Init 메소드
• Init 메소드는 말 그대로 한번만 호출된
다 .
• Annotation 을 이용한 Hello 예제를 실
행하면 최초 실행 시 한번만 호출되고
doGet 메소드는 웹 페이지를 호출할 때
마다 호출된다 .
초기 파라미터 전달
• @ 을 이용한 context 생성과 init 메소
드를 알았다면 이제 생성 시에 파라미터
를 전달해보자 .
• initParams 를 사용하면 된다 .
Initparam @webInitParam(key, value)
받을 때는
servletConfig.getInitParameter(“key”);
• https://gist.github.com/sjyun/9a13c8
bb7223d5d3b368#file-initparamservlet
• Context 생성때 @ 사용한 것과 마찬가
지로
초기화파라메터를 전달하고자 할 때
<init-param> 대신 사용할 수 있고 init
메소드에서 servletConfig 를 인자로 해
서
값을 전달 받을 수 있다 .
본문내용 출력
• https://gist.github.com/sjyun/0dd739
aed6134179821a#file-helloservlet2
자바는 IO 에 대해서 스트림을 사용하기 때문에
getOutputStream 을 이용해서 브라우저로 전송하거나
Writer 객체를 얻어서 출력할 수 있다 . 여기에서는
Writer 객체로 출력해보자 .
Writer 객체를 얻기 전에 각 서버 상황에 맞춰서
캐릭터셋을 맞춰준다 .
response.setCharacterEncoding("utf-8");
서블릿 흐름요약
• 서블릿이 메모리에 로드되어 있는지 확인한다 .
• 최초 로딩이라면 메모리에 로딩하고 init() 메소드를 호출한다 .
• 서비스메소드를 호출한다 .
• 결과값을 클라이언트에게 리턴한다 .
• 같은 요청일 경우에는 doGet,doPost 만 수행한다 .
LifeCycle 예제
• https://gist.github.com/sjyun/fd1132
18a5b038f20b9e#file-servletlifecycle
Service 메소드는 doGet
과 doPost 중 호출할 메소
드를 결정하고 destory 메소
드는
컨테이너가 종료되었을 때
호출된다 . 즉 브라우저가
닫혀도 호출되지 않지만
컨테이너인 톰캣이 종료되면
호출된다 .
폼데이터 처리
https://gist.github.com/sj
yun/45142420083dc8514013#f
ile-form-html
요청에 대한 응답처리
Form action 값과 서블릿 @ 의
urlPattern 일치여부 확인
Request.getParameter(“ 필드명” ) //name
속성
HTTP 요청방식 요약
• HTTP 데이터 전송방식에 대한 차이
• Get
• 데이터를 쿼리스트링형식으로 전송
•
• Post
• Application/x-www-form-urlencoded:
• 데이터를 스트림형태로 인코딩하여 전달할 때
사용되는 전송방식
•  
• Multipart/form-data: 파일업로드시 사용되는
전송방식
Multipart 데이터처리
• Upload 요청 jsp 생성
• https://gist.github.com/sjyun/61ff5b947a3455e15ffc#file-
gistfile1-java
Css 사용이유는 텍스트필드와 파일전송용 필드를 UI 적으로
구분하기 위해서이다 .
Upload 경로는 실제로 로컬에 해당 경로를 만들거나
가상디렉토리 설정을 통해서 매핑하면 된다 .
Form 설정에 enctype=”multipart/form-data”
Input type=“file”
MultipatConfig 속성 요약
Annotaion 명 설명
@fileSizeThre
shold
fileUpload 시에 메모리에 저장되는 임시파
일 사이즈 크기를 정의합니다 . [ 자료형 :int]
@location 파일이 업로드되었을 때 저장할 디렉토리를
지정합니다 . [ 자료형 : String ]
@maxFileSize 업로드할 파일의 최대사이즈 크기를 지정합
니다 . [ 자료형 :long ]
@maxReques
tSize
request 시에 최대 사이즈를 지정합니다 .
자료형 [long]
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>
업로드 응답처리 서블릿
• https://gist.github.com/sjyun/a4461f3959df82ae713f#file-
uploadservlet-java
• request.getPart 메소드를 이용해서 참조
• request.getPart 메소드를 이용해서 Part 객체를 생성
• getInputStream 메소드를 이용해서 파일의 내용을 저장
• 파일의 이름은 Part 객체에서 getHeader 메소드를 사용하면
header 정보를 이용해서 얻을 수 있다 .
파일선택 후 업로드
• Part Header = {0}form-data;
name="file"; filename=“test.jpg"
• part contentType = image/jpeg
• new File oklogo.jpg c:/upload 에 생
성되었습니다 .
비동기
톰캣 커넥터 유형
  Java Blocking
Connector
BIO
Java Non Blocking
Connecton
NIO
APR/native
Connector
APR
Classname Http11Protocol Http11NioProtocol Http11AprProtocol
Tomcat version 3.x onwards 6.x onwards 5.5.x onwards
Support polling No Yes Yes
Pooling size N/A MaxConnections MaxConnections
Read Http Request Blocking Non Blocking Blocking
Read Http Body Blocking Sim Blocking Blocking
Write Http response Blocking sim Blocking Blocking
Wait for next Request Blocking Non Blocking Non Blocking
SSL Support Java SSL Java SSL Open SSL
SSL Handshake Blocking Non blocking Blocking
Max Connections Max Connections Max Connections maxConnections
comet
• HTTP 프로토콜의 특성상 (stateless) 상태를
지속적으로 유지할 수 없고 연결과 종료를 반복
하는 데 comet 이란 이렇게 클라이언트가 보낸
요청에 대해서 서버가 바로 응답과 연결 종료를
반복해서 처리하지 않고 클라이언트가 보낸 요
청에 대해서 서버가 대기하고 있다가 해당 요청
에 대한 이벤트가 발생하면 응답을 하고 처리하
는 방식입니다 . 기존에 HTTP1.1 프로토콜로 설
정된 서블릿 컨테이너는 요청에 대해서 대기하
지 않고 쓰레드를 생성해서 처리하기 때문에 비
동기방식으로 처리하기 위해서는 프로토콜 설정
을 NIO 로 변경하여야 한다 .
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.Http11N
ioProtocol" redirectPort="8443"
useComet="true"/>
• ….. 중략
서블릿 비동기 설정
• @WebServlet(name="AsyncServlet",
urlPatterns="/async",
asyncSupported=true)
• AsyncContext 인터페이스
• 비동기 요청을 처리하기 위한 Context 로
서 , AsyncContext 인터페이스를 이용해서
request 에 대한 timeout 을 지정하거나 처
리를 완료했을 때 complete 메소드를 호출
할 수 있다 .
HttpServletRequest 의
startAsync 메소드
• AsyncContext 를 이용해서 초기화된
Request, response 를 인자로 받아서 비
동기요청에 대한 준비를 시작한다 .
비동기서블릿 작성
https://gist.github.com/sjyun/b329e07ce490ee484d97#file-asyncservlet
기존에 사용했던 WebServlet Annotation 외에 asyncSupported 라는 속성을 추가했
다 . 이 속성을 true 로 하면 servlet3.0 을 지원하는 서블릿컨테이너에서 작성한
서블릿 코드는 비동기처리가 가능해진다 .
요청을 대기해야 함으로 서블릿을 먼저 실행시키자 .
Client 페이지 작성
• https://gist.github.com/sjyun/847f60
89141df4703e96#file-async-client
클라이언트 실행
비동기 테스트를 위해서 ..
2 개를 띄우자 .
현재내용 하단에 내용이 출력될것이다 .
• 끝

Servlet3

  • 1.
  • 2.
    간단 웹서버를 통한흐름파악 Sun.net.httpserver 를 통해서 요청에 대한 처리를 알아보자 . 1.웹서버 객체 생성 ( 이때 포트 점유 ) 2.컨텍스트 생성 3.핸들러 생성 4.핸들러에서 응답이 정상일 경우 Body data 반환 5. 핸들러에서 응답이 오류일 경우 오류코드 반환
  • 3.
    Simple web server https://gist.github.com/sjyun/cab188a22a755 914ce90#file-simpleserver //서버객체 및 핸들러 생성 server.createContext("/home", new WebserverHandler()); // 응답에 대한 처리 sendResponseHeaders
  • 4.
    설정 Build.gradle 전체내용 -> https://gist.github.com/sjyun/62217adf6891abaca6af Servlet3.0의존관계 설정 dependencies{ providedCompile 'javax.servlet:javax.servlet- api:3.1.0' } 참조하는 저장소 설정 repositories { jcenter() mavenCentral() } 직접적으로 관련있는 설정은 2 가지이다 .
  • 5.
    url 설정 3.0 @WebServlet(“ 컨텍 스트명”) Web.xml 이 없어도 된다 . 2.5
  • 6.
    Context 설정 • @WebServlet(name="HelloServlet", urlPatterns={"/hello"} ) 귀찮다면 @WebServlet("/hello") https://gist.github.com/sjyun/f5510ac f1d7952920f63#file-helloservlet
  • 8.
    Init 메소드 • Init메소드는 말 그대로 한번만 호출된 다 . • Annotation 을 이용한 Hello 예제를 실 행하면 최초 실행 시 한번만 호출되고 doGet 메소드는 웹 페이지를 호출할 때 마다 호출된다 .
  • 10.
    초기 파라미터 전달 •@ 을 이용한 context 생성과 init 메소 드를 알았다면 이제 생성 시에 파라미터 를 전달해보자 . • initParams 를 사용하면 된다 . Initparam @webInitParam(key, value) 받을 때는 servletConfig.getInitParameter(“key”);
  • 11.
  • 12.
    • Context 생성때@ 사용한 것과 마찬가 지로 초기화파라메터를 전달하고자 할 때 <init-param> 대신 사용할 수 있고 init 메소드에서 servletConfig 를 인자로 해 서 값을 전달 받을 수 있다 .
  • 13.
    본문내용 출력 • https://gist.github.com/sjyun/0dd739 aed6134179821a#file-helloservlet2 자바는IO 에 대해서 스트림을 사용하기 때문에 getOutputStream 을 이용해서 브라우저로 전송하거나 Writer 객체를 얻어서 출력할 수 있다 . 여기에서는 Writer 객체로 출력해보자 . Writer 객체를 얻기 전에 각 서버 상황에 맞춰서 캐릭터셋을 맞춰준다 . response.setCharacterEncoding("utf-8");
  • 14.
    서블릿 흐름요약 • 서블릿이메모리에 로드되어 있는지 확인한다 . • 최초 로딩이라면 메모리에 로딩하고 init() 메소드를 호출한다 . • 서비스메소드를 호출한다 . • 결과값을 클라이언트에게 리턴한다 . • 같은 요청일 경우에는 doGet,doPost 만 수행한다 .
  • 15.
    LifeCycle 예제 • https://gist.github.com/sjyun/fd1132 18a5b038f20b9e#file-servletlifecycle Service메소드는 doGet 과 doPost 중 호출할 메소 드를 결정하고 destory 메소 드는 컨테이너가 종료되었을 때 호출된다 . 즉 브라우저가 닫혀도 호출되지 않지만 컨테이너인 톰캣이 종료되면 호출된다 .
  • 16.
  • 17.
    요청에 대한 응답처리 Formaction 값과 서블릿 @ 의 urlPattern 일치여부 확인 Request.getParameter(“ 필드명” ) //name 속성
  • 18.
    HTTP 요청방식 요약 •HTTP 데이터 전송방식에 대한 차이 • Get • 데이터를 쿼리스트링형식으로 전송 • • Post • Application/x-www-form-urlencoded: • 데이터를 스트림형태로 인코딩하여 전달할 때 사용되는 전송방식 •   • Multipart/form-data: 파일업로드시 사용되는 전송방식
  • 19.
  • 20.
    • Upload 요청jsp 생성 • https://gist.github.com/sjyun/61ff5b947a3455e15ffc#file- gistfile1-java Css 사용이유는 텍스트필드와 파일전송용 필드를 UI 적으로 구분하기 위해서이다 . Upload 경로는 실제로 로컬에 해당 경로를 만들거나 가상디렉토리 설정을 통해서 매핑하면 된다 . Form 설정에 enctype=”multipart/form-data” Input type=“file”
  • 21.
    MultipatConfig 속성 요약 Annotaion명 설명 @fileSizeThre shold fileUpload 시에 메모리에 저장되는 임시파 일 사이즈 크기를 정의합니다 . [ 자료형 :int] @location 파일이 업로드되었을 때 저장할 디렉토리를 지정합니다 . [ 자료형 : String ] @maxFileSize 업로드할 파일의 최대사이즈 크기를 지정합 니다 . [ 자료형 :long ] @maxReques tSize request 시에 최대 사이즈를 지정합니다 . 자료형 [long]
  • 22.
    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>
  • 23.
    업로드 응답처리 서블릿 •https://gist.github.com/sjyun/a4461f3959df82ae713f#file- uploadservlet-java • request.getPart 메소드를 이용해서 참조 • request.getPart 메소드를 이용해서 Part 객체를 생성 • getInputStream 메소드를 이용해서 파일의 내용을 저장 • 파일의 이름은 Part 객체에서 getHeader 메소드를 사용하면 header 정보를 이용해서 얻을 수 있다 .
  • 24.
    파일선택 후 업로드 •Part Header = {0}form-data; name="file"; filename=“test.jpg" • part contentType = image/jpeg • new File oklogo.jpg c:/upload 에 생 성되었습니다 .
  • 25.
    비동기 톰캣 커넥터 유형  Java Blocking Connector BIO Java Non Blocking Connecton NIO APR/native Connector APR Classname Http11Protocol Http11NioProtocol Http11AprProtocol Tomcat version 3.x onwards 6.x onwards 5.5.x onwards Support polling No Yes Yes Pooling size N/A MaxConnections MaxConnections Read Http Request Blocking Non Blocking Blocking Read Http Body Blocking Sim Blocking Blocking Write Http response Blocking sim Blocking Blocking Wait for next Request Blocking Non Blocking Non Blocking SSL Support Java SSL Java SSL Open SSL SSL Handshake Blocking Non blocking Blocking Max Connections Max Connections Max Connections maxConnections
  • 26.
    comet • HTTP 프로토콜의특성상 (stateless) 상태를 지속적으로 유지할 수 없고 연결과 종료를 반복 하는 데 comet 이란 이렇게 클라이언트가 보낸 요청에 대해서 서버가 바로 응답과 연결 종료를 반복해서 처리하지 않고 클라이언트가 보낸 요 청에 대해서 서버가 대기하고 있다가 해당 요청 에 대한 이벤트가 발생하면 응답을 하고 처리하 는 방식입니다 . 기존에 HTTP1.1 프로토콜로 설 정된 서블릿 컨테이너는 요청에 대해서 대기하 지 않고 쓰레드를 생성해서 처리하기 때문에 비 동기방식으로 처리하기 위해서는 프로토콜 설정 을 NIO 로 변경하여야 한다 .
  • 27.
    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.Http11N ioProtocol" redirectPort="8443" useComet="true"/> • ….. 중략
  • 28.
    서블릿 비동기 설정 •@WebServlet(name="AsyncServlet", urlPatterns="/async", asyncSupported=true) • AsyncContext 인터페이스 • 비동기 요청을 처리하기 위한 Context 로 서 , AsyncContext 인터페이스를 이용해서 request 에 대한 timeout 을 지정하거나 처 리를 완료했을 때 complete 메소드를 호출 할 수 있다 .
  • 29.
    HttpServletRequest 의 startAsync 메소드 •AsyncContext 를 이용해서 초기화된 Request, response 를 인자로 받아서 비 동기요청에 대한 준비를 시작한다 .
  • 30.
    비동기서블릿 작성 https://gist.github.com/sjyun/b329e07ce490ee484d97#file-asyncservlet 기존에 사용했던WebServlet Annotation 외에 asyncSupported 라는 속성을 추가했 다 . 이 속성을 true 로 하면 servlet3.0 을 지원하는 서블릿컨테이너에서 작성한 서블릿 코드는 비동기처리가 가능해진다 . 요청을 대기해야 함으로 서블릿을 먼저 실행시키자 .
  • 31.
    Client 페이지 작성 •https://gist.github.com/sjyun/847f60 89141df4703e96#file-async-client
  • 32.
    클라이언트 실행 비동기 테스트를위해서 .. 2 개를 띄우자 . 현재내용 하단에 내용이 출력될것이다 .
  • 33.