2013. 7. 29. 14:23

Servlet

: 서블릿은 Sun 사에서 내놓은 기술로서 Java 라는 언어를 기반으로 하여 동적인 컨텐츠를 생성하며Java 코드 안에 HTML 태그가 혼재되어 있어서 그 효율성이 떨어진다.


서블릿은 멀티쓰레딩에 의해 사용자 요구를 처리하고 가공해서 이에 대한 결과를 보내며, 서블릿과 JSP 는 상호 연계되어 JSP에서 정적인 부분을 담당하고 서블릿 에서는 동적인 처리를 위한 부분으로

사용 되어 보다 효율적인 웹 사이트를 구성 할 수 있다. 즉, JSP 는 주로 사용자용 뷰(View) 의 구현에 사용되고 서블릿은 사용자용 뷰와 프로그램 로직사이를 제어해주는 역할에 주로 사용 되어 진다.


서블릿은 Servlet 인터페이스를 구현하여 GenericServlet을 만들고 이를 다시 http 프로토콜에 맞게확장한 HttpServlet 클래스를 상속한 후 내부 메소드를 재정의 하여 사용한다. 그리고 HttpServlet 클래스는 상속한 후 재정의해서 사용할 수 있는 주요 멤버 메소드인 service(), doGet(), doPost(),doHead() 메소드를 가지고 있다.


■ 서블릿의 동작 순서

1) 클라이언트의 요청

2) 서블릿 Handler  8080포트에서 요청 받음

3) 서블릿 컨테이너에서 해당 서블릿 검색

4) 해당 서블릿이 데이터베이스 작업을 해야 한다면 DB연결,

5) 모든 작업이 완료 되었다면 응답으로 결과를 리턴 한다.



 ■ 서블릿 작성 방법

ο 서블릿 클래스 작성

    1. 다음의 한가지 방법을 이용하여 서블릿 클래스를 작성 한다.

       1) 첫번째 방법

     GenericServlet abstract 클래스를 상속 받는 서블릿 클래스를 작성하여

     abstract void service(ServletRequest req, ServletResponse res) 메소드를 재정의 한다.

       2) 두번째 방법

            HttpServlet 클래스를 상속 받는 서블릿 클래스를 작성하여 다음의 메소드를 재정의 한다.

      - GET 방식을 처리하는 경우

              void doGet(HttpServletRequest req, HttpServletResponse resp)

      - POST 방식을 처리 하는 경우

               void doPost(HttpServletRequest req, HttpServletResponse resp)


ο WEB-INF/web.xml 파일에서 환경 설정

 : 디플로이먼트 디스크립터(deployment descriptor, 배포 설명자) 파일

     <servlet> 과 <servlet-mapping> 태그를 이용하여 서블릿을 uri와 매핑 한다.

 
          서블릿이름
          패키지명을 포한한 서블릿 클래스 파일명
      

      
          서블릿이름
         경로패턴
     

.../.../WebContent/WEB-INF/web.xml: 톰캣의 동작을 정의하는 환경설정 파일





study
 
   index.html
   index.htm
   index.jsp
   default.html
   default.htm
   default.jsp
 


fServlet
com.svt.FirstServlet
 //톰캣이 생성한 객체의 service()를 호출한다.

 //언제?
fServlet
/first // url 패턴을 찾을 때

//service() 메서드는 GenericServlet 클래스에 존재하며 HttpServlet클래스는 이 GenericServlet 클래스를 상속한다. 따라서 HttpServlet클래스를 상속받은 클래스는 service() 메서드를 갖게 된다.


//service() 메서드는 같은 클래스의 doGet() 또는 doPost()를 실행하도록 정의되어 있다.

만약 전송방식(request객체의 getMethod())을 알 수 없다면 doGet()을 호출한다.


 

URI-pattern 유형

1) 이그잭틀리 매칭(Exactly matching)  : 반드시  "/"로 시작해야 한다.

  예)   /User/abc

2) 디렉토리 매칭(Directory matching)  : 반드시  "/"로 시작하고,  "*"로 끝나야 한다.

  예)  /User/* →  *  : 모두

3)  Extension matching  :  "/"로 시작하면 안 되고, 확장자로 끝나야 한다.

  예)  *.do





■  디플로이먼트 디스크립터(deployment descriptor,  배포 설명자)  이점

 ⋅이미  테스트된 소스 코드에  대한 수정을 최소화  한다.

 ⋅소스  코드  없이 애플리케이션을 목적에  맞게 수정할  수  있다. 

 ⋅코드  변경이나 컴파일을  하지  않고도 서버  자원(DB 등등)을  바꿀 수  있다.

 ⋅접근  제어 목록, 보안  역할과 같은 보안에  관련된  업무도 관리할  수  있다.

 ⋅xml  파일로 되어  있으므로 프로그래머가  아닌 사람도 설정할  수  있다.

■ web.xml  파일의  태그

 ⋅icon  : 웹  애플리케이션을  나타내기 위해  IDE나 GUI  툴에서  사용 되는  하나  또는  두  개의  이미지  

   파일들의 위치를  지정하는데  사용한다.

 ⋅display-name  : GUI  툴이 웹  애플리케이션을 표시하기 위해  사용하는  이름을 지정 하는데 사용

 ⋅description  : 웹  어플리케이션에  대한 설명을  나타낸다.

 ⋅distributable  : distributable  요소가  있다는 것은 웹  어플리케이션이다 중  서버  간에  분산  배치 될 수  있다는 것을 

   의미한다.

 ⋅context-param  :  어플리케이션의 초기화 파라미터를 선언하는데  사용

 ⋅filter  : 서블릿이나 jsp  페이지로 들어오는 요청정보를  사전에 걸러내는 기능

 ⋅filter-mapping  : 필터를  지정했다면 filter-mapping을  지정하여 하나  이상의 서블릿과  연결함

 ⋅listener  :  서블릿2.3  버전으로부터  세션이나  서블릿  컨텍스트가  생성  또는  수정  되거나  소멸되는 것을  알려주는 

  이벤트  리스너

 ⋅servlet  : 서블릿이나 jsp  페이지에  초기화파라미터나사용자url  들을  할당  할  때 사용되는  서블릿이나 jsp  이름을 지정

 ⋅servlet-mapping  : 상대 url  경로를 좀  더 쉽게  다루기 위해  기본 url를  변경 할  때 사용

 ⋅session-config  :  일정  시간  동안  세션으로  접근이  없을  경우  서버는  메모리를  절약하기  위해  사용  하지  않는  

  메모리를 삭제한다. 세션의  시간 유지  기능

 ⋅mime-mapping  : 특정한 mime형을 가진 파일을 웹  어플리케이션에  넣어 두고 싶은  경우 사용

 ⋅welcome-file-list  :  url이  파일명이  아닌  디렉토리  명으로  받았을  경우  기본적으로  불러올 파일명을 지정하는데 사용

 ⋅error-page  : http  상태코드가  반환되거나 예외가  발생했을 때 그  내용을 출력하는 페이지

 ⋅tag-lib  :  태그라이브러리 설명자  파일의  별칭을 지정하는데  사용

 ⋅resource-envref  : 자원(resource)과  연관  되어  관리  되는  객체를  선언하는  역할을 한다.

 ⋅resource-ref  : resource-ref 요소는 외부에서  참조해야 할  자원을 선언할  때 사용

 ⋅security-constraint  :  url이  보호  되도록  지정하는  역할을  한다.  login-config와  연결되어 사용

 ⋅login-config  : 보안된 페이지로 들어가려는  사용자에  대한 서버의  인증  방식을 지정해 준다.

 ⋅security-role  : 통합개발 환경에서  보안  정보를 좀  더 조작하기 쉽게  만들어준다.

 ⋅env-entry  : 웹  어플리케이션의 환경  항목을 선언한다.

 ⋅ejb-ref  :  엔터프리이즈  빈의 홈에  대한  레퍼런스를 선언

 ⋅ejb-local-ref  :  엔터프라이즈  빈의 로컬  홈에  대한 레퍼런스를 선언


* ServletRequest : 클라이언트의 요청을 받음

* ServletResponse : 클라이언트의 요청에 응답

위 클래스는 인터페이스로 자바에서 객체를 직접 생성할 순 없다.(톰캣이 처리함)



1. GenericServlet 을 상속받는 경우


public class FirstServlet extends GenericServlet { private static final long serialVersionUID = 1L; @Override public void service(ServletRequest req, ServletResponse resp)throws ServletException, IOException { //service() 메소드 : 클라이언트가 요청할 때마다 호출되는 메소드 Calendar now = Calendar.getInstance(); String str = String.format("%1$tF %1$tT", now); //서버에서 클라이언트에게 전송하는 문서타입 설정 resp.setContentType("text/html;charset=utf-8"); //서버에서 클라이언트로 전송하기 위한 출력 스트림 PrintWriter out = resp.getWriter(); //서버에서 클라이언트로 데이터 전송 out.println(""); out.println(""); out.println("처음 작성해 보는 서블릿 프로그램
"); out.println("현재 날짜 및 시간 : " + str); out.println(""); out.println(""); } }


public class DemoServlet extends GenericServlet {
 private static final long serialVersionUID = 1L;
 
 @Override
 public void destroy() {
  // 서블릿이 메모리에서 해제되기 직전에 한 번만 실행
 }

 @Override
 public void init(ServletConfig config) throws ServletException {
  // 서블릿이 메모리에 로딩됨과 동시에 한 번만 실행. 초기화 목적으로 사용
 }
 
 /*
  * service() 메서드
  *   클라이언트가 호출할 때 마다 실행되어지는 메서드
  *   ServletRequest: 클라이언트의 요청을 전달 받기 위한 클래스
  *     클라이언트 -> 서버
  *   ServletResponse: 클라이언트에게 응답하기 위한 클래스
  *     서버 -> 클라이언트

 @Override 
public void service(ServletRequest req, ServletResponse resp)
   throws ServletException, IOException
{
 // 클라이언트에서 서버로 전송되는 인코딩 설정
 req.setCharacterEncoding("utf-8");
  
 // 클라이언트에서 전송된 데이터 받기
 String name = req.getParameter("name");
 int age = Integer.parseInt(req.getParameter("age"));
 String msg = name + "님";
 if (age >= 19)
  msg += "의 나이는 " + age + "세이고 성인입니다.";
 else
  msg += "의 나이는 " + age + "세이고 미성년자입니다.";
 
 // 서버에서 클라이언트로 전솓되는 문자 타입
 resp.setContentType("text/html; charset=utf-8");
 
 // 서버에서 클라이언트로 전송하기 위한 출력 스트림
 PrintWriter out = resp.getWriter();
 
 // 전송하기
 out.println("");
 out.println(msg);
 out.println("");
}

2. HttpServlet 을 상속받는 경우


public class BoardServlet extends HttpServlet
{
 private static final long serialVersionUID = 1L;

//service()는 클라이언트의 요청 시 전송방식에 따라
//doGet()이나 doPost() 메서드를 실행하도록 프로그램 되어 있다.
//전송방식을 알 수 없으면 get이라 간주한다.

 @Override
 protected void doGet(HttpServletRequest req, HttpServletResponse resp)
throws ServletException, IOException
 {
  process(req, resp);
 }

 @Override
 protected void doPost(HttpServletRequest req, HttpServletResponse resp)
throws ServletException, IOException
 {
  process(req, resp);
 }
 
 protected void forward(HttpServletRequest req, HttpServletResponse resp, String path)
throws ServletException, IOException
 {
  //서블릿의 포워딩 방식
  RequestDispatcher rd = req.getRequestDispatcher(path);
  rd.forward(req, resp);
 }
 
 protected void process(HttpServletRequest req, HttpServletResponse resp)
throws ServletException, IOException
 {
  req.setCharacterEncoding("utf-8");
  
  String cp = req.getContextPath();
  String uri = req.getRequestURI(); //클라이언트가 요청한 URI


  BoardDAO dao = new BoardDAO();
  MyUtil util = new MyUtil();
  
  if(uri.indexOf("list.kh") != -1) //URI에 따른 응답을 달리한다.
  {
   //게시물 리스트
   forward(req, resp, "/sbbsView/list.jsp");
  } else if(uri.indexOf("created.kh") != -1)

  {
   //글쓰기 폼
   forward(req, resp, "/sbbsView/created.jsp");
  } else if(uri.indexOf("created_ok.kh") != -1)
                  //request의 uri가 "created_ok.kh"를 포함하면
  {
   BoardDTO dto = new BoardDTO();
   dto.setSubject(req.getParameter("subject"));
   dto.setName(req.getParameter("name"));
   dto.setContent(req.getParameter("content"));
   dto.setPwd(req.getParameter("pwd"));
   
   dto.setIpAddr(req.getRemoteAddr());
   
   dao.insertBoard(dto);
   
   resp.sendRedirect(cp + "/sbbs/list.kh");
  }
 }
}


'JSP > JspServlet' 카테고리의 다른 글

JSP 페이지기본설정  (0) 2013.07.29
JSTL  (0) 2013.07.29
Servlet list 작성  (0) 2013.07.29
JSP 개요  (0) 2013.07.29
연산자 검색  (0) 2013.07.29
Posted by 1+1은?