2011. 1. 24. 15:55

group study.

서블릿

Servet = > 1. 서버에서 실행되는 자바 컴포넌트
               2. HTTP 요청을 받아서 처리
               3. HTTP 응답을 동적으로 만들어서 처리
               4. Web Container에서 실행
                     (Web Container : Servlet과 Thread pool을 관리하는 특별한 형태의 JVM)


head   url, HTTP1.1, Cookie
body   data

  [클라이언트가 보내는 요청 방식]
※GET방식
head  http://○.○.○/○.jsp?name=kim  
※POST방식
head http://○.○.○/○.jsp
body name = kim

1) GET :  요청정보를 head에다 담아가는 방식. (ex) http://***.***.***/login.jsp?user=kim&pass)
특별히 어느 방식으로 요청하지 않으면 GET이 Default 방식이 된다.
Bookmarking같은 것이 필요한 경우에는 반드시 GET방식으로 써야 한다.
(눈에 보여도 상관없는 경우도 OK.)
2) POST : 요청정보를 body에다 담아가는 방식 사용  (ex) user = kim & pass = 1, 2, 3
서버에게 보내야 하는 데이터가 경우, 전송데이터에 보안이 요구되는 경우
3)PUT ( 파일을 올릴때 ) [자주 사용하진 않음] 
4)DELETE ( 삭제 할 때 ) [자주 사용하진 않음]

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 FirstServlet extends HttpServlet {
 private static final long serialVersionUID = 1L;
     public FirstServlet() {
        super();
        // TODO Auto-generated constructor stub
    }
    //새로 생성. doGet방식으로 들어오든, doPost방식으로 들어오든(요청)
    //같은 방식으로 처리하겠다.
    protected void process(HttpServletRequest request,
      HttpServletResponse response) throws ServletException, IOException {
  // TODO Auto-generated method stub
     response.setContentType("text/html;charset=utf-8");
     PrintWriter out = response.getWriter();
     out.println("<b>환영합니다</b>"); //respontse가 알아서 씀.\
  out.close();
  //이 페이지를 요청하면 환영합니다. 하고 끝~
 }
   
 protected void doGet(HttpServletRequest request,
   HttpServletResponse response) throws ServletException, IOException {
  // TODO Auto-generated method stub
  process(request, response);
 }
 protected void doPost(HttpServletRequest request,
   HttpServletResponse response) throws ServletException, IOException {
  // TODO Auto-generated method stub
  process(request, response);
  
 }
}


[서블릿 클래스의 기능을 이해하고 생성할 수 있다.]
 HttpServlet
 init();
 service(request,response);
    ->doPost(request, response)
    ->doGet(request, response)
 destroy();

 Servlet Life Cycle
1. load servlet class
2. create sevlet instance
3. Call the init method
4. Call the service method
    서비스는 종류에 따라 달리 불러질 것
    GET - doget
    POST - dopost
5. Call the destroy dethod

The web container manages the life cycle of a servlet instance
These methods should not be called by your code. 




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 FirstServlet extends HttpServlet {
 private static final long serialVersionUID = 1L;
 private int count;
 
 public FirstServlet() {
        super();
        // TODO Auto-generated constructor stub
    }

 
 /*
  * init()
  * 서블릿을 시작할 때 호출한다.
  * 시작할 때 무엇인가를 처리하고 싶다면..
  * init()에 처리
  */
 @Override
 public void init() throws ServletException {
  // TODO Auto-generated method stub
  super.init();
  count = 100;
  System.out.println("init() called... count = " + count);
  //콘솔에 창 띄움.
 }
 
 /*
  * destroy()
  * 서버를 종료시키면 호출된다.
  * 서블릿을 종료시킬 때 처리하고 싶은 것이 있다면...
  * destory()에 처리
  */
   @Override
 public void destroy() {
  // TODO Auto-generated method stub
  System.out.println("destroy() called... count = " + count);
 }
 
 
 
    //새로 생성. doGet방식으로 들어오든, doPost방식으로 들어오든(요청)
    //같은 방식으로 처리하겠다.
   protected void process(HttpServletRequest request,
      HttpServletResponse response) throws ServletException, IOException {
  // TODO Auto-generated method stub
     response.setContentType("text/html;charset=utf-8");
     PrintWriter out = response.getWriter();
     out.println( "<b>환영합니다" + (count++) +"번째 방문객입니다.</b>"); //respontse가 알아서 씀.\
  out.close();
  //이 페이지를 요청하면 환영합니다. 하고 끝~
 }
   
   /*
    * 서비스는 종류에 따라 불러짐.
    * get - doget
    * post - dopost
    */
    protected void doGet(HttpServletRequest request,
   HttpServletResponse response) throws ServletException, IOException {
  // TODO Auto-generated method stub
  process(request, response);
 }

 protected void doPost(HttpServletRequest request,
   HttpServletResponse response) throws ServletException, IOException {
  // TODO Auto-generated method stub
  process(request, response);
  
 }
}








 

JSP용도 : 프레젠테이션.(보여주기만 하는것)
Client의 요청을 서블릿에게 보내줌...!!!!!!
클라이언트에게 요청이 들어오면 그 요청을 서블릿이 받아서 처리할 것
서블릿은 내가 호출하는 것이 아니라, 
클라이언트가 요청을 보내면 Web Container()가 받아서,,, Web Container가 Request에 해당하는 객체를 자동적으로 만들어줌.
그 과정에서 만들어진 HttpServerRequest와 HttpServerResponse에 의해 init, doget, dopost, destroy 부름..

 

request와 response객체를 이해한다.
   HttpServlet Request
       getHeanerName()
       getHeader(name)
   HttpServletResponse
       getParameter(name)
       getParameterValues(name)
       getParameterNames()
       getRequestDispatcher("다음으로 갈 페이지명")
           ->반환하는 객체가 RequestDispatcher이다.
             이 객체가 제공하는 forward(request, response)
             메서드를 호출하여 다음 페이지로 이동한다.



요청 헤더 정보의 처리 

JSP의 request 기본 객체는 헤더 정보를 읽어올 수 있는 기능을 제공하고 있으며, 이 기능을 제공하는 메서드는 아래와 같다.
; 헤더정보 ex)웹 브라우저는 웹 부라우저의 종류에 대한 정보를 헤더에 담아서 전송

 [request 기본 객체가 제공하는 헤더 읽기 메서드]
 메서드 리턴 타입  설명 
 getHeaderNames() java.util.Enumeration  모든 헤더의 이름을 구한다. 
 getHeader(String name) String  지정한 이름의 헤더 값을 구한다. 
 getHeaders(String name) java.util.Enumeration  지정한 이름의 헤더 목록을 구한다. 
 getIntHeader(String name) int  지정한 헤더의 값을 정수 값으로 읽어온다. 
 getDateHeader(String name) long  지정한 헤더의 값을 시간 값으로 읽어온다.(이때 시간은 1970년 1월 1일 이후로 흘러간 1/1000초 단위의 값을 가진다. 


import java.io.IOException;
import java.io.PrintWriter;
import java.util.Enumeration;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
public class FirstServlet extends HttpServlet {
 private static final long serialVersionUID = 1L;
 private int count;
 
 public FirstServlet() {
        super();
        // TODO Auto-generated constructor stub
    }
 
 /*
  * init()
  * 서블릿을 시작할 때 호출한다.
  * 시작할 때 무엇인가를 처리하고 싶다면..
  * init()에 처리
  */
 @Override
 public void init() throws ServletException {
  // TODO Auto-generated method stub
  super.init();
  count = 100;
  System.out.println("init() called... count = " + count);
  //콘솔에 창 띄움.
 }
 
 /*
  * destroy()
  * 서버를 종료시키면 호출된다.
  * 서블릿을 종료시킬 때 처리하고 싶은 것이 있다면...
  * destory()에 처리
  */
   @Override
 public void destroy() {
  // TODO Auto-generated method stub
  System.out.println("destroy() called... count = " + count);
 }
 
 
 
    //새로 생성. doGet방식으로 들어오든, doPost방식으로 들어오든(요청)
    //같은 방식으로 처리하겠다.
   protected void process(HttpServletRequest request,
      HttpServletResponse response) throws ServletException, IOException {
  // TODO Auto-generated method stub
     response.setContentType("text/html;charset=utf-8");
     PrintWriter out = response.getWriter();
     out.println( "<b>환영합니다" + (count++) +"번째 방문객입니다.</b>"); //respontse가 알아서 씀.\
     
  
   //getHeaderNames() 헤더에 담겨져 오는 데이터의 이름값을 가져온다.
     Enumeration headers = request.getHeaderNames();
     //헤드 정보 이름 : 값. 으로 구성되 있음...
     while ( headers.hasMoreElements()) //요소가 있는 동안에 돌리겠다.
     {
      String name = (String)headers.nextElement();
      //getHeader(name)는 해당 이름에 해당하는 값을 읽어 온다.
      String value = request.getHeader(name);
      out.println("<li>"+ name + "  : " + value);
     }
     
     
     out.close();
  //이 페이지를 요청하면 환영합니다. 하고 끝~
 }
   
   /*
    * 서비스는 종류에 따라 불러짐.
    * get - doget
    * post - dopost
    */
    protected void doGet(HttpServletRequest request,
   HttpServletResponse response) throws ServletException, IOException {
  // TODO Auto-generated method stub
  process(request, response);
 }


 protected void doPost(HttpServletRequest request,
   HttpServletResponse response) throws ServletException, IOException {
  // TODO Auto-generated method stub
  process(request, response);
  
 }
}





 




요청 파라미터의 처리
>request 기본 객체의 파라미터 읽기 메서드

 메서드 리턴 타입  설명 
 getParameterNames() java.util.Enumeration  웹 브라우저가 전송한 파라미터의 이름을 구한다. 
 getParameter(String name) String  이름이 name인 파라미터의 값을 구한다. 존재하지 않을 경우 null을 리턴한다. 
 getParameterValues(String name) String[]  이름이 name인 모든 파라미터의 값을 배열로 구한다. 존재하지 않을 경우 null을 리턴한다. 
 getParameterMap() java.util.Map  웹 브라우저가 전송한 파라미터의 맵을 구한다. 맵은 <파라미터 이름, 값> 쌍으로 구성된다. 



실제로 파라메터 값을 읽어올 수 있는지 확인하기 위한 jsp화면.
>POST형식으로 데이터 request 하기

 index.jsp
 <%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!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=UTF-8">
<title>Insert title here</title>
</head>
<body>
    현재시간 : <%= new java.util.Date() %> <br></br>
  <p>데이터를 입력하고 전송 버튼을 눌러 주세요</p>
  <form action = "first.do" method = "post">
       이름 : <input type = "text" name = "name"/><br/>
       좋아하는 동물은 ?
       <input type = "checkbox" name = "pet" value = "강아지">강아지</input>
       <input type = "checkbox" name = "pet" value = "고양이">고양이</input>
       <input type = "checkbox" name = "pet" value = "송아지">송아지</input>
       <br/>
       <input type = "submit" value = "전송"/>
    </form>
</body>
</html>
 FirstSetvlet.java

 package simple.web.controller;

import java.io.IOException;
import java.io.PrintWriter;
import java.util.Enumeration;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
public class FirstServlet extends HttpServlet {
 private static final long serialVersionUID = 1L;
 private int count;
 
 public FirstServlet() {
        super();
        // TODO Auto-generated constructor stub
    }

 
 /*
  * init()
  * 서블릿을 시작할 때 호출한다.
  * 시작할 때 무엇인가를 처리하고 싶다면..
  * init()에 처리
  */
 @Override
 public void init() throws ServletException {
  // TODO Auto-generated method stub
  super.init();
  count = 100;
  System.out.println("init() called... count = " + count);
  //콘솔에 창 띄움.
 }
 
 /*
  * destroy()
  * 서버를 종료시키면 호출된다.
  * 서블릿을 종료시킬 때 처리하고 싶은 것이 있다면...
  * destory()에 처리
  */
   @Override
 public void destroy() {
  // TODO Auto-generated method stub
  System.out.println("destroy() called... count = " + count);
 }
 
  
    //새로 생성. doGet방식으로 들어오든, doPost방식으로 들어오든(요청)
    //같은 방식으로 처리하겠다.
   protected void process(HttpServletRequest request,
      HttpServletResponse response) throws ServletException, IOException {
  // TODO Auto-generated method stub
     response.setContentType("text/html;charset=utf-8");
     request.setCharacterEncoding("utf-8");
     //POST 방식으로 보냈을 때 한글로 처리하기 위함
     PrintWriter out = response.getWriter();
     
     String name = request.getParameter("name");
     String[] pet = request.getParameterValues("pet");
     out.println("<b>"+ name + "님 환영합니다."
       + (count++) +"번째 방문객입니다.</b>"); //respontse가 알아서 씀.\
     out.println("좋아하는 동물을 다음과 같이 선택하셨습니다.");
     for(String p : pet){
      out.println("<li>"+p);
     }
     
  
     out.close();
  //이 페이지를 요청하면 환영합니다. 하고 끝~
 }
   
   /*
    * 서비스는 종류에 따라 불러짐.
    * get - doget
    * post - dopost
    */
    protected void doGet(HttpServletRequest request,
   HttpServletResponse response) throws ServletException, IOException {
  // TODO Auto-generated method stub
  process(request, response);
 }

 protected void doPost(HttpServletRequest request,
   HttpServletResponse response) throws ServletException, IOException {
  // TODO Auto-generated method stub
  process(request, response);
  
 }
}







>GET형식으로 데이터를 한글로!! request 하기
1) 일단 설정을 변경하여야 한다.(톰캣 자체를)

redirectPort 밑에 라인 추가
URIEncoding = "utf-8"




2)이제 한글로 출력해 보자.  앞에 jsp 파일에서 method = "get" 부분만 수정해 주면 된다.
(default일 경우 get처리 되므로 생략하여도 get 처리된다.) 

GET방식으로 하면, head에 한글이 첨부되어 간다(블록 처리해 놓은 것 참조)

Posted by Triany