Java Servlet


JSP가 나오기 전에 먼저 출현
Servlet은 자바소스코드(.java)로 구현된 후 사용자가 직접 컴파일 (javac이용)한 후 웹서버/서블릿 엔진에 올려야 한다.
Servlet+JSP Model2
Model2는 Servlet-JSP-JavaBeans를 연동하여 사용하는 방식
Servlet에서 사용자의 요청을 받아서 선처리한 후, 적합한 JSP/JavaBeans에게 요청을 포워딩하여 JSP가 사용자에게 응답할수 있도록 하는 개발 방법

 

서블릿은 RequestDispatcher객체를 통해 사용자의 원래 요청을 다른 서블릿이나 JSP페이지등과 같은 다른 동적 웹 자원으로 전달한다.

 

 

[서블릿 실행을 위한 톰캣 환경 설정]


/tomcat6/conf/server.xml-----------------------------------------
69행
    <Connector port="9090" protocol="HTTP/1.1"
               connectionTimeout="20000"
               redirectPort="8443" URIEncoding="UTF-8"/>


/tomcat6/conf/context.xml--------------------------------------
19행
    <Context reloadable="true" privileged="true">


/tomcat6/conf/web.xml--------------------------------------
127행 주석제거
    <servlet>
        <servlet-name>invoker</servlet-name>
        <servlet-class>
          org.apache.catalina.servlets.InvokerServlet ->서블릿을 사용하기 위해서 진입하는 곳
        </servlet-class>
        <init-param>
            <param-name>debug</param-name>
            <param-value>0</param-value>
        </init-param>
        <load-on-startup>2</load-on-startup>
    </servlet>

387행 주석제거
    <servlet-mapping>
        <servlet-name>invoker</servlet-name>
        <url-pattern>/servlet/*</url-pattern> 

              -> 우리가 요청하는 패턴. servlet가상경로가 싫으면 /*해도 되지만, 기본환경설정은 건드리지 말것
    </servlet-mapping>


---------------------------------

java.lang.NoClassDefFoundError에러

 

Project->Properties->Java Build Path -> Libraries -> Add External JARs...
-> 톰캣설치폴더\lib\servlet-api.jar 추가
---------------------------------

 


[서블릿(Servlet)의 기본]

 

1) 서블릿의 개요
- JSP와 서블릿은 자바 기반으로 만들어진 웹 프로그래밍 언어이다
- 서블릿이 자바 코드에 의존적이라면 JSP는 덜 의존적이라 프로그래밍하기가 더 쉽고 편하다

 

2) 서블릿의 동작 원리
- Servlet클래스 작성 : GenericServlet 클래스 또는 HttpServlet클래스 상속받는다
- javax.servlet과 javax.servlet.http의 클래스와 인터페이스를 이용해 만든다
- 서블릿은 main()메소드를 갖지 않는다.

  서버가 서블릿에 요청을 전달할 때마다 서블릿의 service()메소드가 호출된다

 

3) 서블릿의 요청과 응답의 과정에서 웹컨테이너(톰캣)가 하는일
- 객체가 있는지 유무판단, 없으면 생성
- Thread생성
- Service()호출
- Service()가 doGet()자동 호출

4) 서블릿의 요청과 응답의 과정에서 Service() 메소드가 하는일
- request가 올 때마다 doGet()호출
- doGet()은 HttpServlet에 의해 지원 받는 몇몇 Service()중 하나이다.

----------------------------------

 

 

예제) 간단한 서블릿 만들기

 

HelloServlet.java------------------------------------


package part.control;

import java.io.IOException;
import java.io.PrintWriter;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

public class HelloServlet extends HttpServlet {

   //웹브라우저의 요청을 받는 서비스 메소드
    public void doGet(HttpServletRequest req, HttpServletResponse res)
    throws ServletException, IOException{
       res.setContentType("text/html;charset=euc-kr");
       try {
           PrintWriter out = res.getWriter();
           out.println("<HTML>");
           out.println("<HEAD><TITLE>Hello Servlet</Title></Head>");
           out.println("<BODY>");
           out.println("하하하...");
           out.println("</BODY>");
           out.println("<HTML>");
           out.close();
       }catch(Exception e){
           getServletContext().log("Error in HelloServlet:",e);
       }
    }
}

 

 

결과확인
http://localhost:9090/mvc/servlet/part.control.HelloServlet

-----------------------------------------------------------------------

 

 

예제) 서블릿에서 폼 데이터 처리

 

/control/greet.html------------------------------------------------


<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
 <meta http-equiv="Content-Type" content="text/html;charset=euc-kr">
<TITLE> 폼과 서블릿의 만남  </TITLE>
</HEAD>
<BODY>
<!-- 1)JSP 방식 : action="greetok.jsp" -->
<!-- 2)서블릿 방식: action="Greet" -->
<form method="get" action="/mvc2Test/servlet/Greet">
  당신의 아이디는
  <input type="text" name="id"><p>
  <input type="submit" value="확인">
</form>
</BODY>
</HTML>

 

 

greetok.jsp--------------------------------------

 

<%@ page language="java" contentType="text/html; charset=EUC-KR"
    pageEncoding="EUC-KR"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=EUC-KR">
<title>greetok.jsp</title>
</head>
<body>

당신의 아이디는
<%
String id=request.getParameter("id");
out.print(id);
%>
님 환영합니다.

</body>
</html>

 

 

Hello.java--------------------------------------------------------

 

package part.test;

import java.io.IOException;
import java.io.PrintWriter;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

public class Greet extends HttpServlet {
    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp)
            throws ServletException, IOException {
       
        resp.setContentType("text/html;charset=euc-kr");
        String id=req.getParameter("id");
        try {
            PrintWriter out=resp.getWriter();
            out.println("<HTML>");
            out.println("<HEAD><TITLE>form&servlet</TITLE></HEAD>");
            out.println("<BODY>");
            out.println("당신의 아이디:");
            out.println("<font color=red><strong>");
            out.println(id);
            out.println("</strong></font>");
            out.println(" 님<br>방문을 환영합니다.");
            out.println("</BODY>");
            out.println("<HTML>");
            out.close();
        }catch(Exception e){
            getServletContext().log("Error in HelloServlet:",e);
        }
    }
}

web.xml------------------------------------
  <servlet>
    <servlet-name>Hello</servlet-name>
    <servlet-class>part.control.Hello</servlet-class>
  </servlet>

 

 

 

[서블릿의 라이프 사이클]


- init() 단 1번만 호출
  서블릿이 서비스하기 위해 필요한 초기화 작업을 수행
- service() request당 1개씩 호출
   클라이언트의 요청이 있을때마다 실행
- destroy() 1번만 호출. 관리 컨테이너가 종료될때
                                 타임아웃되었을때
                                 클래스의 내용이 변경되었을때(재컴파일) 호출

- 서블릿이 처음에 로드되면 init()메소드가 실행
- init()메소드가 service()메소드 호출 

 


LifeCycle.java-----------------------

 

package part.control;

import java.io.IOException;
import java.io.PrintWriter;

import javax.servlet.ServletConfig;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

public class LifeCycle extends HttpServlet {
    int loc=0;
    @Override
    public void init(ServletConfig config) throws ServletException {
        // TODO Auto-generated method stub
        System.out.println("init()");
        System.out.println("loc="+loc);       
    }
   
    @Override
    protected void service(HttpServletRequest arg0, HttpServletResponse arg1)
            throws ServletException, IOException {
        // TODO Auto-generated method stub
        System.out.println("service()");
        loc++;
        System.out.println("loc="+loc);
    }
   
    private void destory() {
        // TODO Auto-generated method stub
        System.out.println("destory()");
    }
   
}

============================================

 

'..열심히 공부하세.. > MVC' 카테고리의 다른 글

[06] 서블릿 요청 커맨드 패턴 (~~~.do)  (0) 2012.06.23
[05] Model1방식과 MVC 패턴의 개요 및 커맨드 패턴  (0) 2012.06.21
[03] 커스텀태그  (0) 2012.06.19
[02] JSTL  (0) 2012.06.19
[01] 표현언어  (0) 2012.06.18

+ Recent posts