3장. 웹 어플리케이션과 JSP 및 Servlet의 이해 제3장
1. 웹 어플리케이션 개념 및 폴더 구조 웹 어플리케이션의 개념 웹 어플리케이션이 Tomcat 에서 구현될 때의 규칙 독립 어플리케이션 (Stand-alone Application) 웹 어플리케이션 (Web Application) 웹 브라우저 상에서 수행되는 어플리케이션 HTTP와 HTML을 기본으로 사용 웹 어플리케이션이 Tomcat 에서 구현될 때의 규칙 임의의 웹 어플리케이션은 webapps 폴더 하위에 하나의 폴더로 구성 jspbook 웹 어플리케이션 (첫 번째 웹 어플리케이션) 제3장 웹 어플리케이션과 webapps 내의 폴더
1. 웹 어플리케이션 개념 및 폴더 구조 웹 어플리케이션의 개념 webapps ‘폴더’ 내에 새로운 폴더 생성 = 새로운 ‘Context’ 생성 (ServletContext: servlet들이 실행되는 환경) = 새로운 웹 어플리케이션들 생성 jspbook 웹 어플리케이션 (첫 번째 웹 어플리케이션) myapp 웹 어플리케이션 (두 번째 웹 어플리케이션) webapps 내의 두 번째 웹 어플리케이션 생성 제3장
1. 웹 어플리케이션 개념 및 폴더 구조 웹 어플리케이션의 개념 웹 어플리케이션 폴더와 URL간의 매핑 웹 어플리케이션 폴더는 하나의 ServletContext와 매핑 ServletContext는 하나의 웹 어플리케이션 폴더 내에 여러 JSP 페이지와 Servlet 들이 ‘공동으로’ 활용할 수 있는 저장소로 활용 즉, 어플리케이션 환경(environment) 서로 다른 두 개의 웹 어플리케이션은 ServletContext 객체와 매핑되어 각자 독립적인 공간에 자신만의 정보를 관리 웹 어플리케이션 폴더와 URL간의 매핑 URL에 웹 어플리케이션 지정 없이 http://localhost:8080 으로 요청 webapps 폴더 밑의 ROOT 폴더로 자동으로 접근 http://localhost:8080/hello.jsp webapps/ROOT/hello.jsp 파일 접근 http://localhost:8080 webapps/ROOT/index.html 파일 접근 제3장
1. 웹 어플리케이션 개념 및 폴더 구조 웹 어플리케이션 폴더와 URL간의 매핑 webapps 내에 jspbook과 myapp 웹 어플리케이션을 생성시에 함께 생성되는 URL 위 URL로 접근하면 jspbook 및 myapp 폴더 밑의 index.html 또는 index.jsp 파일을 접근 index.html, index.jsp: 파일명까지 정확하게 입력하지 않아도 폴더명만으로도 찾아지는 디폴트 파일 http://localhost:8080/jspbook http://localhost:8080/myapp 제3장
1. 웹 어플리케이션 개념 및 폴더 구조 웹 어플리케이션 폴더(Context)와 URL간의 매핑 중요 메소드 2개 request.getContextPath() 웹 어플리케이션의 경로를 리턴 application.getRealPath("/") 웹 어플리케이션의 하드디스크상 실제 경로를 리턴 [예제 3.1] jspbook\ch03\path.jsp 01 02 03 04 05 06 07 08 <%@ page contentType="text/html;charset=utf-8" %> <html> <head><title>context의 경로</title></head> <body> 현재 수행 JSP의 context (웹 어플리케이션) 경로: <%= request.getContextPath() %> <br/> 현재 수행 JSP의 context 실제 경로: <%= application.getRealPath("/") %> </body> </html> 제3장
1. 웹 어플리케이션 개념 및 폴더 구조 웹 어플리케이션 폴더와 URL간의 매핑 jspbook/test 폴더 밑의 testjsp.jsp 파일 접근 URL jspbook/images 폴더 밑의 apple.bmp 파일 접근 URL http://localhost:8080/jspbook/test/testjsp.jsp http://localhost:8080/jspbook/images/apple.bmp 제3장
1. 웹 어플리케이션 개념 및 폴더 구조 웹 어플리케이션의 폴더 구조 일반적인 웹 어플리케이션의 구조에는 반드시 WEB-INF 폴더와 web.xml 파일이 그 안에 존재한다. 하지만 간단한 웹 어플리케이션인 경우에는 WEB-INF 폴더 및 web.xml 생략이 가능하다. 영화제작과 비교하면 영화를 만드는 데에 있어서 뒤에서 일하는 스텝들과 같은 역할을 하는 파일 및 자원들은 모두 WEB-INF 폴더 내에 두어야 하며 WEB-INF 폴더 내의 파일 및 자원들은 웹 브라우저인 클라이언트에서 절대 접근할 수 없다. 제3장
1. 웹 어플리케이션 개념 및 폴더 구조 웹 어플리케이션의 폴더 구조 제3장 폴더 또는 파일 설명 /웹 어플리케이션 폴더/ 웹 어플리케이션의 루트 (ROOT) 폴더이다. 웹 어플리케이션과 관련된 모든 HTML, JSP, Servlet, Java 클래스, 이미지파일들이 이 폴더 밑에 저장된다. /웹 어플리케이션 폴더/WEB-INF 웹 어플리케이션의 환경 설정, 관련 Serlvet 및 Utility 클래스와 JavaBeans와 라이브러리들을 위치시키는 폴더이다. 이 폴더에 웹 어플리케이션 배치 정의자인 web.xml이 위치한다. 이곳에 위치한 파일은 클라이언트가 직접적으로 접근할 수 없다. /웹 어플리케이션 폴더/WEB-INF/web.xml 웹 어플리케이션 배치 정의자 역할을 하는 파일이다. /웹 어플리케이션 폴더/WEB-INF/classes Servlet 및 JavaBeans 클래스를 포함한 여러 클래스들이 위치하는 폴더이다. /웹 어플리케이션 폴더/WEB-INF/lib 라이브러리 역할을 하는 jar 파일이 위치하는 폴더이다. JDBC 드라이버나 태그 라이브러리를 구성하는 jar 파일이 여기 위치한다. /웹 어플리케이션 폴더/WEB-INF/tld 태그 라이브러리 관련 설정 파일들이 위치한다. 태그 라이브러리는 19장에서 학습한다. /웹 어플리케이션 폴더/images images라는 이름 자체는 JSP/Servlet 컨테이너와 약속이 된 것은 아니지만 보통 이 폴더 내에 웹 어플리케이션과 관련된 모든 이미지 파일을 위치시킨다. 제3장
2. JSP의 처리 과정 및 Servlet과의 관계 2장에서 만든 다음과 같은 파일이 있는지 확인하고 브라우저에서 실행해보자. 그 다음 아래 경로 및 파일을 탐색기에서 확인해 보자. Tomcat 설치 폴더\webapps\jspbook\ch02\helloworld.jsp Tomcat 설치 폴더(*.java) \work\Catalina\localhost\jspbook\org\apache\jsp\ch02\helloworld_jsp.java Tomcat 설치 폴더(*.class) \work\Catalina\localhost\jspbook\org\apache\jsp\ch02\helloworld_jsp.class 제3장
2. JSP의 처리 과정 및 Servlet과의 관계 JSP 파일은 실행이 될 때 일단 Servlet인 Java 소스파일로 변환되고 다시 클래스 파일로 컴파일 됨 이 클래스 파일이 JSP/Servlet 컨테이너인 Tomcat 내에서 실행되어 그 결과가 최종적으로 웹 브라우저로 전달 제3장
2. JSP의 처리 과정 및 Servlet과의 관계 개발자에게 코딩하기 복잡한 Servlet 대신에 스크립트 언어인 JSP로 작성하게 하고 JSP/Servlet 컨테이너인 Tomcat이 내부에서 JSP 파일을 Servlet으로 변환 및 컴파일하여 클래스 파일을 메모리에 적재한 후 실행하여 응답한다. jspbook\ch02\helloworld.jsp 01 02 03 04 05 06 07 <%@ page contentType="text/html;charset=utf-8" %> <html> <body> <% out.println("Hello World!"); %> <br/> <% out.println("안녕하세요."); %> </body> </html> 제3장
2. JSP의 처리 과정 및 Servlet과의 관계 Tomcat 설치 폴더\work\Catalina\localhost\jspbook\org\apache\jsp\ch02\helloworld_jsp.java package org.apache.jsp.ch02; import javax.servlet.*; import javax.servlet.http.*; import javax.servlet.jsp.*; public final class helloworld_jsp extends org.apache.jasper.runtime.HttpJspBase implements org.apache.jasper.runtime.JspSourceDependent { ... 중간 생략 ... public void _jspInit() { } public void _jspDestroy() { public void _jspService(HttpServletRequest request, HttpServletResponse response) throws java.io.IOException, ServletException { ... 중간 생략 …} 제3장
2. JSP의 처리 과정 및 Servlet과의 관계 Tomcat 설치 폴더\work\Catalina\localhost\jspbook\org\apache\jsp\ch02\helloworld_jsp.java (계속) try { ... 중간 생략 ... out.write("\r\n"); out.write("<html>\r\n"); out.write("<body>\r\n"); out.println("Hello World!"); out.write(" <br/>\r\n"); out.println("안녕하세요."); out.write("</body>\r\n"); out.write("</html>\r\n"); } catch (Throwable t) { . .. 중간 생략 ... } finally { _jspxFactory.releasePageContext(_jspx_page_context); } JSP 파일에 작성한 내용이 이 곳에 존재함. out 객체의 write 메소드와 println 메소드가 JSP 파일의 내용을 출력시켜주는 역할을 수행 제3장
2. JSP의 처리 과정 및 Servlet과의 관계 제3장
2. JSP의 처리 과정 및 Servlet과의 관계 JSP 파일 수정 후 같은 JSP 재요청시의 동작 과정 JSP의 장점: JSP를 수정하면 Tomcat이 자동으로 변환 및 컴파일 수행 클래스 파일이 JSP 파일보다 이후에 만들어진 최신 클래스 파일인지 반드시 확인하여 수행 결과를 웹 브라우저로 보내준다 제3장
2. JSP의 처리 과정 및 Servlet과의 관계 SQL/JDBC MySQL/Oracle 제3장
3. Servlet의 이해 Servlet의 생성 배경 및 장점 JSP은 Servlet을 기반 으로 한 기술 Servlet은 기본적으로 Java 언어 기반이므로 Java 언어에 대한 프로그램 실력을 쌓는 것이 중요 제3장
3. Servlet의 이해 Servlet의 생성 배경 및 장점 [Servlet의 장점] ∙Java를 기반으로 하므로 Java API를 모두 사용할 수 있다. ∙쓰레드를 기반으로 하므로 웹 어플리케이션 서버 자원을 효율적으로 활용할 수 있다. ∙웹 어플리케이션에서 효율적인 자료 공유 방법을 제공한다. ∙비즈니스 로직과 프리젠테이션 로직을 분리할 수 있다. ∙컨트롤러와 뷰의 역할 분담으로 인해 웹 디자이너와 개발자 간의 효율적인 업무 분담이 가능하다. ∙유지보수가 수월하다. ∙기능 확장이 용이하다. ∙Servlet 컨텍스트 리스너 및 필터 Servlet 등 고급 프로그래밍 기법을 통해 보다 효과적인 웹 어플리케이션 설계가 가능해진다. 제3장
3. Servlet의 이해 Servlet 동작 과정과 생명주기 제3장
3. Servlet의 이해 Servlet 동작 과정과 생명주기 서블릿에 대한 사용자 요청 처리 과정 web.xml 파일을 참조해 URL 매핑(URL Mapping)을 확인 해당 Servlet 인스턴스로부터 스레드를 생성 service() 메소드 호출 즉, 모든 사용자 요청에 대해 개별적인 service() 메소드가 호출 GET 또는 POST 요청을 구분하여 doGet() 또는 doPost() 메소드가 호출됨 따라서 Servlet 개발자는 doGet() 또는 doPost() 메소드에 대부분의 필요한 기능을 구현한다. Servlet 구조 제3장
3. Servlet의 이해 Servlet 동작 과정과 생명주기 javax.servlet.http.HttpServlet 클래스를 상속하여 구현 개발자가 구현해야 할 부분은 doGet() 또는 doPost() 메소드에 작성 하지만, doGet()메소드에서 다시 doPost()를 호출하고 doPost() 내부에만 관련 처리 과정을 코딩하는 편이 편하다. javax.servlet.http.HttpServlet을 상속받은 MyServlet 동작 구조 제3장
3. Servlet의 이해 클라이언트 요청 #1 - GET 방식 단순히 서버에 있는 정보를 가져오기 위해 사용 특징 HTML, 이미지 등을 웹 브라우저에서 가져오기 위한 일반적 방식 서버로의 데이터 전달은 QUERY_STRING 환경변수를 통해서 가능 QUERY_STRING: 요청 URL에서 ‘?’ 이후의 값들. ‘속성=값’ 형태로 사용해야 하며 ‘&’는 여러 속성 값을 전달할 때 연결해주는 문자열이다. 클라이언트에서 서버로 전달할 수 있는 데이터 크기 (QUERY_STRING )는 최대 240Byte까지 가능하다. - 필요한 데이터를 검색할 때 필요한 key 값 등을 전달 요청 URL에 값들이 노출되기 때문에 ‘보안 문제’가 생길 수 있다. - 보내는 값이 URL 뒤에 붙어서 전송됨: 주소창에서 노출이 가능 데이터 조회용 웹 애플리케이션에 적합 제3장
3. Servlet의 이해 클라이언트 요청 #2 - POST 방식 클라이언트에 있는 정보를 서버로 올리기 위해 사용 특징 예를 들어 HTML 폼에 입력한 내용을 서버에 전달할 때 사용 서버에 전달할 수 있는 데이터 크기는 제한이 없다 URL에 전달하려는 정보 값이 표시되지 않는다. 그래서 로그인 정보를 전달할 때에는 POST 방식을 사용한다. 데이터 저장용 웹 애플리케이션에 적합 제3장
4. 첫번째 servlet 프로그램 -helloworldservlet 컴파일을 위한 환경 설정 일반적인 자바 프로그램의 라이브러리들이 위치한 곳 C:\Program Files\Java\jdk1.6.0_13\jre\lib 위 폴더의 rt.jar에 대부분의 표준 라이브러리들이 위치 위 폴더에 있는 .jar 및 .class들은 CLASSPATH 지원 없이 javac 프로그램 자체적으로 자동으로 검색하여 필요한 내용을 참조 Servlet 프로그램이 활용하는 라이브러리들이 위치한 곳 C:\apache-tomcat-6.0.18\lib 위 폴더의 servlet-api.jar 파일에 대부분의 라이브러리들이 위치 Servlet 소스 코드를 javac.exe 로 컴파일하기 위해서는 CLASSPATH 환경 변수에 등록 필요 컴파일시에 CLASSPATH 환경변수 값 설정 옵션: -cp javac -cp %CLASSPATH%;%CATALINA_HOME%\lib\servlet-api.jar HelloWorldServlet.java 기존의 CLASSPATH 환경 변수들도 그대로 설정 TOMCAT 이 설치된 폴더 (2장에서 등록한 환경변수) 제3장
4. 첫번째 servlet 프로그램 -helloworldservlet 컴파일을 위한 환경 설정 컴파일된 class 파일이 위치해야 하는 곳 \웹 어플리케이션 폴더\WEB-INF\classes 컴파일시에 컴파일된 class 파일이 위치해야 하는 곳 지정 옵션: -d 웹 어플리케이션 폴더가 jspbook일 때 다음과 같이 컴파일 – cp와 –d를 함께 사용하여 javac 명령을 새로 구성한 배치화일 javac -d %CATALINA_HOME%\webapps\jspbook\WEB-INF\classes HelloWorldServlet.java [예제 3.2 ] Java설치 폴더\bin\sjc.bat 01 - javac -cp %CLASSPATH%;%CATALINA_HOME%\lib\servlet-api.jar -d %CATALINA_HOME%\webapps\jspbook\WEB-INF\classes %1 sjc.bat 파일을 실행시킬 때 인자로 들어오는 Java 파일명으로 자동으로 대체됨 제3장
4. 첫번째 servlet 프로그램 -helloworldservlet Servlet 등록 및 URL 매핑 Servlet을 작성하여 실행하려면 반드시 JSP/Servlet 컨테이너에 등록을 시키고 관련 URL을 매핑하는 작업 필요 웹 어플리케이션의 배치 정의자 역할을 수행하는 web.xml에 기록 엘리먼트 설명 <servlet> 웹 어플리케이션 내에서 지칭하기 위한 Servlet 이름과 실제 Servlet 클래스 이름을 매핑하는 역할을 한다. <servlet-name>Servlet 이름</servlet-name> 웹 어플리케이션 내에서 지칭하는 Servlet 이름을 명기한다. <servlet-class>클래스 이름<servlet-class> 실제 Servlet 클래스 이름을 명기한다. 확장자 class는 포함하지 않는다. </servlet> <servlet>엘리먼트의 종료태그 <servlet-mapping> Servlet을 접근하기 위한 URL을 정한다. URL 매핑을 원하는 Servlet 이름을 명기한다. <url-pattern>URL</url-mapping> Servlet을 접근하기 위한 URL을 명기한다. 보통 "/" 으로 시작되며 "/"의 의미는 웹 어플리케이션의 루트를 의미한다. </servlet-mapping> <servlet-mapping>엘리먼트의 종료태그 제3장
4. 첫번째 servlet 프로그램 -helloworldservlet Servlet 등록 및 URL 매핑 컴파일한 서블릿을 “http://localhost:8080/jspbook/helloServlet” URL로 접근하기 위한 서블릿 매핑 방법 제3장
4. 첫번째 servlet 프로그램 -helloworldservlet Servlet 등록 및 URL 매핑 컴파일한 서블릿을 “http://localhost:8080/jspbook/servlets/helloServlet” URL로 접근하기 위한 서블릿 매핑 방법 <url-pattern> 태그 값에 “/servlets/helloServlet” 입력 [실습] 단계 1 jspbook 폴더 밑에 WEB-INF 폴더 생성 제3장
4. 첫번째 servlet 프로그램 -helloworldservlet [실습] – 단계 2 WEB-INF 폴더 내에 classes 폴더와 java_sources 폴더 생성 classes 폴더 명은 정확하게 기입 java_sources 폴더 명은 변경해도 상관없음 제3장
4. 첫번째 servlet 프로그램 -helloworldservlet [실습] – 단계 3 서블릿 코딩 [예제 3.1] jspbook\WEB-INF\java_sources\HelloServlet.java 01 02 03 04 05 06 07 08 09 10 - 11 12 13 14 15 16 17 18 19 20 import javax.servlet.*; import javax.servlet.http.*; import java.io.*; public class HelloWorldServlet extends HttpServlet { public void init() { // Servlet 객체 최초 생성시 한번만 호출 System.out.println("Init!!!"); } public void doGet(HttpServletRequest request, HttpServletResponse response) throws IOException, ServletException { // Servlet 요청시 매번 호출 System.out.println("doGet!!!"); response.setContentType("text/html"); PrintWriter out = response.getWriter(); out.println("<html><body bgcolor=\"yellow\">Hello Servlet!</body></html>"); public void destroy() { // Servlet이 메모리에서 삭제될 때 한번만 호출 System.out.println("destroy!!!"); 제3장
4. 첫번째 servlet 프로그램 -helloworldservlet [실습] – 단계 4 컴파일 WEB-INF 폴더 밑의 classes에 서블릿 클래스가 생성되었는지 확인 > cd C:\apache-tomcat-6.0.18\webapps\jspbook\WEB-INF\java_sources > sjc HelloWorldServlet.java 제3장
4. 첫번째 servlet 프로그램 -helloworldservlet [실습] – 단계 5 web.xml에 서블릿 등록 [예제 3.2 ] jspbook\WEB-INF\web.xml 01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 16 17 18 19 20 <?xml version="1.0" encoding="utf-8"?> <web-app xmlns="http://java.sun.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" version="2.5"> <description> JSPBOOK Examples. </description> <display-name>JSPBOOK Examples</display-name> <servlet> <servlet-name>helloServlet</servlet-name> <servlet-class>HelloWorldServlet</servlet-class> </servlet> <servlet-mapping> <url-pattern>/helloServlet</url-pattern> </servlet-mapping> </web-app> 제3장
4. 첫번째 servlet 프로그램 -helloworldservlet [실습] – 단계 5 웹 브라우저에서 실행 http://localhost:8080/jspbook/helloServlet 첫 번째 Servlet인 helloServlet 수행 확인 제3장
4. 첫번째 servlet 프로그램 -helloworldservlet [실습] – 단계 6 cmd 창에서 출력 결과 확인 init() 메소드와 doGet() 메소드 수행 확인 브라우저에서 새로고침할 때 마다 cmd 창 확인 새로고침할 때 마다 doGet() 메소드 수행 확인 제3장