2020.11.26 고급자바 Servlet Test05 까지 정리

 서블릿이란 => 컨테이너(서블릿엔진) 에 의해 관리되는 자바기반 웹 컴포넌트 

동적인 웹 컨텐츠 생성을 가능하게 해준다. 

전체 요청 URL 주소 :  http://localhost:80/servletTest/servletTest01.do

   

  -http ==> 프로토콜 

  -localhost  ==> 컴퓨터이름 또는 도메인명 또는 IP 주소 

  - 80 ==> PORT 번호 ( 웹은80번이 기본 . 80번일 경우에는 생략가능)

  - /servletTest ==> 컨텍스트패스( 보통 지정한 '프로젝트 이름' 으로 지정된다. ) 

  -/servletTest01.do      ==> 서블릿 요청 URL 패턴 




ServletTest01 



예시 1. ) 배포서술자 ( DD Deployment Descroptor ==> web.xml 을 이야기 한다.) 을 이용해서 실행할 Servlet 을 설정하여 처리하는 예제이다. 



package kr.or.ddit.basic;


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 ServletTest01 extends HttpServlet {

private static final long serialVersionUID = 1L;



// -이 영역에는 대부분 service() 메서드 또는 doGet() 메서드나 doPost() 메서드를 

// 재정의해서 작성한다. 

// doGet() 메서드나 doPost() 메서드는 service() 메서드를 통해서 호출된다. 

// HttpServletRequest객체 ==> 서비스 요청에 관련된 정보 및 메서드를 관리하는 객체 

// HttpServletResponse 객체 ==> 서비스 응답에 관련된 정보 및 메서드를 관리하는 객체 




//doGet() 메서드 ==> GET 방식의 요청을 처리하는 메서드 



protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {

        //응답 문서의 인코딩 방식 지정

resp.setCharacterEncoding("utf-8"); 

        //응답 문서의 ContentType 지정 

resp.setContentType("text/html; charset=utf-8"); 


        

        //처리한 내용을 응답으로 보내기 위해 PrintWriter 객체 생성


        PrintWriter out = resp.getWriter(); 



        //처리한 내용을 출력한다. 

        // 방법 1 . append() 메서드를 이용한다. 



out.append("<html>");

out.append("<head>"); 

out.append("<meta charset='utf-8>'");

out.append("<title>첫번째 Servlet 연습</title>"); 

out.append("</head>"); 

out.append("<body>");

out.append("<h1 style='text-align:center;'>");

out.append("안녕하세요. 첫번째 servlet 프로그램입니다. <br>"); 

out.append("servlet at : " + req.getContextPath());

out.append("</h1>");

out.append("</body>");

out.append("</html>");

    

//2줄의 내용을 위해 HTML 전체틀을 만들어야 하는것이 SERVLET 의 단점이다. 


}



//doPost() 메서드 ==> POST 방식의 요청 처리하는 메서드 



@Override

protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {

super.doPost(req, resp);

}

}


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

ServletTest02 


servlet 과 servlet-mapping 등을 servlet 을 많이 사용하려고 하면 길어진다. 

이 예제는 애노테이션은 (@WebServlet) Servlet 버전 3.0 이상에서 사용할 수 있다. 

@WebServlet 애너테이션의 속성들 

1. name : 서블릿의 이름을 설정한다. ( 기본값 : 빈 문자열 ("")) 

 2. urlPatterns : 서블릿의 URL 패턴의 목록을 설정한다. (기본값 : 빈배열({}))

    예) urlPatterns="/url1" 또는 urlPatterns={"/url1"} ==> 패턴이 1개일 경우 

    예) urlPatterns={"/url1" , "/url2"}  ==> 패턴이 2개 이상일 경우 

3. value : urlPatterns 와 동일한 기능을 한다. 

4. discription : 주석(설명글) 을 설정한다. 









ServletTest02 



package kr.or.ddit.basic;


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;



   // @WebServlet(description="애노테이션을 이용한 서블릿" , 

   //                     urlPatterns={"/servletTest02.do"}) //중요 


public class ServletTest02 extends HttpServlet {

private static final long serialVersionUID = 1L;


    @Override

    protected void doGet(HttpServletRequest req, HttpServletResponse resp)                 throws ServletException, IOException {

        resp.setCharacterEncoding("utf-8"); //응답 문서의 인코딩 방식 지정 

        resp.setContentType("text/html; charset=utf-8"); //응답 문서의 Content Type지정


//처리한 내용을 응답으로 보내기 위해 PrintWriter 객체 생성


        PrintWriter out = resp.getWriter(); 


//처리한 내용을 출력한다. ==> 방법2) println 메서드 이용하기 


        out.println("<html>");

out.println("<head>");

out.println("<meta charset='utf-8'>");

out.println("<title>두번째 Servlet 연습 </title>");

out.println("</head>");

out.println("<body>");

out.println("<h1 style='text-align:center;'>");

out.println("이것은 두번째 Servlet 프로그램입니다. <br>");

out.println("server at : " + req.getContextPath() + "<br>");

out.println("@WebServlet 에너테이션을 이용한 예제입니다.");

out.println("</h1>");

out.println("</body>");

out.println("</html>");



}


@Override

protected void doPost(HttpServletRequest req, HttpServletResponse resp)                 throws ServletException, IOException {

super.doPost(req, resp);

}


}

-----------------------------------------------------------------------------------------------------
ServletTest03


-서블릿의 동작 방식에 대하여 
1. 사용자(클라이언트)가  URL 을 클릭을 하면 HTTP Request 를 Servlet Container 로 전송(요청) 한다. 
2. 컨테이너는 web.xml 에 정의된 url 패턴을 확인하여 어느 서블릿을 통해서 처리해야 할 지를 검색한다. (요청시 url 패턴과 같은 것을 찾는다. )


<servlet>

    <servlet-name>servletTest01</servlet-name>

    <servlet-class>kr.or.ddit.basic.ServletTest01</servlet-class>

</servlet>



<servlet-mapping>

    <servlet-name>servletTest01</servlet-name>

    <url-pattern>/servletTest01.do</url-pattern>

</servlet-mapping>



</servlet-mapping>

(로딩이 안된 경우에는 로딩(객체를 생성한다 ) 을 한다. 이때 init() 메서드가 자동으로 호출된다. )


(Servlet 버전 3.0 이상에서는 애노테이션(@WebServlet) 으로 url 패턴을 설정할 수 있다. (web.xml 로 등록해도 되고, 애노테이션으로 등록해도 되고 ) 

 

3. Servlet Container 는 요청을 처리할 개별 쓰레드 객체를 생성하여 해당 서블릿 객체의 service() 메서드를 호출한다. (이때,  HttpServletRequest 객체와 HttpServletResponse 객체를 파라미터로 넘겨준다. ) 


4. service() 메서드는 요청 메서드 타입을 체크하여 적절한 메서드를 호출한다. 

(doGet() , doPost() , doPut(), doDelete() 등... ) 

5. 요청 처리가 완료되면 HttpServletReuest 객체와 HttpServletResponse 객체는 소멸된다. 

6. 웹컨테이너로부터 등록되어 있는 서블릿이 제거되는 경우에는 destory() 메서드가 호출된다. 



@WebServlet("/servletTest03.do")

public class ServletTest03 extends HttpServlet {


private static final long serialVersionUID = 1L;

@Override

public void init() throws ServletException {

System.out.println("Servlet : " + this.getServletName() + "에서 init() 메서드를             호출합니다. ");

}

@Override

protected void service(HttpServletRequest req, HttpServletResponse resp)                 throws ServletException, IOException {

        System.out.println("service()메서드 시작....");


        //get 방식과 post 방식에 맞는 메서드 호출하기 

        //방법1 ==> HttpServlet 의 service() 메서드로 위임하기 

        super.service(req, resp); 

        //방법2 ==>클라이언트의 전송방식 (GET, POST 등 ) 을 구분해서 직접 메서드를 호출 

        String method = req.getMethod(); 

        System.out.println("method => " + method); 

        if("GET".equals(method)) {

            this.doGet(req, resp) ; 

        }else {

            this.doPost(req, resp); 

        }


@Override

protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws             ServletException, IOException {

System.out.println("doGet()메서드 시작....");

resp.setCharacterEncoding("utf-8");

resp.setContentType("text/html; charset=utf-8");

PrintWriter out = resp.getWriter();

out.println("<html><head><meta charset='utf-8'</head>"

+ "<body><h1>doGet()메서드처리내용</h1></body></html>");

}

         // method 를 입력하지 않으면 기본으로 get 방식이 디폴트다    

        //<form action="http://localhost/servletTest/servletTest03.do" method="">



@Override

protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {

System.out.println("doPost()메서드 시작....");

resp.setCharacterEncoding("utf-8");

resp.setContentType("text/html; charset=utf-8");

PrintWriter out = resp.getWriter();

out.println("<html><head><meta charset='utf-8'</head>"

+ "<body><h1>doPost()메서드 처리내용한 내용입니다.</h1></body></html>");

}

  //<a href="http://localhost/servletTest/servletTest03.do"> 요부분이 doget() 로            //작동한다.


@Override

public void destroy() {

System.out.println("Servlet : " + this.getServletName() + "에서 destroy()메서드를 호출합니다.");

}


}

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

doBasicServlet.html  - ServletTest03 과연결되어있음 ( 작동 첫페이지 view 페이지 ) 



<!DOCTYPE html>

<html>

<head>

<meta charset="UTF-8">

<title>Insert title here</title>

</head>

<body>

<h1>Servlet 요청 연습</h1>

<hr>

<!-- 웹브라우저의  URL 주소창에 직접 입력하여 요청하는 경우에도 GET 방식으로 처리된다. -->

<h2>GET방식 요청1 ==> 링크 방식 </h2>

<a href="http://localhost/servletTest/servletTest03.do">Get 방식 요청 1</a>

<hr>

<h2>GET 방식 요청2 ==> form 태그의  method 속성을 생략하거나 'get' 으로 설정한 경우 </h2>

<form action="http://localhost/servletTest/servletTest03.do" method="">

<input type="submit" value="Get방식 요청2"> 

</form>

<hr>

<h2>POST 방식 요청 ==> form태그의 method 속성에 'post' 로 설정한 경우 </h2>

<form action="http://localhost/servletTest/servletTest03.do" method="post">

<input type="submit" value="Post방식 요청" > 

</form>



</body>

</html>


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

ServletTest05 


package kr.or.ddit.basic;


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 ServletTest05 extends HttpServlet {

private static final long serialVersionUID = 1L;

@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws         ServletException, IOException {
resp.setCharacterEncoding("utf-8");
resp.setContentType("text/html; charset=utf-8"); 
PrintWriter out = resp.getWriter(); 


/*

//초기화 파라미터

- 처음 was 가 기동될 때 읽어들이는 파라미터 값들을 초기화 파라미터라고 한다. ( 환경설정하는 데이터들 ) 

- '서블릿 초기화 파라미터' 와 컨텍스트 초기화 파라미터' 가 있다. 

-'서블릿 초기화 파라미터는 해당 서블릿에서만 사용가능하고

 '컨텍스트 초기화 파라미터'는 전체 웹 어플리케이션 영역에서 사용 가능하다. 


1. 서블릿 초기화 파라미터 ==> web.xml 에 설정하는 방법과 애너테이션에 설정하는 방법 2가지가 있다. 

*/ 


//서블릿 초기화 파라미터값을 구하는 방법 

// 방법 1 ==> ServletConfig 객체를 이용하기 

            ServletConfig config = getServletConfig(); 


//형식 ) getInitParameter("파라미터 이름"); 

//        ==> 반환값은 무조건 String 형으로 반환된다. 


        String adminEmail = config.getInitParameter("AdminEmail");


//방법2 ==> 현재 Servlet 객체의 getInitParameter() 메서드 이용하기 


        String userName = getInitParameter("userName"); 


                out.println("<!DOCTYPE html>");

out.println("<html>");

out.println("<head><meta charset='utf-8'>");

out.println("<title>웹 서버의 정보 </title></head>");

out.println("<body");

out.println("<h1> 서블릿 초기화 파라미터 </h1>");

out.println("관리자 이메일  :" + adminEmail + "<br>");

out.println("사용자 이름 : " + userName + "<br>");

web.xml 파일에 기록된것 


**<servlet>

    <servlet-name>servletTest05</servlet-name>

    <servlet-class>kr.or.ddit.basic.ServletTest05</servlet-class>

    <init-param>

      <param-name>AdminEmail</param-name>

      <param-value>admin@naver.com</param-value>

    </init-param>

    <init-param>

      <param-name>userName</param-name>

      <param-value>홍길동</param-value>

    </init-param>

  </servlet>

  <servlet-mapping>

    <servlet-name>servletTest05</servlet-name>

    <url-pattern>/servletTest05.do</url-pattern>

  </servlet-mapping>

}

@Override

protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {

// TODO Auto-generated method stub

super.doPost(req, resp);

}

}

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

html 파일 부분



web content 부분



01 폴터 



html 


<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
<h1>Servlet 요청 연습 </h1>
<hr>
<!-- 웹브라우저의  URL 주소창에 직접 입력하여 요청하는 경우에도 GET 방식으로 처리된다. -->
<h2>GET방식 요청1 ==> 링크 방식 </h2>
<a href="http://localhost/servletTest/servletTest03.do">Get 방식 요청 1</a>
<hr>
<h2>GET 방식 요청2 ==> form 태그의  method 속성을 생략하거나 'get' 으로 설정한 경우 </h2>
<form action="http://localhost/servletTest/servletTest03.do" method="">
<input type="submit" value="Get방식 요청2"> 
</form>
<hr>
<h2>POST 방식 요청 ==> form태그의 method 속성에 'post' 로 설정한 경우 </h2>
<form action="http://localhost/servletTest/servletTest03.do" method="post">
<input type="submit" value="Post방식 요청" > 
</form>


</body>
</html>





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


web.xml 파일


<?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>servletTest</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>servletTest08</servlet-name>

    <servlet-class>kr.or.ddit.basic.ServletTest08</servlet-class>

    <init-param>

      <param-name>start</param-name>

      <param-value>1</param-value>

    </init-param>

    <init-param>

      <param-name>end</param-name>

      <param-value>50</param-value>

    </init-param>

  </servlet>

  <servlet-mapping>

    <servlet-name>servletTest08</servlet-name>

    <url-pattern>/servletTest08.do</url-pattern>

  </servlet-mapping>

  <servlet>

    <servlet-name>servletTest01</servlet-name>

    <servlet-class>kr.or.ddit.basic.ServletTest01</servlet-class>

  </servlet>

  <servlet-mapping>

    <servlet-name>servletTest01</servlet-name>

    <url-pattern>/servletTest01.do </url-pattern>

  </servlet-mapping>

  <servlet>

    <servlet-name>servletTest05</servlet-name>

    <servlet-class>kr.or.ddit.basic.ServletTest05</servlet-class>

    <init-param>

      <param-name>AdminEmail</param-name>

      <param-value>admin@naver.com</param-value>

    </init-param>

    <init-param>

      <param-name>userName</param-name>

      <param-value>홍길동</param-value>

    </init-param>

  </servlet>

  <servlet-mapping>

    <servlet-name>servletTest05</servlet-name>

    <url-pattern>/servletTest05.do</url-pattern>

  </servlet-mapping>

  <context-param>

    <param-name>myContext</param-name>

    <param-value>연습용 컨텍스트 파라미터 값</param-value>

  </context-param>

</web-app>




댓글