PowerPoint Presentation

Similar documents
04장

14-Servlet

혼자서일을다하는 JSP. 이젠일을 Servlet 과나눠서한다. JSP와서블릿의표현적인차이 - JSP는 <html> 내에서자바를사용할수있는수단을제공한다. - 서블릿은자바내에서 <html> 을작성할수있는수단을제공한다. - JSP나서블릿으로만웹페이지를작성하면자바와다양한코드가

뇌를 자극하는 JSP & Servlet 슬라이드

본 강의에 들어가기 전

<param-value> 파라미터의값 </param-value> </init-param> </servlet> <servlet-mapping> <url-pattern>/ 매핑문자열 </url-pattern> </servlet-mapping> - 위의예에서 ServletC

뇌를 자극하는 JSP & Servlet 슬라이드

2장 변수와 프로시저 작성하기

다른 JSP 페이지호출 forward() 메서드 - 하나의 JSP 페이지실행이끝나고다른 JSP 페이지를호출할때사용한다. 예 ) <% RequestDispatcher dispatcher = request.getrequestdispatcher(" 실행할페이지.jsp");

중간고사

KYO_SCCD.PDF

뇌를 자극하는 JSP & Servlet 슬라이드

PowerPoint Presentation

Data Provisioning Services for mobile clients

서블릿의라이프사이클 뇌를자극하는 JSP & Servlet

Microsoft PowerPoint - aj-lecture1.ppt [호환 모드]

chapter3.doc

API STORE 키발급및 API 사용가이드 Document Information 문서명 : API STORE 언어별 Client 사용가이드작성자 : 작성일 : 업무영역 : 버전 : 1 st Draft. 서브시스템 : 문서번호 : 단계 : Docum

Microsoft PowerPoint - 4강.pptx

Microsoft PowerPoint - aj-lecture8.ppt [호환 모드]

JAVA Bean & Session - Cookie

I T C o t e n s P r o v i d e r h t t p : / / w w w. h a n b i t b o o k. c o. k r

Spring Boot

Microsoft PowerPoint - aj-lecture7.ppt [호환 모드]

Microsoft PowerPoint - 7강.pptx

C# Programming Guide - Types

Microsoft PowerPoint - 웹프로그래밍_ ppt [호환 모드]

Data Provisioning Services for mobile clients

Microsoft PowerPoint - chap02-C프로그램시작하기.pptx

Microsoft PowerPoint - Chap6_cmpl

JavaGeneralProgramming.PDF

Research & Technique Apache Tomcat RCE 취약점 (CVE ) 취약점개요 지난 4월 15일전세계적으로가장많이사용되는웹애플리케이션서버인 Apache Tomcat에서 RCE 취약점이공개되었다. CVE 취약점은 W

J2EE Concepts

PowerPoint Presentation

PowerPoint Presentation

JAVA PROGRAMMING 실습 08.다형성

gnu-lee-oop-kor-lec06-3-chap7

Data Provisioning Services for mobile clients

Microsoft PowerPoint - aj-lecture9.ppt [호환 모드]

<4D F736F F F696E74202D203130C0E52EBFA1B7AF20C3B3B8AE205BC8A3C8AF20B8F0B5E55D>

Microsoft PowerPoint - web-part03-ch20-XMLHttpRequest기본.pptx

슬라이드 1

뇌를 자극하는 JSP & Servlet 슬라이드

JAVA 프로그래밍실습 실습 1) 실습목표 - 메소드개념이해하기 - 매개변수이해하기 - 새메소드만들기 - Math 클래스의기존메소드이용하기 ( ) 문제 - 직사각형모양의땅이있다. 이땅의둘레, 면적과대각

<4D F736F F F696E74202D20C1A63236C0E520BED6C7C3B8B428B0ADC0C729205BC8A3C8AF20B8F0B5E55D>

제11장 프로세스와 쓰레드

<C4FBC1EEB7CE20C1A4B8AEC7D5BDC3B4D95FC1A4B4E42E687770>

PowerPoint Template

작성자 : 김성박\(삼성 SDS 멀티캠퍼스 전임강사\)

JUNIT 실습및발표

<4D F736F F F696E74202D20C1A63038C0E520C5ACB7A1BDBABFCD20B0B4C3BC4928B0ADC0C729205BC8A3C8AF20B8F0B5E55D>

Microsoft PowerPoint 웹 연동 기술.pptx

0. 들어가기 전

Microsoft PowerPoint - aj-lecture3.ppt [호환 모드]

JAVA PROGRAMMING 실습 09. 예외처리

Interstage5 SOAP서비스 설정 가이드

Microsoft PowerPoint - additional01.ppt [호환 모드]

TP_jsp7.PDF

Eclipse 와 Firefox 를이용한 Javascript 개발 발표자 : 문경대 11 년 10 월 26 일수요일

Microsoft PowerPoint - 04-UDP Programming.ppt

JSP 의내장객체 response 객체 - response 객체는 JSP 페이지의실행결과를웹프라우저로돌려줄때사용되는객체이다. - 이객체는주로켄텐츠타입이나문자셋등의데이터의부가정보 ( 헤더정보 ) 나쿠키 ( 다음에설명 ) 등을지정할수있다. - 이객체를사용해서출력의방향을다른

- JPA를사용하는경우의스프링설정파일에다음을기술한다. <bean id="entitymanagerfactory" class="org.springframework.orm.jpa.localentitymanagerfactorybean" p:persistenceunitname=

어댑터뷰

<322EBCF8C8AF28BFACBDC0B9AEC1A6292E687770>

Microsoft Word - src.doc

<C0CCBCBCBFB52DC1A4B4EBBFF82DBCAEBBE7B3EDB9AE2D D382E687770>

<4D F736F F F696E74202D20C1A632C8B8C7D1B1B9BDBAC7C1B8B5BBE7BFEBC0DAB8F0C0D32D496E E D56432E BC8A3C8AF20B8F0B5E55D>

[Brochure] KOR_TunA

TCP/IP Model

A Hierarchical Approach to Interactive Motion Editing for Human-like Figures

뇌를 자극하는 JSP & Servlet 슬라이드

PowerPoint Presentation

슬라이드 1

제이쿼리 (JQuery) 정의 자바스크립트함수를쉽게사용하기위해만든자바스크립트라이브러리. 웹페이지를즉석에서변경하는기능에특화된자바스크립트라이브러리. 사용법 $( 제이쿼리객체 ) 혹은 $( 엘리먼트 ) 참고 ) $() 이기호를제이쿼리래퍼라고한다. 즉, 제이쿼리를호출하는기호

Microsoft PowerPoint - web-part03-ch19-node.js기본.pptx

1. 자바프로그램기초 및개발환경 2 장 & 3 장. 자바개발도구 충남대학교 컴퓨터공학과

쉽게 풀어쓴 C 프로그래밍

뇌를 자극하는 JSP & Servlet 슬라이드

Intro to Servlet, EJB, JSP, WS

WAS 의동작과 WEB, Servlet, JSP 엑셈컨설팅본부 /APM 박종현 웹어플리케이션서버란? 웹어플리케이션서버방식은웹서버가직접어플리케이션프로그램을처리하는것이아니라웹어플리케이션서버에게처리를넘겨주고어플리케이션서버가어플리케이션프로그램을처리한다. 여러명의사용자가동일한페

[ 마이크로프로세서 1] 2 주차 3 차시. 포인터와구조체 2 주차 3 차시포인터와구조체 학습목표 1. C 언어에서가장어려운포인터와구조체를설명할수있다. 2. Call By Value 와 Call By Reference 를구분할수있다. 학습내용 1 : 함수 (Functi

게시판 스팸 실시간 차단 시스템

슬라이드 1

Microsoft PowerPoint - Supplement-03-TCP Programming.ppt [호환 모드]

Secure Programming Lecture1 : Introduction

Microsoft PowerPoint - chap01-C언어개요.pptx

PowerPoint Presentation

2009년 상반기 사업계획

Web Service Computing

PowerPoint 프레젠테이션

Network Programming

Microsoft PowerPoint - Chap12-OOP.ppt

chapter1,2.doc

Microsoft PowerPoint 세션.ppt

q 이장에서다룰내용 1 객체지향프로그래밍의이해 2 객체지향언어 : 자바 2

JVM 메모리구조

<4D F736F F F696E74202D20B5A5C0CCC5CDBAA3C0CCBDBA5F3130C1D6C2F75F31C2F7BDC32E >

JAVA PROGRAMMING 실습 05. 객체의 활용

Microsoft PowerPoint - 03-TCP Programming.ppt

뇌를 자극하는 JSP & Servlet 슬라이드

Transcription:

Servlet & JSP 기초 - 강사김현오

목차 1. Web 기본개념 2. Servlet 3. 세션관리 4. JSP 5. JSTL 6. Servlet 활용기술 7. 웹프로그래밍전략

1. Web 기본개념 1.1 Web 기본개념 HTTP 프로토콜 HTTP Method URL TCP 포트 웹서버 CGI

HTTP 프로토콜 웹에서만사용하는프로토콜 TCP/IP를기반으로하여, TCP/IP를이용해서한지점에서다른지점으로요청과응답을전송 TCP : 한쪽노드에서다른쪽노드로파일을보내기위한프로토콜 IP : 한호스트에서목적지호스트까지패킷을옮기고이동하기위한기반프로토콜 HTTP의구조는 요청 / 응답의끊임없는주고받음 이라고말할수있다. 요청 (request) 의주요구성요소 HTTP 메소드 접근하고자하는페이지 (URL) 폼파라미터 응답 (response) 의주요구성요소 상태코드 ( 요청이성공했는지아닌지등등 ) 컨텐츠타입 ( 텍스트, 그림, HTML 등 ) 컨텐츠 (HTML 코드, 이미지등 ) 요청 응답 클라이언트 서버 3

HTTP Method HTTP Method 는 HTTP 프로토콜을사용하여서버로요청을보내는방법이다. GET - URL 을이용하여자원을요청 POST - Request 에첨부한 Body 정보를서버로전송 HEAD - 헤더정보만요청. 요청한 URL 로부터정보는빼고헤더정보만가져옴 TRACE - 요청한메시지의루프백테스트를요청. 서버에서무엇을받았는지알고싶을때테스트목적으로사용 PUT - Body 정보를요청한 URL 로저장 DELETE - URL 에해당하는자원을삭제 OPTION - 요청한 URL 이응답할수있는 HTTP 메소드가무엇인지요청 4

HTTP GET GET은 HTTP 메소드중가장단순한것, 단순히서버에게자원을요청하는것뿐 (HTML, 이미지, PDF 등등 ) GET의데이터전송방식은브라우저주소란에기입하는 URL 뒤에붙이는방식 GET으로보낼수있는글자수는제한이있음 HTTP 메소드 웹서버상자원에대한경로요청파라미터 GET /select/selectbeertaste.jsp?color=dark&taste=malty Accept:image/webp,*/*;q=0.8 Accept Encoding:gzip,deflate,sdch Accept Language:ko KR,ko;q=0.8,en US;q=0.6,en;q=0.4 요 Cache Control:max age=0 청 Connection:keep alive 헤 Host:sstatic.naver.net 더 If Modified Since:Tue, 12 Oct 2010 09:50:21 GMT If None Match:"218 4926867b4d140" Referer:http://search.naver.com/search.naver?sm=tab_hty.top&where=nexearch&ie=utf8&query=HTTP+%EA%B8%B0%EB%B0%98&x=0&y=0 User Agent:Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/32.0.1700.102 Safari/537.36 5

HTTP POST 서버에좀더복잡한요청을하기위한메소드 요청파라미터에대한길이제한이없음 HTTP 메소드 웹서버상자원에대한경로 POST /advisor/selectbeertaste.do Accept:image/webp,*/*;q=0.8 Accept Encoding:gzip,deflate,sdch Accept Language:ko KR,ko;q=0.8,en US;q=0.6,en;q=0.4 요 Cache Control:max age=0 청 Connection:keep alive 헤 Host:sstatic.naver.net 더 If Modified Since:Tue, 12 Oct 2010 09:50:21 GMT If None Match:"218 4926867b4d140" Referer:http://search.naver.com/search.naver?sm=tab_hty.top&where=nexearch&ie=utf8&query=HTTP+%EA%B8%B0%EB%B0%98&x=0&y=0 User Agent:Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/32.0.1700.102 Safari/537.36 파라 color=dark&taste=malty 미터 6

HTTP Response 서버가클라이언트로보내는응답 헤더와몸체로구성 헤더에는사용된프로토콜이뭔지, 보내준요청이성공했는지, 몸체에포함된컨텐츠의종류는무엇인지등이들어있음 몸체에는 HTML과같은컨텐츠가들어있음 Connection:Keep Alive 응 Content Length:20658 답 Content Type:text/html;charset=UTF 8 헤 Date:Sun, 02 Feb 2014 12:04:19 GMT 더 Keep Alive:timeout=5, max=99 Server:Apache Coyote/1.1 Content-Type 의값을보통 MIME 타입이라고한다. MIME 타입이란브라우저에게화면에보여줄데이터형식을알려주는역할을함 컨텐츠 <html> </html> 7

URL 웹상에있는모든자원에대한주소 http://www.namoosori.com:80/course/java/generic.html http:// : 서버와대화하기위하여사용하는커뮤니케이션프로토콜 www.namoosori.com : 서버주소, 인터넷상에유일한주소 80 : URL 주소의옵션, 보통 80 포트는생략함 /course/java/ : 서버에서자원의위치 generic.html : 요청된컨텐츠이름 8

TCP 포트 서버하드웨어상에서돌아가는소프트웨어를구별하기위한 16비트숫자값 포트로쓸수있는값의범위는 0~65535 포트는서버하드웨어상에서돌아가는특정소프트웨어에대한논리적인연결을나타냄 대개 0번에서 1023번까지 TCP 포트는이미널리알려진서비스를위하여예약되어있음 포트란것이있기때문에서버는클라이언트가지금어느애플리케이션에접속하기를원하는지알수있음 Telnet SMTP FTP 21 23 25 37 Time 서버 80 443 110 HTTP HTTPS POP3 9

웹서버 클라이언트로부터요청을받아요청한것을넘겨주는일을하는것 웹서버는정적인페이지만서비스함 웹서버는단지파일을찾아서있는그대로클라이언트에게넘겨주는일만함 요청한자료를찾지못하면 404 Not Found 메시지를보냄 동적인컨텐츠생성이불가능하다. Apache는유명한오픈소스웹서버 10

CGI CGI(Common Gateway Interface) 는초기웹프로그램개발에사용된개발방식이다. 동적인컨텐츠생성을도와주는도우미애플리케이션 대부분 CGI 프로그램은펄 (Perl) 스크립트로작성한다. 그외 C, 파이썬, PHP 등이있다. CGI 방식의문제점 각각의클라이언트호출에따른개별프로세스를생성한다. 접속자만큼프로세스가생성되므로시스템부하가많이생긴다. 윈도우에서 C언어등으로만들어진 CGI 애플리케이션은리눅스에서사용할수없다. 11

2. Servlet 2.1 Servlet 기본 2.2 Servlet 컨테이너 2.3 Request, Response 2.4 Redirect vs. Request Dispatch Servlet 개념 Servlet 구현

Servlet 소개 정의 서블릿은자바를사용하여웹페이지를동적으로생성하는서버측프로그램을말하며흔히 서블릿 이라한다. 자바를이용하여웹애플리케이션을만들기위해제공되는기술이다. 장점 자바언어를이용해서동적웹애플리케이션을구현할수있다. 자바를사용하기때문에플랫폼에독립적이다. 프로세스기반이아닌스레드기반이기때문에좀더효과적으로멀티태스킹을지원한다. 단점 화면에표현될 HTML 코드를프로그램적으로작성해야한다. 서비스하기전에반드시컴파일을해야한다. 이러한단점을보안하기위해서 JSP가탄생했다. 웹애플리케이션개발시서블릿을사용하면좋은점 컨텐츠와비즈니스로직을분리할수있다. 컨트롤러와뷰역할분담으로인해웹디자이너와개발자간의원활한작업이가능한다. 유지보수가용이하다. 기능확장이용이하다. JSP 페이지에 HTML, CSS, 자바스크립트와자바소스코드가뒤섞이는스파케티소스를막을수있다. 13

Servlet 시작하기 서블릿을개발하고서비스하기위해서는 JVM, 자바서블릿 API, 서블릿컨테이너, 웹서버가필요하다. 자바서블릿 API 서블릿은응답 / 요청모델에서작동하도록디자인되었다. 요청 / 응답모델에서클라이언트는서버에게요청메시지를보내고서버는이에대한응답으로메시지를돌려보낸다. - 서버란, 웹브라우저클라이언트로부터 HTTP 요청을받아들이고, 그 HTTP 요청에응답하는컴퓨터프로그램을말한다. - HTTP 란, WWW 상에서클라이언트와서버사이에서정보를주고받을수있는프로토콜이다. 주로 HTML 문서를주고받을데사용된다. - WWW 란, 인터넷에연결된컴퓨터들을통해사람들이정보를공유할수있는전세계적인정보공간을말한다. 자바서블릿 API 는순수자바로되어있으면서클라이언트로부터 HTTP 요청을받아들이고그요청에응답하는메커니즘을가지고있다. 그러므로서블릿은클라이언트의요청을받아들여영속성을가지는데이터저장소를이어주는중간계층에위치한다. javax.servlet 패키지, javax.servlet.http 패키지 서블릿을생성할경우 javax.servlet.http.httpservlet 상속받게된다. 서블릿컨테이너 서블릿을동작시키기위한실행환경을의미한다. 또한서블릿컨테이너는서블릿을생성, 호출, 소멸하는등의생명주기를관리한다. 서블릿컨테이너는 TCP/IP 연결을생성하고 HTTP 프로토콜을해석하는과정을수행하고있어웹프로그래머들이웹을쉽게구현할수있게지원해준다. 대표적인서블릿컨테이너 ( 웹서버에포함되어있음 ) - 아파치톰캣 (Apach Tomcat) - 제티 (Jetty) - 레진 14

서블릿컨테이너설치 (jetty) 이클립스의플러그인으로 jetty 설치 2 1 15

서블릿컨테이너설정 (jetty) Jetty 서버설정확인 1 3 2 16

서블릿컨테이너실행 (jetty) 웹프로젝트를 jetty 서버에빌드및배포, 서버구동 1 2 3 17

웹프로젝트생성 Dynamic Web Project 생성 18

웹프로젝트설정 Dynamic Web Project 생성 Project Name : 20140123 Context Root : 20140123 Context Directory : WebContent 19

웹프로젝트구조 Dynamic Web Project 생성완료 WebContent 폴더 웹루트폴더 JSP, HTML 등의파일위치 WebContent/WEB INF 폴더 xml, properties 등의설정파일위치 lib 폴더 라이브러리파일위치 서블릿 jar 추가 src 폴더 JAVA 소스파일위치 web.xml 웹프로젝트의 Deployment Descriptor( 배포설명자 ) Servlet, JSP 매핑, 필터등정의 20

Context 에대한이해 하나의 Context( 물리적인디렉토리와개념적인이름 ) 는하나의웹애플리케이션과완벽하게일치하는개념이다. Context : Context Directory 와 Context Path 웹애플리케이션은클라이언트가접근할수있는모든자원 ( 정적또는동적컨텐츠 ) 을 Context 디렉토리아래둔다. Context 디렉토리명은설정이가능하나서버마다달라질수있다. 현재우리는 WebContent 라는물리적인디렉토리가 Context 디렉토리에해당된다. Context Path 는클라이언트가웹애플리케이션으로진입하는시작점으로볼수있다. Context Path 는하나의웹애플리케이션의논리적인이름 ( 경로이름 ) 을의미한다. 이름이없어도상관없다. 클라이언트가웹애플리케이션에접근시, http://localhost:8080/20140123 으로접근한다면 Context Path 는 20140123 이다. 기본적으로서버에접근하기위해서는서버 IP 와포트번호가필요한데, 그뒤에 Context Path 가붙는다. Context Path 는위 Context Directory 와맞닿아있다. 21

서블릿클래스들간의관계 서블릿관련클래스및인터페이스상속관계 <<interface>> <<interface>> <<interface>> <<interface>> javax.servlet javax.servlet javax.servlet java.io ServletContext ServletConfig Servlet Serializable <<interface>> ServletRequest javax.servlet GenricServlet javax.servlet <<interface>> javax.servlet ServletResponse <<interface>> javax.servlet.http HttpServletRequest HttpServlet javax.servlet.http <<interface>> javax.servlet.http HttpServletResponse 22

Generic Servlet 추상클래스 서블릿관리에필요한기능을미리구현하여제공 서블릿을위한어댑터역할 javax.servlet.genericservlet void destroy() java.lang.string getinitparameter(java.lang.string name) java.util.enumeration<java.lang.string> getinitparameternames() ServletConfig getservletconfig() ServletContext getservletcontext() java.lang.string getservletinfo() java.lang.string getservletname() void init() void init(servletconfig config) void log(java.lang.string msg) void log(java.lang.string message, java.lang.throwable t) abstract void service(servletrequest req, ServletResponse res) 23

HTTP Servlet 추상클래스 일반적인서블릿을의미함 Generic Servlet 상속 Service 메서드를 HTTP 프로토콜요청에적합하게재구현 javax.servlet.httpservlet void dodelete(httpservletrequest req, HttpServletResponse resp) void doget(httpservletrequest req, HttpServletResponse resp) void dohead(httpservletrequest req, HttpServletResponse resp) void dooptions(httpservletrequest req, HttpServletResponse resp) void dopost(httpservletrequest req, HttpServletResponse resp) void doput(httpservletrequest req, HttpServletResponse resp) void dotrace(httpservletrequest req, HttpServletResponse resp) long getlastmodified(httpservletrequest req) void service(httpservletrequest req, HttpServletResponse resp) void service(servletrequest req, ServletResponse res) 24

Servlet 생성 import javax.servlet.*; import javax.servlet.http.*; import java.io.*; // 서블릿중 99% 는 HttpServlet 를상속한다. public class ch2servlet extends HttpServlet { } // 실제프로젝트에서는서블릿중 99% 는 doget() 과 dopost() 메소드만재정의한다. @Override // 컨테이너가생성한 Request와 Response 객체참조를넘겨받는곳 protected void doget(httpservletrequest request, HttpServletResponse response) throws ServletException, IOException { PrintWriter writer = response.getwriter(); writer.append("<html><body>"); writer.append("<h2>ch2servlet doget</h2>"); writer.append("</body></html>"); } 25

배포서술자 (Deployment Descriptor) web.xml 서블릿과 JSP 를어떻게실행하느냐에관한많은정보들이들어감. <?xml version="1.0" encoding="utf-8"?> <web-app xmlns:xsi="http://www.w3.org/2001/xmlschema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" xsi:schemalocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd" id="webapp_id" version="3.0"> <display-name>my-servlet</display-name> <! <servlet> 항목들을보면이컨테이너가관리하는웹애플리케이션에는어떤것들이있는지알수있다. --> <servlet> <servlet-name>helloservlet</servlet-name> <servlet-class>com.kosta.web.helloservlet</servlet-class> </servlet> <!-- 런타임시요청이들어오면컨테이너는 <servlet-mapping> 항목을검색한다. --> <servlet-mapping> <servlet-name>helloservlet</servlet-name> <url-pattern>/helloservlet</url-pattern> </servlet-mapping> </web-app> 26

2. Servlet 2.1 Servlet 기본 2.2 Servlet 컨테이너 2.3 Request, Response 2.4 Redirect vs. Request Dispatch Servlet 요청처리프로세스 Servlet 컨테이너역할 Servlet 라이프사이클 HTTP 메서드종류

Servlet 요청처리프로세스 클라이언트 ( 브라우저 ) 가 HTTP 요청 웹서버는해당요청을받아들임 (GET / POST) 웹서버는요청을컨테이너에게전달 컨테이너는 HTTP Request, HTTP Response 객체를만들어서블릿 dopost() 나 doget() 메소드중하나를호출 서블릿은요청에대한처리 요청결과 ( 응답 ) 는서블릿 > 컨테이너 > 웹서버 > 클라이언트 ( 브라우저 ) 에게전달됨 Server 컨테이너 응답응답 요청 클라이언트 ( 브라우저 ) 요청 응답 웹서버 요청 응답 JSP 요청 Servlet 28

Servlet 컨테이너가주는이점 웹서버와서블릿의커뮤니케이션지원 개발자가소캣생성, 포트리스닝등복잡한부분을직접구현할필요없음 라이프사이클관리 서블릿클래스의생성, 초기화, 호출, 소멸을관리함 개발자가직접생성하고초기화할필요가없음 멀티스레딩지원 요청이들어올때마다새로운스레드를생성하여처리 다중요청에대한스레드생성및운영에대해서관리 선언적인보안관리 보안에관련된내용을서블릿내부에하드코딩할필요없음 XML 설정을통해컨테이너가보안관리하도록함 JSP 지원 29

Servlet 컨테이너 서블릿이요청되면컨테이너는 HttpServletRequest, HttpServletResponse 객체생성 요청을처리할해당서블릿스레드를생성하여 Request, Response 객체를전달 컨테이너는서블릿의 service() 호출 요청방식에따라 doget() 또는 dopost () 호출 처리가끝나면컨테이너는 Response객체를 HttpResponse로전환하여클라이언트로전송 마지막으로서블릿스레드와 Request, Respose 객체는소멸 Server 컨테이너 컨테이너 클라이언트 ( 브라우저 ) 요청 응답 웹서버 요청 응답 응답응답 JSP Servlet 요청 요청 요청 request Servlet init() 응답 response response Servlet service() doget() dopost() 30

Servlet 라이프사이클 (1/2) 컨테이터에의해서호출되고소멸되는서블릿의라이프사이클 컨테이너서블릿클래스서블릿객체 클래스로딩 서블릿인스턴스 ( 생성자실행 ) 기본생성자실행생성자를오버로딩하지않도록한다. init() service() destory() 최초한번초기화시호출된다. 클라이언트의요청을핸들링한다. 요청마다새로운스레드에서실행된다. 서블릿이죽기전에가지고있는자원들을깨끗이정리한다. init() 처럼한번만호출된다. 31

Servlet 라이프사이클 (2/2) 주요메서드 init() 컨테이너가서블릿인스턴스를생성한후호출 클라이언트의요청을처리하기전서블릿을초기화하는기능 필요한경우재정의가능 ( 예 : 데이터베이스접속 ) init() 메서드가호출되는시점은서버마다다르게동작할수있다. 서버가구동하기시점일수도있고서블릿이최초에호출되는시점일수도있다. service() 컨테이너가클라이언트요청에대한서블릿인스턴스를생성 / 초기화한후호출 init() 메소드이후에호출됨 요청의 HTTP 메소드 (GET/POST 등 ) 를참조하여 doget() 또는 dopost() 를호출하는기능 재정의하지않음 ( 상속받은상위클래스의 service() 메소드를그대로사용 ) doget() / dopost() service() 메소드에의해서호출됨 요청을처리하기위한로직을구현 반드시재정의해서사용 destory() 요청처리가끝나면컨테이너가호출 재정의하지않음 32

HttpServlet 의메소드와 HTTP 메소드 HttpServlet Class Method HTTP Method void doget(httpservletrequest, HttpServletResponse ) GET void dopost(httpservletrequest, HttpServletResponse ) POST void doput(httpservletrequest, HttpServletResponse ) PUT void dodelete(httpservletrequest, HttpServletResponse ) DELETE 33

2. Servlet 2.1 Servlet 기본 2.2 Servlet 컨테이너 2.3 Request, Response 2.4 Redirect vs. Request Dispatch HttpServletRequest HttpServletResponse ContentType

HttpServletRequest Servlet 에서는 HttpServletRequest 객체로부터다양한요청정보를처리한다. 다음은 HttpServletRequest 인터페이스의메서드이다. request.getheader() : 요청정보의헤더정보를반환한다. request.getmethod() : 요청정보의 HTTP Method 정보를반환한다. request.getparameter() : 요청시정보의이름으로요청값을반환한다. request.getparametervalues() : 요청시같은정보의이름으로요청값들을배열로반환한다. requet.setcharacterencoding() : 요청정보의인코딩을설정한다. <<interface>> ServletRequest <<interface>> HttpServletRequest 이외에도다양한메서드가있으므로 Servlet API 를살펴본다. http://tomcat.apache.org/tomcat 5.5 doc/servletapi/ 35

HttpServletResponse Servlet 에서는 HttpServletResponse 객체로부터다양한응답정보를처리한다. 다음은 HttpServletResponse 인터페이스의메서드이다. <<interface>> response.setcontenttype() : 클라이언트로보내는컨텐츠타입을설정한다. response.getwriter() : PrintWriter 객체를반환하여클라이언트에게전달할텍스트데이터를작성한다. ServletResponse response.getoutputstream() : ServletOutputStream 객체를반환하여클라이언트에게전달할바이너리데이터를작성한다 response.setstatus() : 응답에대한상태코드를지정한다. 이외에도다양한메서드가있으므로 Servlet API 를살펴본다. http://tomcat.apache.org/tomcat 5.5 doc/servletapi/ <<interface>> HttpServletResponse 36

ContentType ContentType 은 HTTP 응답에반드시포함되어야하는헤더정보 브라우저에게지금반환하는데이터가무엇인지를미리알려줌 PDF : PDF 보기프로그램을내부적으로실행 VIDEO : 비디오플레이어를실행 파일다운로드를위해바이트정보저장 setcontenttype() 메소드를이용해 ContentType 을설정한후출력스트림에데이터기록 일반적인 MIME TYPE text/html application/pdf video/quicktime application/java image/jpeg application/jar application/octet stream application/x zip 37

Servlet 응답정보에저장된정보조회하여출력하기 CourseServlet.java public class CourseServlet extends HttpServlet { @Override protected void doget(httpservletrequest req, HttpServletResponse resp) throws ServletException, IOException { PrintWriter writer = resp.getwriter(); writer.append("<html><body>"); writer.append("<h2>courseservlet doget</h2>"); EducationProcess process = new EducationProcessImpl(); CourseDto coursedto = process.getcoursebyname(" 청년취업과정 "); int courseid = coursedto.getcourseid(); writer.append(string.format("<h3>%s, %s<h3>", courseid, coursedto.getname())); for (SubjectDto subjectdto : coursedto.getsubjects()) { writer.append(string.format("<p>%s, %s<p>", subjectdto.getsubjectid(), subjectdto.getname())); } } writer.append("</body></html>"); writer.close(); } 38

Servlet 요청정보로저장된정보조회하여출력하기 CourseServlet.java public class CourseServlet extends HttpServlet { @Override protected void doget(httpservletrequest req, HttpServletResponse resp) throws ServletException, IOException { PrintWriter writer = resp.getwriter(); writer.append("<html><body>"); writer.append("<h2>courseservlet doget</h2>"); } } String name = req.getparameter("name"); EducationProcess process = new EducationProcessImpl(); CourseDto coursedto = process.getcoursebyname(name); int courseid = coursedto.getcourseid(); writer.append(string.format("<h3>%s, %s<h3>", courseid, coursedto.getname())); for (SubjectDto subjectdto : coursedto.getsubjects()) { writer.append(string.format("<p>%s, %s<p>", subjectdto.getsubjectid(), subjectdto.getname())); } writer.append("</body></html>"); writer.close(); 39

2. Servlet 2.1 Servlet 기본 2.2 Servlet 컨테이너 2.3 Request, Response 2.4 Redirect vs. Request Dispatch Redirect 와 Request Dispatch Redirect Request Dispatch

Redirect vs. RequestDispatch 사용자의요청을다른 URL 에서처리하도록방향을바꿀수있음 사용자의요청을다른컴포넌트 ( 대부분 JSP) 에게처리하도록방향을바꿀수있음 Redirect 요청을받은서블릿은해당요청이다른 URL 에서처리해야할대상이라면 Response 객체의 sendredirect() 호출 HTTP Response 에는상태코드 302, Location 헤더에새로운 URL 정보를포함 브라우저는응답을받은후상태코드 (302) 를확인하고 Location 헤더에설정된 URL 로새로운요청 사용자도브라우저에변경된 URL 을확인할수있음 Request Dispatch 요청을다른방향으로위임하는작업이서버에서일어남 요청을받은서블릿은해당요청이다른컴포넌트 (JSP) 가처리해야할대상이라면 dispatch forward 호출 브라우저의 URL 은바뀌지않기때문에사용자는 Dispatch 된응답인지를알수없음 41

Redirect 사용자는 /user 로요청을했지만브라우저의응답은 /member 로변경됨 브라우저의 URL 이변경되어있음을확인 UserServlet MemberServlet 42

RequestDispatch 사용자는 /user 로요청을했지만응답은 MemberServlet 의응답 브라우저의 URL 은변경되지않음 UserServlet MemberServlet 43

3. 세션관리 3.1 세션개요 3.2 세션관리 3.3 쿠키 Session 개요

Session 개요 세션은다중요청간대화정보를유지하기위한방법이다. 클라이언트가제일처음요청을보낼때, 컨테이너는클라이언트의유일한세션 ID 를생성한다. 클라이언트접속시세션 ID 로서로다른클라이언트를구분한다. 서블릿컨테이너 사용자 A 요청 응답 Servlet A 새로운스레드생성 HttpSession A 똑같은클라이언트똑같은서블릿서로다른요청서로다른스레드똑같은세션 사용자 B 요청 새로운스레드생성 스레드 A 스레드 B HttpSession B 서로다른클라이언트똑같은서블릿서로다른요청서로다른스레드서로다른세션 45

3. 세션관리 3.1 세션개요 3.2 세션관리 3.3 쿠키 HttpSession 사용방법 Session 제거 Session 타임아웃설정

HttpSession 사용방법 (1/3) Response 객체에세션쿠키보내기 HttpSession session = request.getsession(); //Request 로부터세션을리턴받는다. Request 객체로부터세션 ID 가져오기 HttpSession session = request.getsession(); // 보내메서드와동일함 isnew() : 세션이새로만들어졌는지알수있는메소드 HttpSession session = request.getsession(); // 보내메서드와동일함 if(session.isnew()) { out.println( This is a new session. ); } else { out.println( Welcome back ); } 47

HttpSession 사용방법 (2/3) request.getsession(false); 이미만들어져있는세션을원할때 HttpSession session = request.getsession(false); //false 를넘기는이유는존재하는세션을리턴하라는의미 response.encodeurl 클라이언트가브라우저설정을통해쿠키를사용하지않을때쿠키사용방법 URL 재작성방법 : 세션 ID 정보를모든 URL 뒤에추가하는방법이다. response.setcontenttype( text/html ); PrintWriter out = response.getwriter(); HttpSession session = request.getwriter(); HttpSession session = request.getsession(); // 세션을리턴받음 out.println( <html><body> ); out.println( <a href= + response.encodeurl( /BeerTest.do ) + >click me</a> ); //URL 뒤에세션 ID 를추가함 out.println( </body></html> ); // 최초컨테이너가개발자가코딩한 getsession() 부분을만나면, 클라이언트의 Request 에서세션 ID 를읽지않는다. // 컨테이너는클라이언트쿠키가이용가능한지아닌지모르기때문에첫번째응답은쿠키와 URL 재작성을동시에사용한다. 48

HttpSession 사용방법 (3/3) response.encoderedirecturl 들어온요청을다른서블릿이나 JSP 로세션을유지하며요청하고싶을때사용한다. response.encoderedirecturl( /BeerTest.do ); 49

Session 제거 HttpSession 주요메서드 Method 설명비고 getcreationtime() 세션이생성된시간을리턴 세션이얼마나오래되었는지알고싶을때, 특정시간만 세션을사용하도록제한하는데사용 ( 예로그인한후 10분 간만사용하도록하겠다. ) getlastaccessedtime() 이세션으로들어온마지막요청시간 클라이언트가언제마지막으로세션에접근했는지알고싶 을때. setmaxinactiveinterval() getmaxinactiveinterval() invalidate() 해당세션에대한요청과요청간의최대허용시간 ( 초단위 ) 을지정 해당세션에대한요청과요청간의최대허용시간 ( 초단위 ) 을리턴 세션을종료. 이작업에는현재세션에저장된모든세션속성을제거하는 (unbind) 작업이포함 클라이언트의요청이정해진시간이지나도들어오지않을경우, 해당세션을제거하기위하여사용함. 세션이얼마나오랫동안비활성화상태였는지, 여전히살아있기는한지알고싶을대. 세션이 invalidate() 되기까지시간이얼마나남았는지알기위하여사용 클라이언트가비활성화이거나, 세션작업이완료되어강제로세션을종료할. invalidate() 는세션 ID 가더이상존재하지않으니, 관련속성을세션객체에서제거하라는의미 세션이종료되는세가지이유 설정된시간이다되어서 ( 타임아웃 ) 개발자가세션객체에 invalidate() 메소드를실행하는경우. 애플리케이션이다운되는경우 ( 문제가생겨다운되거나, 언디플로이되는경우 ) 50

Session 타임아웃설정 web.xml 에설정 : 생성되는모든세션에 setmaxinactiveinterval() 메소드를호출하는것과도같다. <web app > <servlet> </servlet> <session config> <session timeout>15</session timeout> //15 는분을의미한다. </session config> </web app> 특정세션만타임아웃설정하기 특정세션인스턴스만세션타임아웃값을변경할수있다.( 다른세션의타임아웃값은바뀌지않는다.) session.setmaxinactiveinterval(20*60); // 메소드의인자는초단위시간임. 51

3. 세션관리 3.1 세션개요 3.2 세션관리 3.3 쿠키 Cookie 란? 쿠키관련서블릿 API

Cookie 란? 원래쿠키는세션을지원하기위하여고안된것이지만다른목적으로사용해도무방함 서버와클라이언트간에교환하는조그마한데이터 ( 이름 / 값의 String쌍 ) 서버는클라이언트로쿠키를보내고, 이후클라이언트는매번요청에이값을전송함 쿠키는기본적으로세션과생존범위가같다. 그러나계속유지할수도있다. 53

Cookie 관련서블릿 API Cookie 객체생성 Cookie cookie = new Cookie( username, name); 쿠키가클라이언트에얼마나오랫동안살아있을지설정 cookie.setmaxage(30*60); // 1 을설정하면쿠키는브라우저가빠져나가는대로쿠키를지운다. 쿠키를클라이언트로보낼때 response.addcookie(cookie); 클라이언트 Request 에서쿠키를읽어올때 Cookie[] cookies = request.getcookies(); for(cookie cookie : cookies) [ cookie.getname(); cookie.getvalue(); } 54

4. JSP 4.1 JSP 기본 4.2 JSP 태그 4.3 JSP 동작원리 JSP 개요 JSP 지시자

JSP(JavaServer Pages) 개요 (1/2) JSP 는 HTML 내에자바코드를삽입하여웹서버에서동적으로웹페이지를생성하여클라이언트에전달하는언어이다. 확장자는.jsp 이며 HTML 코드와자바코드가함께존재한다. Servlet 과 JSP 비교 Servlet 은 Java 소스에 HTML 코드가삽입된다. JSP 는반대로 HTML 코드에 Java 코드가삽입된다. Servlet class 는컴파일과 web.xml 에서블릿을등록하는과정이필요하지하지만 JSP 는필요없다. 서블릿은 JSP 로대체될수있고, JSP 는서블릿으로대체될수있다. JSP 장점 Java 코드에 HTML 이삽입되는 Servlet 단점을해결한다. HTML 과 CSS 작업시웹디자이너들이작업하기가수월하여유지보수에용이하다. 간단한로직을구현할때는 JSP 가더간편하다. JSP 단점 하지만복잡한로직을구현할때에 HTML 중심의코드가이해하기어렵게만들수있고, 프로그래밍언어를모르는사람이실수로중요한코드를건들우려도있다. 그리고힘들게개발한로직의유출을막기위해서도 Servlet 기술이필요하게된다. 대안 그래서요즘은 JSP 기술과 Servlet 기술을혼용한새로운프로그래밍방법이권장되고있다. 프로그램의기능을구현하는복잡한로직은서블릿클래스안에기술하고, 그결과를가져다가출력하는일만 JSP 페이지가담당하도록만드는방법이다. ( 모델 2 방식 ) 56

JSP(JavaServer Pages) 개요 (2/2) 기본 JSP 소스코드와브라우저화면 57

JSP 지시자 JSP가서블릿이되기위해필요한중요정보를지시자 (<%@ %>) 를통해제공 page 지시자 페이지관련환경정의 character encoding, content type 등의속성을정의 <%@ page import= kr.kosta.* contenttype= text/html %> taglib 지시자 <%@ taglib tagdir= /WEB INF/tags/cool prefix= cool %> JSP 페이지에서사용할태그라이브러리정의 <%@ taglib tagdir= /WEB INF/tags/cool prefix= cool %> include 지시자 현재 JSP 페이지에포함될코드나문서를정의 페이지의 Header, Tail, Navigation 등을별로도정의하여 include 할수있다. <%@ include file= header.html %> 58

page 지시자 import 생성될서블릿클래스에추가될자바 import 문을정의 java.lang, javax.servlet, javax.servlet.http 는기본적으로 import 됨 contenttype MIME 타입과캐릭터셋설정 JSP 파일출력시문자코드및 Content Type 헤더에출력할문자코드명을지정 language 스크립틀릿, 표현식, 선언문에사용할스크립팅언어정의 pageencoding JSP 문자인코딩정의 JSP 파일작성시의문자코드를지정 autoflush 응답을저장한버퍼를자동적으로비울것인지여부를설정 true 인경우버퍼가다채워졌거나응답을처리하는서블릿메소드가종료되면 flush 됨 59

include 지시자 include 지시자는지정한파일을 JSP 파일에삽입한다. <%@ include file= header.jsp %> include 된파일들은내용이그대로복사되어포함되고이에대한서블릿코드는하나만생성된다. 중첩하여사용할수있다. (header.jsp 내부에서또다른파일 include 가능 ) 주의사항 : contenttype 속성이두번선언되지않도록주의한다. 예 ) 메인페이지와 include 된페이지모두 contenttype 속성을정의하면오류발생 60

taglib 지시자 태그라이브러리란기본적인 JSP 내장기능을확장하기위한커스텀태그들의집합이다. taglib 지시자를이용하여 core Tag 를추가한예 uri <%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %> 태그라이브러리의태그와속성을담고있는 TLD(Tag Library Descriptor) 파일 (.tld) 이존재하는 URI 지정 prefix 사용할커스텀태그들의네임스페이스지정 TLD 파일은 JSP 페이지에서사용중인커스텀태그가유효한것인지를검증하는데사용하는 XML 61

4. JSP 4.1 JSP 기본 4.2 JSP 태그 4.3 JSP 동작원리 스크립틀릿 (scriptlets) 표현식 (expressions) 선언문 (declarations) 주석 (comment)

스크립틀릿 (scriptlets) (1/3) JSP 페이지에자바코드를삽입하기위해사용한다. 63

스크립틀릿 (scriptlets) (2/3) Counter 클래스를인식하지못하는경우오류가발생한다. 해결방안 방법 #1. Counter 클래스의패키지명시 방법 #2. page 지시자사용하여 import 64

스크립틀릿 (scriptlets) (3/3) kr.kosta.util.counter 와같이사용하는클래스의패키지명까지명시 JSP 내에서사용하는클래스가많아질경우복잡해질수있음 65

지시자 (1/2) page 지시자 (<%@) 의 import 속성을사용하여특정패키지또는클래스를 import 할수있다. 컨테이너는 JSP 페이지를자바코드로변환할때지시자를참고한다. 패키지하나만 import 할경우 <%@ page import= kr.kosta.util.* %> 여러개의패키지를 import 할경우 ( 쉼표로구분 ) <%@ page import= kr.kosta.util.*, java.util.* %> 66

지시자 (2/2) page 지시자 페이지관련환경을정의함. 문자인코딩, 응답페이지컨텐츠타입, 페이지가내장세션객체를가질것인지여부등 <%@ page import= kr.kosta.util.* session= false %> taglib 지시자 JSP 에서이용가능한태그라이브러리를정의한다. <%@ taglib tagdir= /WEB INF/tags/cool prefix= cool %> include 지시자 변환시점에현재페이지에포함할코드나문서를정의함. 여러 JSP 페이지에공통으로포함되어야하는코드가있다면, 별도로뽑아내어재사용가능한단위로만든후각각의페이지에서이를포함한다. <%@ include file= wickedheader.html %> 67

page 지시자속성 page지시자의 13가지속성 속성 설명 import 생성될서블릿클래스에추가될자바 import문을정의함. isthreadsafe 생성될서블릿클래스가 SingleThreadModel 을구현할지결정함. 디폴트값은 true 주요속성 contenttype MIME 타입과문자인코딩을설정. iselignored 페이지를서블릿으로전환할때 EL 표현식을무시할것인지를결정. iserrorpage 현재페이지가 JSP 오류처리용페이지인지를정의함. 디폴트값은 false. true 면내장예외사항객체를사용할수있음 errorpage 이페이지에서잡지못한예외사항을보낼오류페이지 URL 을정의함. true 라는속성이설정되어야한다. language extends session autoflush info buffer 스크립팅언어를정의. 현재는 java가유일. 확장성을위해만들어놓은것으로추정 JSP가상속할부모클래스를정의함. 이값을설정하면, 컨테이너가제공하는클래스계층구조를재정의함내장 session 객체를가질지여부를결정함. 디폴트값은 true 자동적으로버퍼링된출력을비울것인지를결정함. 디폴트값은 true 변환될페이지에포함할 String 값을기술함. 이값은나중에 getservletinfo() 메소드로접근가능내장 out 객체버퍼링을어떻게관리할지결정 pageencoding JSP 문자인코딩을정의함. 68

표현식 (expressions) JSP 페이지내에서직접클라이언트에출력할내용을포함할수있다. <%= Counter.getCount() %> 표현식의내용은 out.print() 의매개변수가된다. 문장의마지막에세미콜론 (;) 은붙이지않음 리턴타입이 void 일경우표현식을사용할수없음 표현식코드 <%= Counter.getCount() %> 스크립틀릿코드 컨테이너에의해아래와같이변경된다. <% out.print(counter.getcount()); %> 69

JSP 선언문 (declarations) 변수선언문 <% int count=0; %> <Servlet code> public class basiccounter_jsp extends SomeSpecialHttpServlet { int count=0; } public void _jspservice(httpservletrequest request, HttpServletResponse response) throws java.io.ioexception { PrintWriter out = response.getwriter(); } 메소드선언문 <% int doublecount() { count = count*2; return count; } %> <Servlet code> public class basiccounter_jsp extends SomeSpecialHttpServlet { int doublecount() { count = count*2; return count; } public void _jspservice(httpservletrequest request, HttpServletResponse response) throws java.io.ioexception { PrintWriter out = response.getwriter(); } } 70

주석처리 HTML 주석 < Comment > 이주석의내용을브라우저로표시함 브라우저는 HTML 주석으로인지 사용자가 [ 소스보기 ] 를통해확인할수있음 JSP 주석 <% Comment > 서블릿으로변환될때자바소스코드주석으로변환 사용자가 [ 소스보기 ] 를통해확인할수없음 71

4. JSP 4.1 JSP 기본 4.2 JSP 태그 4.3 JSP 동작원리 Servlet 으로변환되는 JSP JSP 라이프사이클 영역객체와속성

Servlet 으로변환되는 JSP (1/6) JSP 는컨테이너에의하여웹애플리케이션에서동작하는서블릿으로변환된다. 이러한변환과컴파일은최초요청시딱한번만처리된다. 대부분의컨테이너는컨테이너가구동될때미리처리할수있는옵션을제공한다. hello.jsp hello_jsp.java hello_jsp.class hello_jsp Servlet JSP 파일을컨테이너가서블릿소스코드 (.java) 로변환 컴파일 로딩및초기화됨 73

서블릿으로변환되는 JSP (2/6) JSP 가컨테이너에의해서서블릿으로변환된모습 모든스크립틀릿코드와표현식코드는 service() 메소드안으로들어감 스크립틀릿안에선언된변수는모두지역변수 public class visitcount_jsp extends HttpServlet { public void _jspservice(httpservletrequest request, HttpServletResponse response) throws java.io.ioexception, ServletException{ <HTML><BODY> 방문횟수 : <%= Counter.getCount() %> </BODY></HTML> PrinterWriter out = response.getwriter(); response.setcontenttype( text/html ); out.write( <HTML><BODY> ); out.write( 방문횟수 : ); out.print(counter.getcount()); out.write( </BODY></HTML> ); } } 74

서블릿으로변환되는 JSP (3/6) 선언문으로정의된변수와메소드 <HTML><BODY> <%! int doublecount() { count = count * 2; return count; } %> <%! int count = 1; %> 방문횟수 : <%= Counter.getCount() %> </BODY></HTML> public class visitcount_jsp extends HttpServlet { int doublecount() { count = count * 2; return count; } int count = 1; public void _jspservice(httpservletrequest request, HttpServletResponse response) throws java.io.ioexception, ServletException{ PrinterWriter out = response.getwriter(); response.setcontenttype( text/html ); out.write( <HTML><BODY> ); out.write( 방문횟수 : ); out.print(counter.getcount()); out.write( </BODY></HTML> ); } } 75

서블릿으로변환되는 JSP (4/6) 컨테이너가 JSP 를 Servlet 으로변환하는과정 지시자가있는지확인하고변환작업시필요한정보를로딩 HttpServlet 의하위클래스생성 ( 예 : org.apache.jasper.runtime.httpjspbase) import 속성을가진 page 지시자가있으면클래스파일에 import 문삽입 선언문 (declarations) 이있으면멤버변수선언위치에삽입 service() 메소드생성 실제이름은 _jspservice() ( 서블릿의부모클래스에정의된 service() 메소드에서 _jspservice() 를호출 ) 템플릿텍스트 (HTML, 스크립틀릿, 표현식 ) 를 Response 객체의출력스트림인 PrinterWriter 의출력형식에맞게삽입 76

서블릿으로변환되는 JSP (5/6) _jspservice() 에선언된내장객체 컨테이너가 _jspservice() 를생성하면서 JSP 에작성된코드외에내장객체를자동으로선언하고초기화 내장객체변수명 request response pagecontext 내장객체의타입 javax.servlet.servletrequest (javax.servlet.http.httpservletrequest) javax.servlet.servletresponse (javax.servlet.http.httpservletresponse) javax.servlet.jsp.pagecontext 설명 클라이언트의 HTTP 요청을담는객체요청에대한응답객체페이지실행에필요한컨텍스트정보를담는객체 session application out javax.servlet.http.httpsession javax.servlet.servletcontext javax.servlet.jsp.jspwriter 클라이언트세션정보를담는객체 동일한어플리케이션컨텍스트의모든페이지가공유할데이터를담는객체 응답전송을위한출력스트림 config javax.servlet.servletconfig 해당페이지서블릿설정데이터 ( 초기화정보 ) 를담는객체 page javax.servlet.jsp.httpjsppage 해당페이지서블릿인스턴스 exception java.lang.throwable 서블릿실행시발생한예외중처리하지못한객체 77

서블릿으로변환되는 JSP (6/6) JSP 가변환된서블릿에는몇가지주요 API 가구현되어있다. jspinit() 서블릿의 init() 메소드에서호출 JSP 에서선언문을통해재정의할수있다. jspdestory() 서블릿의 destory() 메소드에서호출 JSP 에서선언문을통해재정의할수있다. _jspservice() 서블릿의 service() 메소드에서호출 각요청마다새로운스레드로실행됨 재정의할수없다. 78

JSP 라이프사이클 (1/2) 웹애플리케이션배포 웹컨테이너는배포된애플리케이션의 DD(web.xml) 파일을로딩 이단계에서 JSP 는아무일도하지않고서버에그대로존재함 사용자가 JSP 요청 컨테이너는요청에해당하는 JSP 를.java 파일로변환 JSP 문법에오류가있다면이시점에오류발생 변환된 Java 파일컴파일 앞단계에서변환된.java 파일을.class 로컴파일 Java 문법에오류가있다면이시점에오류발생 서블릿로딩 컨테이너가앞단계에서컴파일된서블릿클래스 (.class) 를메모리로로딩 서블릿인스턴스화 컨테이너가로딩한서블릿을인스턴스화 jspinit() 메소드호출 인스턴스화된객체는클라이언트요청을처리할수있는서블릿이됨 79

JSP 라이프사이클 (2/2) 스레드생성하여요청처리 요청이들어올때마다컨테이너는새로운스레드를만들어 _jspservice() 메소드실행 다음요청부터는앞의컴파일과정은생략하고일반서블릿과같이동작 클라이언트로처리결과응답 클라이언트또는다른웹어플리케이션컴포넌트로요청을넘길수도있음 80

JSP 실행과정 JSP 페이지실행과정 JSP 페이지라이프사이클 클라이언트요청 jspinit() 클래스파일? No Yes 서블릿으로변환 _jspservice() 클라이언트요청에의해쓰레드가생성되어실행 컴파일 메모리로드? No Yes 메모리로드 jspdestroy() 클라이언트요청처리 81

JSP 실행과정 JSP 페이지는서블릿으로변환되어실행된다. 서블릿으로변환하는것은컨테이너의역할이다. JSP 변환 JAVA 컴파일 바이트 코드 로드 / 초기화 서블릿 객체 hello.jsp hello_jsp.java hello_jsp.class hello_jsp Servlet public class hello_jsp extends HttpServlet { public void _jspservice(httpservletrequest request, HttpServletResponse response) throws java.io.ioexception, ServletException { PrintWriter out = response.getwriter(); response.setcontenttype("text/html;charset=ksc5601"); out.write("<html><head><title>hello JSP</title></head><body>"); out.println(" 이줄은자바프로그램에서 "); out.println(" 만들어내는내용입니다."); out.write("<hr>"); out.write(" 이곳은 HTML 부분입니다."); out.write("</body></html>"); } } 82 82

JSP 내장속성 (1/2) 내장객체 session, request, application 객체는각속성들의유효한범위를갖는다. Scope 서블릿 JSP( 내장객체를사용 ) Application getservletcontext().setattribute( foo, barobj); application.setattribute( foo, barobj); Request request.setattribute( foo, barobj); request.setattribute( foo, barobj); Session request.getsession().setattribute( foo, barobj); session.setattribute( foo, barobj); Page 제공하지않는다. pagecontext.setattribute( foo, barobj); 83

JSP 내장속성 (2/2) 내장객체중영역객체의속성을설정및조회하는메소드 pagecontext, request, session, application 들이동일하게정의하고있음 메소드명 public Object getattribute(string key) 속성유효범위 key 값으로등록된속성을 Object 로리턴 해당 key 값이존재하지않을경우 null 리턴 public void setattribute(string key, Object value) public Enumeration getattributenames() 속성값을 key 값으로등록 해당영역에지정된속성들의이름을 Enumeration 으로리턴 헤당 key 값이존재하지않을경우 null 리턴 public void removeattributte(string key) key 값에해당하는해당영역의속성을삭제 84

PageContext 로속성접근하기 (1/2) pagecontext 는자신에설정되어있는 page 범위속성뿐만아니라, 어떤다른생존범위속성도접근할수있을정도로막강하다. page 생존범위의속성세팅하기 <% Float one = new Float(42.5); %> <% pagecontext.setattribute( foo, one); %> page 생존범위의속성읽기 <%= pagecontext.getattribute( foo ); %> pagecontext 를이용하여 session 생존범위속성세팅하기 <% Float one = new Float(42.5); %> <% pagecontext.setattribute( foo, two, pagecontext.session_scope); %> pagecontext 를이용하여 session 생존범위속성읽기 <%= pagecontext.getattribute( foo, pagecontext.session_scope) %> ( 이것과동일한것 : <%= session.getattribute( foo ) %> 85

PageContext 로속성접근하기 (2/2) pagecontext 를이용하여 application 생존범위속성읽기 <%= pagecontext.getattribute( mail, PageContext.APPLICATION_SCOPE) %> ( 이것과동일한것 : <%= application.getattribute( foo ) %> pagecontext 를이용하여어떤생존범위인지모르는속성찾기 foo 라는이름의속성이 page 생존범위에없다면, 가장작은범위에서부터시작해서가장넓은범위의순으로속성을찾는다. <%= pagecontext.findattribute( foo ); %> 86

4. JSP 4.1 JSP 기본 4.2 JSP 태그 4.3 JSP 동작원리 4.4 표준액션 4.5 EL(Expression Language) 4.6 레이아웃템플릿 자바빈관련표준액션

표준액션 - 자바빈 (1/4) JSP 는스크립팅을사용하지않고자바빈의프로퍼티를출력할수있는방법을제공한다. Scriptlet 을이용하는방법 <html><body> <% foo.person p = (foo.person) request.getattribute( person ); %> Person is : <%= p.getname() %> </body></html> 표준액션을사용하는방법 (Scriptlet 사용안함 ) <html><body> <jsp:usebean id= person class= foo.person scope= request /> Person created by servlet: <jsp:getproperty name= person property= name /> </body></html> 88

표준액션 - 자바빈 (2/4) <jsp:usebean> 은빈을선언하고초기화하는태그 <jsp:usebean id= person class= foo.person scope= request /> jsp:usebean : 표준액션임을나타냄 id= person : 빈객체식별자를선언한다. class= foo.person : 빈객체의클래스타입을선언 scope= request : 빈객체속성의생존범위지정 <jsp:getproperty> 은속성빈프로퍼티를읽어오는태그 <jsp:getproperty name= person property= name /> jsp:getproperty : 표준액션임을나타냄 name : 빈객체이름 property= name : 빈의프로퍼티명 ( getter/setter) <jsp:setproperty> 은속성빈프로퍼티를설정하는태그 <jsp:setproperty name= person property= name value= Fred /> 89

표준액션 - 자바빈 (3/4) <jsp:usebean> 은 person 이라는속성객체를찾다가못찾으면, 하나만든다. <jsp:usebean id= person class= foo.person scope= request /> <Servlet code> // id 에있는값을가지고변수를선언한다. foo.person person = null; synchronized (request) { // 태그에정의된생존범위 (scope) 에서속성을찾아본다. person = (foo.person)_jspx_page_context.getattribute( person, PageContext.REQUEST_SCOPE); // 해당생존범위에이런이름을가진속성이없다면 if(person == null) { // 객체를생성해 person 에할당한다. person = new foo.person(); } } // 마지막으로방금만든객체를태그에서정의한생존범위에설정한다. _jspx_page_context.setattribute( person, person, PageContext.REQUEST_SCOPE); 90

표준액션 - 자바빈 (4/4) <jsp:usebean> 은자신의몸체를가질수있다. 새로운빈이만들어지는경우에만프로퍼티를설정하고, 이미빈이존재한다면, 태그의몸체부분은건너뛴다. <jsp:usebean id= person class= foo.person scope= page > <jsp:setproperty name= person property= name value= Fred /> </jsp:usebean> 빈표준액션의단점 표현식을사용하면중첩된객체의프로퍼티를출력할수있다. <html><body> <%= ((foo.person) request.getattribute( person )).getdog().getname() %> </body></html> 그러나, 빈표준태그는중첩된프로퍼티를출력할수없다. Dog 객체의 name 속성값을출력할방법이없다. <html><body> <jsp:usebean id= person class= foo.person scope= request /> Dog s name is : <jsp:getproperty name= person property= dog /> </body></html> 91

4. JSP 4.1 JSP 기본 4.2 JSP 태그 4.3 JSP 동작원리 4.4 표준액션 4.5 EL(Expression Language) 4.6 레이아웃템플릿 EL (Expression Language) EL의 [] 연산자 EL 내장객체 EL 함수 연산자

EL (Expression Language) EL 은표현식언어 (Expression Language) 의줄임말이다. JSP 2.0 스펙부터공식적으로포함 스크립틀릿이나표현식으로지금까지했던작업을 EL 로간단하게할수있음 EL 표현식 <syntax> ${person.dog.name} < 스크립팅 > <%= ((foo.person) request.getattribute( person )).getdog().getname() %> 표현식에서도트연사자왼쪽은반드시맵또는빈이여야한다. ${person.name}// java.util.map 또는 java bean 표현식에서도트연산자오른쪽은반드시맵의키이거나빈프로퍼티여야한다. ${person.name} // 빈프로퍼티 (getname(), setname() 오른쪽오는값은식별자로서일반적인자바명명규칙을따라야한다. ${person.name} // 문자, _, $ 로시작해야함, 두번째글자부터숫자를써도무방, 자바예약어사용금지 93

EL 의 [] 연산자 (1/3) EL 의 [] 연산자 ${person[ name ]} = ${person.name} [] 연산자의왼편에는맵, 빈, 배열, 리스트변수가올수있다. ${musiclist[ something ]}// [] 연산자안의값이문자열 ( 따옴표로묶여있다면 ) 이라면, 이것은맵키가될수있고, 빈프로퍼티또는리스트나배열인덱스가될수있다. ${musiclist[ something ]}// 배열과리스트인경우문자로된인덱스값은숫자로바뀐다. <servlet code> String[] favoritemusic = { Zero 7, Tahiti 80, BT, Frou Frou }; request.setattribute( musiclist, favoritemusic); ${musiclist[0]} // Zero 7 출력 ${musiclist[ 1 ]} //Tahiti 80 94

EL 의 [] 연산자 (2/3) EL 의 [] 연산자안에따옴표가없다면컨테이너는안에들어있는것이뭔지찾기시작한다. 이런이름으로바인딩된속성이있으면속성값을 [] 안에넣는다. ( 똑같은이름의내장객체가있다면, 내장객체가항상우선한다. ) <servlet code> java.util.map musicmap = new java.util.hashmap(); musicmap.put( Ambient, Zero 7 ); musicmap.put( Surf, Tahiti 80 ); musicmap.put( DJ, BT ); musicmap.put( Indie, Frou Frou ); request.setattribute( musicmap, musicmap); request.setattribute( Genre, Ambient ); ${musicmap[genre]} ===============> ${musicmap[ Ambient ]} //return Zero 7 ${musicmap[ Genre ]} ==============> ${musicmap[ Genre ]} //return null 95

EL 의 [] 연산자 (3/3) EL 의 [] 연산자안에내장표현식을쓸수있다. 표현식을실행할때안쪽에서바깥쪽의순서로진행한다. <servlet code> java.util.map musicmap = new java.util.hashmap(); musicmap.put( Ambient, Zero 7 ); musicmap.put( Surf, Tahiti 80 ); musicmap.put( DJ, BT ); musicmap.put( Indie, Frou Frou ); String[] musictypers = { Ambient, surf, DJ, Indie }; request.setattribute( Musictype, musictypes); Music id ${musicmap[musictype[0]]} Music is ${musicmap[ Ambient ]} Music is Zero 7 96

EL 내장객체 pagecontext 만빼고모두맵이다. 내장객체명 pagescope requestscope sessionscope applicationscope param paramvalues header headervalues cookie initparam pagecontext 설명생존범위속성맵요청파라미터맵요청헤더맵쿠키맵컨텍스트초기화파라미터맵 pagecontext 객체에대한참조. 맵이아닌유일한빈 97

EL 내장객체 EL 에서요청파라미터사용 해당파라미터이름으로값이하나밖에없을때 EL 내장객체인 param 을사용하면쉽게그값을읽을수있다. 파라미터이름으로그값이하나이상일때는 param 으로는안되고 paramvalues 를사용해야한다. <html code> <form action= TestBean.jsp > Name : <input type= text name= name > ID# : <input type= text name= empid > First food : <input type= text name= food > Second food : <input type= text name= food > <input type= submit > </form> <jsp code> Request param name is : ${param.name} <br> Request param empid is : ${param.empid} <br> Request param food is : ${param.food} <br> First food request param : ${paramvalues.food[0]} <br> Second food request param : ${paramvalues.food[1]} <br> Request param name : ${paramvalues.name[0]} 98

EL 내장객체 host 헤더정보읽기 스트립팅코드 Host is : <%= request.getheader( host ) %> EL 내장객체 header를사용 Host is : ${header[ host ]}, Host is : ${header.host} HTTP 요청메소드확인 스크립팅코드 Method is : <%= request.getmethod() %> EL 사용 Method is : ${requeset.method} // 오류, Method is : ${requestscope.method} // 오류 99

EL 내장객체 requestscope 와 request 객체 requestscope : request 생존범위에묶여있는속성에대한단순한맵 request 정보는 pagecontext 를통해서접근할수있다. Method is : ${pagecontext.request.method} //pagecontext 안에 request 가있고 request 안에 method 가있다. naming conflict( 이름충돌 ) 가생존범위안에서의심되면명시적으로표현한다. ${requestscope.person.name} 속성이름이문자열이라면 request.setattribute( foo.person, p); // 속성을문자열로입력한경우 ${foo.person.name} //foo 라는속성은존재하지않는다. ${requestscope[ foo.person ].name} //[] 이용해서접근할수있다. 100

EL 내장객체 쿠키값출력 스크립팅 <% Cookie[] cookies = request.getcookies(); for(cookie cookie : cookies) { if(cookie.getname().equals( username )) { out.println(cookie.getvalue()); } } %> EL Cookie 내장객체사용 ${cookie.username.value} 컨텍스트초기화파라미터값출력 <web.xml> <context param> <param name>mainemail</param name> <param value>likewecare@wickedlysmart.com</param value> </context param> email is : <%= application.getinitparameter( mainemail ) %> // 스크립팅 email is : ${initparam.mainemail} //EL 표현식 101

EL 실습 (1/5) 회원가입화면구현 화면에입력한회원정보를 dispatch 된화면 ( 가입완료화면 ) 에서다시보여줌 102

EL 실습 (2/5) join.jsp 103

EL 실습 (3/5) Member.java 104

EL 실습 (4/5) JoinServlet.java 105

EL 실습 (5/5) joinresult.jsp 106

EL 함수 (1/2) 태그라이브러리를구현하여 EL 표현식으로자바메소드를사용할수있다. 사용방법 정적인공용메소드를제공하는클래스작성. 반드시 public static 메소드여야한다. void 메소드는가능하나리턴이없으므로무의미함 태그라이브러리서술자파일을만든다. JSP 에 taglib 지시자를코딩한다. 함수를호출하는 EL 을작성한다. 메소드를정의한클래스작성 <java> package foo; public class DiceRoller { public static int rolldice() { return (int) ((Math.random() * 6) + 1); } } 107

EL 함수 (2/2) 태그라이브러리서술자 (TLD) 파일작성 <TLD> <?xml version="1.0" encoding="utf 8"?> <taglib xmlns="http://java.sun.com/xml/ns/j2ee" xmlns:xsi="http://www.w3.org/2001/xmlschema instance" xsi:schemalocation="http://java.sun.com/xml/ns/j2ee/web jsptaglibrary_2_0.xsd" version="2.0"> <tlib version>1.2</tlib version> <uri>dicefunctions</uri> <function> <name>rollit</name> <function class>foo.diceroller</function class> <function signature>int rolldice()</function signature> </function> </taglib> JSP 에 taglib 지시자를코딩및함수호출 EL 작성 <%@ taglib prefix= mine uri= DiceFunctions %> <html><body> ${mine:rollit()} </body></html> 108

연산자 산술연산자 +,, *, (/, div), (%, mod) 논리연산자 &&, and,, or,, not 관계연산자 (==, eq), ( =, ne), (<, lt), (>, gt), (<=, le), (>=, ge) String num= 2 ; ${num > 3} = false, ${integer le 12} = true, ${42 div 0} = infinity 그밖에연산자들 empty true false null 109

4. JSP 4.1 JSP 기본 4.2 JSP 태그 4.3 JSP 동작원리 4.4 표준액션 4.5 EL(Expression Language) 4.6 레이아웃템플릿 include 지시자 <jsp:include> 표준액션

include 지시자 include 지시자는포함할파일내용을모두복사하여선언한지점에삽입한다. ( 포함후실행 ) <header.jsp> <img src= images/web Services.jpg > <br> <em><strong>we know how to make SOAP suck less.</strong></em> <br> <Contact.jsp> <html><body> <%@ include file= Header.jsp %> <br> <em>we can help.</em><br><br> Contact us at: ${initparam.mainemail} </body></html> 111

<jsp:include> 표준액션 (1/2) <jsp:include> 표준액션도 include 지시자와똑같은곳에둔다. ( 실행후포함 ) <header.jsp> <img src= images/web Services.jpg > <br> <em><strong>we know how to make SOAP suck less.</strong></em> <br> <Contact.jsp> <html><body> <jsp:include page= Header.jsp /> <br> <em>we can help.</em><br><br> Contact us at: ${initparam.mainemail} </body></html> 112

<jsp:include> 표준액션 (2/2) <jsp:param/> 테그로컨텐츠추가하기 <main.jsp> <html><body> <jsp:include page= Header.jsp > <jsp:param name= subtitle value= We take the sting out of SOAP. /> </jsp:include> <br> <Header.jsp> <img src= images/web Services.jpg > <br> <em><strong>${param.subtitle}</strong></em> <br> 113

5. JSTL 5.1 JSTL 개요 5.2 JSTL 주요태그 JSTL 개요

JSTL 개요 JSTL 개요 JSP 표준태그라이브러리 스크립틀릿대신에반복문, 조건문, 포맷, xml 조작등을 HTML 태그처럼사용할수있도록지원한다. EL을이용해서효과적으로프리젠테이션역할을수행 JSTL 사용법 JSTL을사용하기위해서는 WEB INF/lib 에 jstl.jar, standard.jar 설치한다. - 톰캣에서제공하는샘플프로젝트에있는 jstl.jar, standard.jar을찾아서 WEB INF/lib에서복사하면된다. jsp 문서상단에 jsp 태그라이브러리지시자를이용하여 jstl을선언한다. <JSTL 선언 > <% taglib prfix= c url= http://java.sun.com/jsp/jstl/core %> JSTL 사용 <JSTL 사용 > <c:if test= ${empty param.username} > <jsp:forward page= HandleIt.jsp /> </c:if> 115

5. JSTL 5.1 JSTL 개요 5.2 JSTL 주요태그 JSTL 코어라이브러리 그밖의라이브러리

JSTL - <c:out> 태그 값을출력하기위한태그 기본문법 <syntax> <c:out value= ${pagecontent.rawhtml} /> escapexml 속성 : 출력할값에브라우저가해석하는 html 등과같은값이포함되어있을경우해석되지않고그대로표현해야할경우사용한다. <syntax> <c:out value= ${pagecontent.rawhtml} escapexml= false /> //true: html 코드를변환한다. default 속성 : 값이없을경우기본출력값을설정할수있다. <syntax 1.> <c:out value= ${user} default= guest /> //user 가널이거나빈값일경우 guest 를출력한다. <syntax 2.> <c:out value= ${user} > guest</c:out> 117

JSTL - <c:foreach> 태그 (1/3) <c:foreach> 태그는컬렉션에있는각각의항목에대하여몸체 ( 바디 ) 부분을반복한다. 여기서말하는컬렉션 : 배열 (Array), 컬렉션 (Collection), 맵 (Map), 콤마분리문자열 (Comma delimited String) 기본문법 <syntax> <c:foreach var= movie items= ${movielist} /> // var : 컬렉션에있는각각항목을나타내는변수 ${movie} //items : 루핑을돌실제데이터 ( 배열, 컬렉션, 맵, 콤마분리문자열 ) </c:foreach> varstatus 속성 : 루핑횟수를알기위한속성 <syntax> <c:foreach var= movie items= ${movielist} varstatus= movieloopcount /> //movieloopcount 라는인스턴스변수선언 ${movieloopcount.count} // 루핑이돌때마다값이 1 씩증가한다. </c:foreach> 118

JSTL - <c:foreach> 태그 (2/3) <c:foreach> 안에 <c:foreach> servlet code <servlet code> String[] movies1 = { Matrix, Kill Bill, Boondock Saints }; String[] movies2 = { Amelie, Return of the King, Mean Girls }; List movielist = new Arraylist(); movielist.add(movies1); movielist.add(movies2); request.setattribute( movies, movielist); Jsp 코드 <syntax> <c:foreach var= listelement items= ${movies} /> <c:foreach var= movie items= $listelement} > ${movie} </c:foreach> </c:foreach> 119

JSTL - <c:foreach> 태그 (3/3) begin, end, step 속성 begin, end : 컬렉션의부분집합만루프를돌릴때사용한다. step : 값을얼마씩증가할것인지를설정 <syntax> <c:foreach var="comma" items="${commastr }" varstatus="commacount" begin="1" end="5" step="2"> ${commacount.count}. ${comma}<br> </c:foreach> 120

JSTL 조건문태그 (1/2) <c:if> 태그는조건문을만들때사용한다. 기본문법 <syntax> <c:if test= ${usertype eq member } > <jsp:include page= inputcomments.jsp /> </c:if> 121

JSTL 조건문태그 (2/2) <c:choose> 태그는 <c:if> 태그가표현못하는 else 를등을표현할수있다. 기본문법 <syntax> <c:choose> <c:when test= ${userpref == performance } > 실행할내용. </c:when> <c:when test= ${userpref == safety } > 실행할내용 </c:when> <c:otherwise> 해당조건이맞지않을때의디폴트실행문 </c:otherwise> </c:choose> <c:otherwise> 태그가반드시있어야하는것은아니다. 122

JSTL <c:set> 태그 (1/3) <c:set> 태그는속성, 빈, 맵의값을설정할수있다. 속성 var 설정하기 <syntax> //session 생존범위에 userlevel 이란이름의속성이없으면하나를새로만든다. (value 속성값이 null 이아니라는가정하에 ) <c:set var= userlevel scope= session value= Cowboy /> //$(person,dog} 의 Dog 객체를 Fido 변수에설정한다. Fido 는 Dog 타입변수가된다. <c:set var= Fido value= ${persion.dog} /> 몸체가있는경우 <syntax> <c:set var= userlevels scope= sesssion > Sheriff, Bartender, Cowgirl </c:set> value 가 null 인경우, 변수는제거된다. 123

JSTL <c:set> 태그 (2/3) 빈과맵에 <c:set> 태그사용하기 <syntax> <c:set target= ${Petmap} property= dogname value= Clover /> 1. target은 null 이어서는안되다. target 속성에는객체가들어가야한다. 2. target이빈일경우 property는프로퍼팅명이된고, 맵일경우키값이된다. 몸체가있는경우 <syntax> <c:set target= ${person} property= name > ${foo.name} </c:set> 124

JSTL <c:set> 태그 (3/3) <c:set> 핵심정리 <c:set> 태그에 var 와 target 을동시에사용할수없다. scope 는옵션이다. 없을경우디폴트는 page 생존범위이다. value 가널이면, var 에있는속성은제거된다. var 이름으로속성이없으면, 자동적으로만든다. (value 가널이아닐경우 ) target 표현식이널이면, 컨테이너는예외사항을던진다. target 에는실제객체를표현하는표현식이들어가야한다. 빈이나맵의 id 이름을나타내는문자열을기입하면, 작동하지않는다. target 표현식이빈이나맵이아니면컨테이너는예외사항을던진다. target 표현식이빈이고, 해당빈에 property 에명기된이름으로된프로퍼티가없다면컨테이너는예외사항을던진다. EL 표현식 ${bean.notaproperty} 또한예외사항을던진다. 125

JSTL <c:remove> 태그 속성을제거하기위해사용한다. <syntax> <c:set var= userstatus scope= request value= Brilliant /> userstatus: ${userstatus} <br> <c:remove var= userstatus scope= request /> 1. var 속성에는문자열이들어간다. ( 표현식을넣으면안된다.)) 126

JSTL <c:import> 태그 요청이들어오는시점에, url 속성에명기한파일을현재컨텐츠에포함한다. <jsp:include> 표준액션과 include 지시자로는현재웹애플리케이션에있는페이지만포함할수있지만, <c:import> 태그를사용하면컨테이너외부에있는자원도포함시킬수있다. <syntax> <c:import url= http://www.nextree.co.kr/sample/sample.html /> <c:param> 를활요한내용삽입 <syntax> <c:import url= Header.jsp > <c:param name= subtitle value= We take the sting out of SOAP. /> </c:import> 포함될파일 (header.jsp) <em> <strong>${param.subtitle}</strong></em> 127

JSTL <c:url> 태그 하이퍼링크와관련된작업을할수있다. URL 재작성 <syntax> <a href= <c:url value= /inputcomments.jsp /> >click here</a> URL 인코딩 - <c:url> 태그는 URL 재작성은하지만, URL 인코딩을하지않는다. - <c:url> 몸체에 <c:param> 을사용하면 URl 재작성도하고 URL 인코딩도한다. <syntax> <c:url value= /inputcomments.jsp var= inputurl > <c:param name= firstname value= ${first} /> <c:param name= flastname value= ${flast} /> </c:url> 128

JSTL <c:catch> 태그 페이지에오류를낼만한태그를오류페이지로넘기기않고직접처리하고싶을때사용한다. <syntax> <%@ page crorpage= errorpage.jsp %> <c:catch> <% int x = 10/0; %> // 이스크립트릿은 100% 에외사항을던진다. 하지만오류페이지가아닌이페이지에서처리한다. </c:catch> <c:catch> 태그에서 var 속성사용하기 <syntax> <%@ page crorpage= errorpage.jsp %> <c:catch var= myexception > <% int x = 10/0; %> // 이스크립트릿은 100% 에외사항을던진다. 하지만오류페이지가아닌이페이지에서처리한다. </c:catch> <c:if test= ${myexception = null} > There was an exception: ${myexception.message} <br> </c:if> 129

그밖의라이브러리 포맷팅라이브러리 국제화 : <fmt:message> <fmt:setlocale> <fmt:bundle> <fmt:setbundle> <fmt:param> <fmt:requestencoding> 포맷팅 : <fmt:timezone> <fmt:settimezone> <fmt:formatnumber> <fmt:parsenumber> <fmt:parsedate> SQL 라이브러리 데이터베이스접근 : <sql:query> <sql:update> <sql:setdatasource> <sql:param> <sql:dateparam> XML 라이브러리 코어 XML 액션 : <x:parse> <x:out> <x:set> XML 프름제어 : <x:if> <x:choose> <x:when> <x:otherwise> <x:foreach> 변환액션 : <x:transform> <x:param> 130

6. Servlet 활용기술 6.1 Servlet Filter Servlet Filter 개요 Filter 를이용한한글처리

Servlet Filter 개요 서블릿필터는서블릿으로요청이넘어가기전에요청을가로채어어떤처리를할수있다. 필터의동작여부를서블릿은알수없다. 클라이언트요청 컨테이너 필터 #1 필터 #2 서블릿 요청객체 응답객체 필터가여러개인경우실행순서 컨테이너는 DD(web.xml) 에선언한정보를바탕으로필터를언제실행할지결정한다. 필터의구현 javax.servlet.filter 인터페이스를구현한다. Request 필터활용 보안관련내용체크 요청헤더와바디포맷팅수정 요청을감시하거나기록을남김 Response 필터활용 응답스트림압축 응답스트림에내용을추가하거나수정 132

Filter 를이용한한글처리 (1/2) 한글관련처리에 Filter를적용한예 web.xml 설정 모든 URL 요청 (/*) 에대해서필터적용 Filter Class의초기파라미터설정 133

Filter 를이용한한글처리 (2/2) Filter Class 구현 init() Filter 가등록될때호출 (Server Start) web.xml 에서정의한파라미터사용 destory() Filter 가해제될때호출 (Server Stop) dofilter() Filter 동작구현 Filter Chain 에등록된다른 Filter 호출 134

7. 웹프로그래밍전략 7.1 Servlet & JSP 7.2 MVC 패턴 7.3 웹프레임워크구조 7.4 프레임워크소개 Servlet & JSP

Servlet & JSP (1/4) 하나의 Servlet 또는하나의 JSP 에서복합기능을수행 업무복잡도가증가할수록유지보수가어려워짐 요청 흐름통제 서블릿 3 서블릿 2 서블릿 1 업무처리 1 화면처리 1 DB 업무처리 2 화면처리 2 136

Servlet & JSP (2/4) 업무변화에따라기능및화면이추가또는변경됨 요청 흐름통제 서블릿 3 서블릿 2 서블릿 1 업무처리 1 화면처리 1 DB 업무처리 2 화면처리 2 업무처리 3 화면처리 3 137

Servlet & JSP (3/4) 변경부와고정부를분리하여확장에열려있고변경에닫힌구조를고려 변화에따른변경을최소화하기 묶을것 ( 비슷한일을하는모듈 ) 을하나로묶기 나눌것 ( 다른일을하는모듈 ) 은나누기 서블릿1 흐름통제업무처리1 화면처리2 업무처리2 화면처리2 업무처리3 화면처리3 흐름통제화면처리2 화면처리2 화면추가 업무처리1 업무처리2 업무처리3 업무추가 138

Servlet & JSP (4/4) 흐름통제, 화면처리, 업무처리를분리 변화요구에신속하게대응 특정모듈의변경이다른모듈에영향을주지않음 흐름통제 서블릿 1 자바객체 1 업무처리 1 요청 화면처리 1 업무처리 2 DB 흐름통제 서블릿 2 자바객체 1 업무처리 2 화면처리 2 139

7. 웹프로그래밍전략 7.1 Servlet & JSP 7.2 MVC 패턴 7.3 웹프레임워크구조 7.4 프레임워크소개 설계방식 모델 1 설계방식 모델 2 MVC 패턴

설계방식 - 모델 1 장점 규모가작은애플리케이션개발에유리 개발시간이단축 (?) 모델 2 개발방식에대한추가적인교육이필요없음 단점 프리젠테이션로직과비즈니스로직이 JSP안에혼재되어있어애플리케이션이복잡해질수록유지보수가어려움 디자이너와개발자간의원할한의사소통이어려움 사용자의증가되는요구사항대응이어려움 Servlet Container 웹브라우저 1 4 JSP 2 3 DB 자바빈 141

설계방식 - 모델 2 장점 로직과프리젠테이션의분리로인해애플리케이션이명료해지며유지보수와확장이용이함 디자이너와개발자의작업을분리해줌 단점 개발초기에아키텍처디자인을위한시간의소요로개발기간이늘어남 MVC 구조에대한개발자들의이해가필요함 Servlet Container 1 <<Controller>> Servlet 웹브라우저 3 5 <<View>> JSP 4 <<Model>> 자바빈 DB 142

MVC 패턴 Servlet & JSP 구조에서흐름통제, 화면처리, 업무처리를체계적으로분리 서블릿 1 자바객체 1 흐름통제 업무처리 1 요청 뷰매핑자바객체 업무처리 2 DB 자바객체 1 화면처리 1 업무처리 2 화면처리 2 143

7. 웹프로그래밍전략 7.1 Servlet & JSP 7.2 MVC 패턴 7.3 웹프레임워크구조 7.4 프레임워크소개 웹프레임워크구조 ActionServlet

웹프레임워크구조 웹프레임워크의핵심업무 URL 매핑 : URL분석하여적절한 Action 클래스를실행 뷰매핑 : Action 클래스의결과를출력할 JSP로 Forward 1 요청 ActionServlet Action1 Service1 4 8 2 6 3 Action2 Service2 5 DAO1 DAO2 ActionMapping Action3 Service3 DAO3 7 JSP1 JSP1 서버. 스트럿츠 (Struts) 아키텍처참조 145

ActionServlet 모든요청을받아적절한 Action 클래스를실행하는역할을담당한다. Action 클래스의반환값을기반으로적절한 JSP 로 forward 매핑설정은 properties 또는 xml 로관리 146

7. 웹프로그래밍전략 7.1 Servlet & JSP 7.2 MVC 패턴 7.3 웹프레임워크구조 7.4 프레임워크소개 웹개발자바프레임워크 웹프레임워크 DB접근프레임워크 컨테이너 프레임워크구성도

웹개발자바프레임워크 Servlet & JSP 영역 jquery Spring MVC Spring ibatis, MyBatis Dojo Struts2 Hibernate Sencha Jersey, Restlet EJB JPA Hibernate 클라이언트 서버 참고 : http://nosql.findthebest.com/ 148

웹프레임워크 스트럿츠 (Struts) 2000 년대중반부터사용되고있는기본에충실한웹프레임워크로 URL 매핑과뷰매핑을 xml 로처리 최신버전 1.3.10 (2008.12 지원중단 ) 스트럿츠2(Struts2) 스트럿츠 (struts) 의후속으로시작된프레임워크이나스트럿츠보다웹워크 (WebWork) 의영향을받음 요청인자를객체로자동매핑가능한것이특징 다양한플러그인사용가능 (RESTFul 서비스의일부지원가능 ) 최신버전 2.3.x http://struts.apache.org/ 스프링 MVC(SpringMVC) 스프링프레임워크의일부로기타스프링계열의프레임워크와호환성이좋음 2.5.x 하위버전에서는모든 bean 생성을 xml 로관리하여설정관리가어려웠으나 2.5.x 상위버전에서는애노테이션을도입하여 xml 설정을대폭단순화함 일부 RESTFul 서비스구현을지원함 최신버전 4.0 http://projects.spring.io/spring framework/ Jersey, Restlet RESTFul 서비스구현을지원 Jersey 최신버전 2.5.1 https://jersey.java.net/ Restlet 최신버전 2.1.6 http://restlet.org/ 149

DB 접근프레임워크 아이바티스 (ibatis) JDBC의불편한점을개선하기위한용도로사용됨, SQL 재활용및동적 SQL 작성이가능하여 JDBC 방식대비 SQL문을대폭줄이는효과를보임 2010년 6월 16일로아파치재단에서구글코드로이전됨 최신버전 2.3.5.x http://ibatis.apache.org/ 마이바티스 (MyBatis) ibatis 의후속프로젝트 SQL 결과와객체매핑부분에대폭개선이있었으며, 동적 SQL 작성문법을 jstl 과유사하게개선하여친숙도를높임 하이버네이트 (Hibernate) ORM (Object Relation Mapper) 프레임워크로객체간관계설정이되어있으면별도의 SQL 문없이객체조회를통해자동으로 SQL 구문을생성해주는점이강점 단관계가없는객체조회는불가능하며이를지원하기위해별도의 JPQL 이라는쿼리문법을제공 150

컨테이너 EJB J2EE 표준을준수하는프레임워크로웹애플리케이션서버 (WAS) 에서지원, 기업형웹애플리케이션개발지원을위해분산처리, 트랜잭션등기능을제공하고있지만 EJB 를지원하는 WAS 를사용해야만하고복잡한 EJB 스펙을준수해야하는등어려움이있음 EJB2 에서문제로제시된복잡한스펙및 XML 설정을벗어나기위해 EJB3 가제시됨 스프링 EJB 의복잡함에서벗어나자바본연의모습으로돌아가기위한의견이제시될시기에시작됨 EJB 에서제공하는기능을 WAS 에서분리하여경량컨테이너기능을제공함 최근수행되는대다수의프로젝트가스프링을이용하는등인기를누리고있으며, 수많은하위프로젝트로인해다양한서비스구축이가능함 ( 스프링 MVC 도스프링의하위프로젝트 ) 151

프레임워크구성도 웹 데스크탑 jquery Dojo HTML JS HTML, JSON, XML, 바이너리통신 Spring MVC ibatis, MyBatis Hibernate 모바일 Sencha jquerym CSS Struts2 Jersey, Restlet JPA Spring Hibernate EJB 데스크탑 AWT, SWING RCP JSON, XML, 앱 모바일 Android ios 바이너리통신 DB 152

기타웹애플리케이션개발언어및프레임워크 웹 데스크탑 jquery Dojo HTML JS HTML, JSON, XML, 바이너리통신 Java Spring MVC Jersey 모바일 Sencha jquerym CSS Node Express Locomotive PHP Zend CakePHP Python django Ruby Rails groovy grails 153

토의 질의응답 토론 넥스트리소프트 ( 주 ) 김현오선임 (hyunohkim@nextree.co.kr) 154