[목차]

1. 서블릿 작성 규칙 

2. 서블릿 요청방법(서블릿 실행방법) 

3. 서블릿 요청정보 추출

4. JDBC

 

[내용]

서블릿
 - 클라이언트의 요청을 처리하기 위한 기술
 - 클라이언트가 요청하면 서버에서 실행되며 DB에 대한 처리, 서버의 리소스를 이용해서 만들어진 결과를 클라이언트에 응답한다.
 - 서버에 의해서 호출되기 때문에 서버가 인식하는 위치에 있어야 하며 서버가 찾아서 실행할 수 있도록 정해진 규칙에 따라 작성되어야한다.
(Context/WEB_INF/classes폴더)

 

 

1. 서블릿 작성 규칙
    1) 표준화된 폴더 구조 안에 서블릿 클래스가 위치해야한다.
    서블릿이 저장될 폴더 - classes폴더(서블릿 디렉토리)

    [표준화된 폴더 구조]

Context WEB_INF web.xml
    lib
    classes
  html, image, css, jsp  

   => classes 폴더에 서블릿이 없으면 서버가 찾을 수 없다.  (매핑 시엔 가능)

    2) 서버에 의해서 호출될 것이므로 반드시 public으로 작성해야한다.


    3) 서블릿 클래스가 되기 위해서 무조건 서블릿 클래스를 상속받아야한다.

Servlet(interface)   
 
Generic Servlet(abstact class) 서블릿의 일반적인 내용이 정의된 서블릿 클래스. 
destory(), init(), service() 
HttpServlet(abstact class) http프로토콜에 특화된 내용이 정의된 서블릿 클래스.
service(), do~~() 
사용자 정의 Servlet  

 

    4) 서버가 내부에서 호출할 메소드를 오버라이딩
    - 서버가 자동으로 호출하는 메소드를 call back메소드
    - 클라이언트가 요청을 하면 서버가 요청을 분석해서 서블릿 디렉토리에 존재하는 (미리 만들어서 저장해놓은)
    서블릿 클래스를 찾아서 적절한 상황에 해당 메소드를 자동으로 호출할 것이므로 그 상황에 맞게처리하고 
     싶은 내용을 각 메소드를 오버라이딩해서 구현한다.
    - 서버가 서블릿의 life cycle을 관리(객체가 생성돠고 객체를 메모리에서 해제하는 모든 작업)
    - 오버라이딩할 메소드는 life cycle과 연관되어 있는 메소드

 

    [오버라이딩할 메소드]
     - init() : 서블릿 객체가 초기화될때 호출되는 메소드.
     - service() : 클라이언트가 요청할때마다 호출되는 메소드
      => 클라이언트의 요청을 처리하는 메소드로 요청을 받고 처리할 내용을 구현.
      ex) 로그인, 게시판 목록보기, 메일읽기, 장바구니 조회, 구매, 예약, 예약정보 확인...

    doGet() : 클라이언트가 get방식으로 요청할때 호출되는 메소드.
    doPost() : 클라이언트가 post방식으로 요청할때 호출되는 메소드.
    destory() : 서블릿 객체가 소멸될때 호출되는 메소드.


    [객체 소멸 case]
    - 서블릿 클래스가 컴파일될 경우
    - WAS가 재부팅될 경우
    - context가 reload될 경우

 

* WAS 처리 동작

실행하려는 서블릿 객체가 메모리에 Loading되어 있는지 확인
(클라이언트 개수와 상관없이 한 서블릿당 1 객체로 운영)
---------------------------------------->
No : 서블릿 객체생성 ->init() -> 
쓰레드 생성 -> 응답, 요청객체 생성
service() -> doGet() or doPost() ->
비지니스 로직
----------------------------------------->
Yes

 

    5) 서블릿을 등록
     - 서버가 요청을 분석해서 서블릿 디렉토리에서 서블릿을 찾아서 실행할 수 있도록 등록.
     - 설정파일에 등록(web.xml)

     - 실제 작업은 anotation으로 설정.(servlet 3.0이상)

     - web.xml파일은 xml형식의 파일이며, 태그로 작성하며, 작성규칙(DTD - xml안에서 정의할 엘리먼트(태그)의 순서

     정의해야하는 필수 엘리먼트, 속성 등이 명시되어 있는 파일)에 따라 정확하게 등록해야한다.

        서블릿 클래스 등록
         => 무엇을

<servlet>
	<servlet-name>서블릿명(alias)</servlet-name>
	<servlet-class>서블릿클래스의 실제 경로(패키지를 포함한 서블릿클래스)</servlet-class>
</servlet>

 

ex) basic패키지에 작성한 FisrtServlet을 first라는 서블릿명으로 등록.

<servlet>
	<servlet-name>first</servlet-name>
	<servlet-class>basic.FisrtServlet</servlet-class>
</servlet>

 

        ② 서블릿 매핑
         => 어떻게
         => 등록된 서블릿을 어떻게 요청할 것인지 등록(어떤 url로 요청할 것인지)
         => 반드시<servlet>엘리먼트 다음에 위치해야한다. 즉 <servlet>엘리먼트와 함께 한 쌍으로 정의해야한다.
         => 위에서 등록한 서블릿을 어떻게 요청할 것인지 등록하는 엘리먼트

<servlet-mapping>
	<servlet-name>위에서 정의한 서블릿의 이름</servlet-name>
	<url-patten>요청할 서블릿의 path</url-patten>
           (반드시 /나 .으로 시작해야한다)
</servlet-mapping>

ex) 위에서 fisrt라는 이름으로 등록한 서블릿을 first.do

<servlet-mapping>
	<servlet-name>first</servlet-name>
	<url-pattern>/first.do</url-pattern>
</servlet-mapping>

 

        ③ @어노테이션 이용 서블릿 매핑하기

 Project Explorer창에서 Project 오른쪽 클릭 -> New -> Servlet -> Class name입력 -> Name(alias) 입력 ->
 URL mapping 입력 -> 오버라이딩할 메소드 or 생성자 선택

@WebServlet(name = "alias", urlPatterns = { "/URL" })
public class PostFormServlet2 extends HttpServlet {
	protected void doPost(HttpServletRequest request, HttpServletResponse response) 
                                             throws ServletException, IOException {
	}
}

 

2. 서블릿 요청방법(서블릿 실행방법)
    [일반 html문서]
    => http://서버ip:port/context명/정적파일명
       (프로토콜)

 

    [서블릿]
    => http://서버ip:port/context명/서블릿매핑명(web.xml <url-patten>에 등록한 path)

        

    1) get방식으로 요청
    => 클라이언트가 입력한 내용을 요청헤더에 저장하여 서버로 전송하는 방식 (255Byte미만)

    => 외부에 노출되어도 상관없는 데이터 송부시 사용.

    => 인코딩/디코딩 작업이 필요없어 처리속도가 빠름.

    => name1=value1&name2=value2,   공백은 +, %16진수로 전달.(영문, 숫자, 일부 특수문자 제외), ?뒤에 Query 

         String입력하여 전달가능.


        ① 주소표시줄에 입력해서 요청하는 방식
         => 테스트용으로 사용되거나 첫 번째 페이지에서 요청하는 경우


        ② 하이퍼링크로 요청  => 텍스트나 이미지를 클릭해서 서블릿을 요청

<a href="http://서버ip:port/context명/서블릿매핑명">서블릿 요청</a> 
<a href="/context명/서블릿 요청url">서블릿 요청</a> 
<a href="/serverweb/서블릿 매핑명">서블릿 요청</a>


        ③ <form>태그의 method속성을 get으로 정의하고 submit버튼을 눌러서 요청하는 경우
         => method속성을 생략하면 get방식(default)

<form action="요청할 web application파일의 path" method="get">
	<input type="text" name="id" />
	<input type="password" name="pass">
	<input type="submit" value="서블릿요청">
</form>

        => submit버튼을 누르면 <form></form>태그 사이에 정의된 모든 양식 태그의 namevalueaction속성

            정의된 서블릿에 요청(실행)하며 등록된 서블릿에게 method속성 요청방식(get)으로 전송한다.

 

    2) post방식으로 요청
        ① <form>태그의 method속성을 post로 정의하고 submit버튼을 눌러서 요청하는 경우

<form action="요청할 web application파일의 path" method="post">
	<input type="text" name="id" />
	<input type="password" name="pass">
	<input type="submit" value="서블릿요청">
</form>

        => submit버튼을 누르면 <form></form>태그 사이에 정의된 모든 양식 태그의 name과 value가 action속성에

             정의된 서블릿으로 요청(실행)하며 등록된 서블릿에게 method속성 요청방식(post) 방식으로 전송한다.

 

 

3. 서블릿 요청정보 추출

public class 서블릿 클래스명 extends HttpServlet{
	public 서블릿 클래스명() { // 생성자
	}
    
	public void init() { // 생성자 호출 후 한번만 호출
	}
	
	public void service(HttpServletRequest req, HttpServletResponse res) 
	throws ServletException, IOException{ 
	// 상위클래스의 service 메소드에서 메소드 요청방식에 따라 doGet,doPost를 자동으로 호출함으로
	// 오버라이딩할 경우 사용자에 맞게 doGet(), doPost()를 연결하여야 한다.
		if(req.getMethod().equals("GET")) {
			doGet(req,res);
		}else {
			doPost(req,res);
		}
	}
	
	public void doGet(HttpServletRequest req, HttpServletResponse res)
	throws ServletException, IOException{
	}
	
	protected void doPost(HttpServletRequest req, HttpServletResponse resp)
	throws ServletException, IOException {	
		req.setCharacterEncoding("UTF-8"); //요청정보에 문자셋을 적용하여 한글을 셋팅
		resp.setContentType("text/html;charset=UTF-8");
		//text/html; : MIME타입(응답형식), charset=UTF-8 : 응답데이터에 적용할 문자셋
		
		//응답정보를 클라이언트로 전송하기 위한 스트림객체를 response에서 구하기
		PrintWriter out = resp.getWriter();
		//요청정보를 추출
		String id = req.getParameter("id"); // name(key)으로 값(value) 추출
		String pass = req.getParameter("pass");
		String[] item = req.getParameterValues("item"); // value가 여러개일 경우 배열로 받는다.
	}
    
	public void destroy() {//객체 소멸시 호출.
	}
}

    1) setCharacterEncoding("UTF-8") : 요청정보에 문자셋을 적용하여 한글을 셋팅
    2) setContentType("text/html;charset=UTF-8") :
         text/html; : MIME타입(응답형식)

         charset=UTF-8 : 응답데이터에 적용할 문자셋


    3) PrintWriter out = resp.getWriter() : 응답정보를 클라이언트로 전송하기 위한 스트림객체를 response에서 구하기 
    4) 요청정보를 추출
      String id = req.getParameter("name") : name(key)으로 값(value) 추출
      String[] item = req.getParameterValues("name") : value가 여러개일 경우 배열로 받는다.

 

    5) String str = req.getQueryString() : get방식에서만 사용가능하며, 요청정보의 ? 다음 문자열 전체를 받아온다.

    6) ServletInputstream in= req.getInputStream() : post방식에서 사용. 요청정보의 몸체와 연결된 입력스트림을

        받아온다.

ServletInputstream in= req.getInputStream();
int len = req.getContextLength();
byte[] buffer = new byte[len];
in.readLine(buffer,0,len);
String str = new String(buffer);

 

 

 

<tip>

* 웹구조

Web browser
(client)
request
(header+body)
--------------->

<---------------
response
WAS
(Web Server 
+ Contationer)
--------------->
<---------------
Servlet 서버의 자원
--------------->
<---------------

DBMS

 

 

* 비지니스 로직 분리

                   Servlet
1. 클라이언트의 요청정보를 추출
2. 비지니스 메소드 호출
3. 클라이언트에 응답할 메시지를 생성
매개변수
--------------->

<---------------
리턴값
비지니스 로직

 

* import가 되지않을때

 

Project Explorer창 - Dynamic 파일 오른쪽 클릭 - Build Patch - Configure Build Patch  -Libraries - Add library - Server Run time - Next - finish - Apply 



* 이클립스 창 확대 단축키 : ctrl + M

* error
404 - 파일을 찾을 수 없다.
405 - 요청한 방식의 메소드가 없을 경우

 

+ Recent posts