Servlet3

894 views

Published on

jsp, servlet3.0, gradle

Published in: Engineering
0 Comments
4 Likes
Statistics
Notes
  • Be the first to comment

No Downloads
Views
Total views
894
On SlideShare
0
From Embeds
0
Number of Embeds
14
Actions
Shares
0
Downloads
10
Comments
0
Likes
4
Embeds 0
No embeds

No notes for slide

Servlet3

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

×