-



<Servlet 이란 >


- 본 글은 http://dkatlf900.tistory.com/68 에서 퍼온글 이며 문제시 삭제 하겠습니다.

JSP의 기반 기술은 서블릿 입니다. 서블릿을 실습하지 않아도 JSP 학습에 큰 영향은 없지만 기초는 항상 중요하다는 걸 알고 있으실 겁니다.

이번 포스트에서는 서블릿이 무엇인지 알아보고 이클립스 위에서 서블릿으로 웹페이지 작성을 간단하게 해보겠습니다. 이전 JSP 파일 작성 포스트를 따라 해 보셨다면 서블릿과 비교하는 기회가 되어 왜 JSP를 사용하는지 어느 정도 아시게 될 겁니다. 

서블릿을 간단히 맛보기이니 세부적인 문법은 다루지 않습니다.


1. 서블릿 알아보기


2. 이클립스에서 서블릿 간단 작성하기.







서블릿을 이용하여 웹브라우저에 아래 사진처럼 나오도록 간단하게 만들어 보겠습니다.





1.서블릿 알아보기


서블릿은 자바 플랫폼에서 동적인 웹을 개발할 때 사용하는 기반 기술로서 웹에서 JAVA 프로그래밍을 할 수 있습니다. 사용자의 요청(Request)을 받아 요청한 대로 처리해주는(doGet() 또는 doPost() 메서드) 일을 한 후 처리결과를 사용자에게 응답(Response) 해줍니다.

그 외의 세부사항은 아래를 열어 주세요.


접기



가. 

서블릿에 대해서는 너무 많은 자료들이 있기에 찾아보던 중 설명이 너무 잘 되어있는 곳이 있기에 아래 링크에서 이론 기초를 읽히신 후 이클립스에서 서블릿 작성을 간단하게 보시면 이해가 더 잘 되실 것 같습니다. 

CGI 방식과 서블릿의 차이점 중 프로세스 부분을 좀 더 보시면 좋습니다.


http://www.imaso.co.kr/?doc=bbs/gnuboard.php&bo_table=article&wr_id=40915




나.  

위에서 어느정도 익히셨다면 좀더 다듬고 요약된 서블릿 동작 과정을 알아보겠습니다.


1.사용자의 URL 요청

-어떤 사용자의 URL 요청이 서블릿 요청이라는 것을 웹 서버가 알기 위해서는 사전에 웹 서버 측에 URL과 서블릿 클래스를 미리 매핑시켜 놓은 배포 서술자가 필요하다.

 

배포서술자(Deployment Descriptor) : DD, 웹서버가 알아 챌 수 있도록 적어 놓은 파일(web.xml)



2. request, response 객체 생성

-웹 컨테이너는 일단 지금 받은 요청을 처리하기 위해 HTTP 요청(Request)을 처리하기 위한 

request 객체와 HTTP 응답(Response)를 위한 response 객체를 생성한다.



3.서블릿 인스턴스와 스레드 생성

-request, response 객체가 생성된 뒤 사용자의 URL 요청이 어떤 서블릿 클래스를 필요로 하는지 배포 서술자를 통해 알아낸다.

만일 그 클래스가 웹 컨테이너에서 한 번도 실행된 적이 없거나 현재 메모리에 생성된 인스턴스(프로세스)가 없다면 새로 인스턴스를 생성하고(메모리에 로드하고) init()메소드를 실행하여 초기화 한 뒤 스레드를 하나 생성한다.

 

이미 인스턴스가 존재할 경우에는 새로 인스턴스를 생성하지 않고 기존의 인스턴스에 스레드만 하나 새로 생성한다.

각 서블릿 인스턴스는 웹 컨테이너당 하나만 존재하기 때문에 init() 메소드는 각 서블릿 당 한 번씩만 호출된다.



4.service() 메소드 호출과 서블릿 클래스 실행

-스레드가 생성되면 각 스레드에서 service() 메소드가 호출된다.

service()메소드가 호출되면 HTTP요청 방식이 GET방식일 경우에는 서블릿 클래스의 doGet()메소드가,

POST방식일 경우에는 doPost()메소드가 request, response 객체를 인자로 자동으로 호출된다.




5.응답과 스레드의 소멸

doGet() 또는 doPost() 메소드가 호출되어 사용자의 요청에 따른 동적인 웹 페이지를 생성하면 그 결과물이 담긴 reponse 객체를 웹 컨테이너가 HTTP 응답(Response) 형태로 바꾸어 웹 서버로 전송하게 된다.

그리고 사용이 끝난 Request와 Response 객체를 소멸시키고 스레드를 종료하게 된다.



하는일 정리

클라이언트 -->

   1.http://www.servlet.com/servlet  URL요청  


웹서버       -->   

   2.요청된 서블릿 확인 후 컨테이너로 요청  


컨테이너    -->

  3.컨테이너에서 request와 response 생성 후 web.xml(배포서술자)을 참조하여 해당 서블릿의

    스레드 생성 후 service 메소드 호출

 

  4.service() 메소드에서는 요청 방식에 따라 doGet이나 doPost() 메소드 호출


  5.doGet() 이나 doPost() 메소드에서 응답 생성            


                              참고: http://liketh.tistory.com/239

접기






2. 이클립스에서 서블릿 간단 작성하기.


가. 톰캣 설치 및 이클립스 연동  (이전 시간 포스트에서 진행했었습니다. 생략)

나. 서블릿(Servlet) 코드 작성

다. URL 과 서블릿(Servlet) 매핑(Mapping) 하기

라. 실행 후 웹브라우저에서 결과 확인



혹시나 이클립스에서 Servlet 생성방법 모르시면 열어보세요.


접기

1. good이라는 Dynamic Web Project를 만들었었죠? good 프로젝트 우 클릭 해서 Servlet 클릭.






2. 참고로 제가 이미 만든 이름을 또 사용한다는 오류이니 무시하세요.

  아래와 같이 package 패키지 디렉터리 명을 doo로 하나 만들었습니다.

  서블릿의 Class name 은 cho입니다. 참고로 클래스명은 맨 앞 글자는 대문자로 표기하시면 좋습니다.







3.URL mappings 의 /cho는 xml에서 사용자 요청 url 관련 매핑 이름인데 톰캣7.0부터 servlet 파일에 annotation 방식으로 대체할 수 있도록 추가되었다 하네요. 그래서 xml 설정 대신할 수 있다는 것인데 저희는 기초를 하고 있으니 알고만 있으시고 추가 검색해보세요. 







4.서블릿 클래스 생성시 옵션들입니다. doGet 과 doPost 가 있는데 저는 doGet 만 사용할 거라 doPost는 체크 해제했습니다. 둘 다 있어도 괜찮습니다.







5.이제 서블릿클래스가 생성되었습니다.  위치는 good - src - doo - cho.java 이곳에 있습니다.

   아래 빨간 박스만 제가 코딩 하였고 그외의 부분은 기본 서블릿 클래스 입니다.







접기



나.서블릿 코드 작성 


접기

//빨간 부분만 제가 작성하였고 그외는 다 똑같습니다. 혹시나 타이핑 하시면 import 확인해주세요.


package doo;


import java.io.IOException;

import java.io.PrintWriter;


import javax.servlet.ServletException;

import javax.servlet.annotation.WebServlet;

import javax.servlet.http.HttpServlet;

import javax.servlet.http.HttpServletRequest;

import javax.servlet.http.HttpServletResponse;


/**

 * Servlet implementation class cho

 */

//@WebServlet("/cho")  //이부분은 톰캣 7.0부터 지원되는 xml 매핑을 최소화 하기위해 사용하는 것으로 검색해보세요.저는 사용 안하도록 주석처리 했습니다.


public class cho extends HttpServlet {

private static final long serialVersionUID = 1L;

       

    /**

     * @see HttpServlet#HttpServlet()

     */

    public cho() {

        super();

        // TODO Auto-generated constructor stub

    }


/**

* @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)

*/

protected void doGet(HttpServletRequest requeste, HttpServletResponse response) throws ServletException, IOException {

// TODO Auto-generated method stub

response.setContentType("text/html;charset=euc-kr");

PrintWriter out=response.getWriter();

out.println("<html>"+"<body>"+"<h1>안녕하세요"+"<br/>"+"cho 서블릿 입니다. </h1> "+"</body>"+"</html>");

}


}




접기


src-doo패키지 - cho.java 서블릿 클래스를 만들어 코딩하겠습니다. 소스파일은 위에 참조하세요.







다.URL 과 서블릿(Servlet) 매핑(Mapping) 하기


좌측의 web.xml을 열면 우측의 빨간 박스 안의 것만 제가 추가한 코드이고 그 외는 기본으로 되어있을 겁니다.

매핑에 대해 간단히 설명하면 


1. 사용자가 웹페이지 도메인을 www.~~~/jooo  보여달라 요청하면

2. web.xml 또는 DD 라 불리는 이곳에서 검색을 합니다. /jooo라는 이름으로 요청이 왔는데 어떤 서블릿을 보여주면 되는지 찾습니다.

3. ServletTest라는 이름으로 서로 매핑되어있네요 /jooo로 요청이 오면  doo.cho라는 서블릿으로 연결해서 보여줘라고 web.xml에 설정하였습니다.


그렇다면 왜 매핑을 쓸까요? 뭣하러 사용자가 요청하는 서블릿의 이름은 jooo로 하고 서블릿 클래스 이름은 cho 인지 왜 이름을 다르게 설정하게끔 해놨을까요? 머리 아프게 괜히 복잡하게 말이죠. 

이에 대한 힌트는 디렉터리 구조, 보안과 관련되어있습니다. 한번 직접 알아 보시는것도 좋은 공부가 될듯하네요.



접기

<?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" 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>good</display-name>

  <welcome-file-list>

    <welcome-file>index.html</welcome-file>

    <welcome-file>index.htm</welcome-file>

    <welcome-file>index.jsp</welcome-file>

    <welcome-file>default.html</welcome-file>

    <welcome-file>default.htm</welcome-file>

    <welcome-file>default.jsp</welcome-file>

  </welcome-file-list>

  

  <servlet>

      <servlet-name>ServletTest</servlet-name>

      <servlet-class>doo.cho</servlet-class>

  </servlet>

  <servlet-mapping>

      <servlet-name>ServletTest</servlet-name>

      <url-pattern>/jooo</url-pattern>

  </servlet-mapping>

 

</web-app>

접기



라.실행 후 웹브라우저에서 결과확인





마무리/


서블릿에는 java 언어도, HTML 작성도 가능합니다. 그래서 HTML로 홈페이지의 기본 뼈대를 만들어주고 그 안에 내용을 채우는 방식으로 만들어 나갑니다. 그런데 HTML을 서블릿 클래스에 작성하려니 여간 까다로운게 아닙니다. 간단한 html 소스 정도는 쉽겠지만 정말 많은 양의 HTML을 서블릿을 통해 코딩한다는 건 고역이죠 쌍따옴표 하나만 깜빡해도 오류 나고 찾으려면 아휴.. 오래 걸려요 비효율적이죠 

그래서 JSP가 나왔습니다. HTML에다가 JAVA 코드를 넣기 위해서 말이죠.

이런 부분은 직접 경험해보셔야 합니다.


'웹( Web ) > Web Browser' 카테고리의 다른 글

header - user agant 란  (0) 2016.01.11
HTTP header - referer(레퍼러) 란  (0) 2016.01.10
세션 및 장점 과 쿠키의 차이점.  (0) 2016.01.10
세션(Session) 이란  (0) 2016.01.10
cookie(쿠키) 란 무엇인가  (0) 2016.01.10

다른 카테고리의 글 목록

웹( Web )/Web Browser 카테고리의 포스트를 톺아봅니다