본문 바로가기
Spring

2022-11-11 Servlet 등록, 요청

by HTT 2022. 11. 12.

실행방법에 따른 자바 클래스의 구분
- Application(main메소드)
- Applet
- Servlet

Servlet

 


- 클라이언트의 요청을 처리하기 위한 기술
- 서버에서 클라이언트의 요청을 처리하고 응답할 수 있도록 만들어진 객체
- 클라이언트가 요청을 하면 서버에서 실행되면서 DB에 대한 처리, 서버의 리소를 이용해서 만들어진 결과를 클라이언트에 응답
- 클라이언트가 요청하면 서버가 자동으로 요청한 서블릿을 찾아서 실행하므로 서버가 인식하는 위치에 있어야 한다. 

** 서버가 인식하는 위치 : 서블릿 디렉토리(표준화된 폴더 구조의 classes폴더)

- 서버를 구성하는 많은 클래스내부에서 우리가 만든 서블릿 객체가 실행되도록 하기 위해서는 서버가 인식할 수 있는 규칙에 맞게 클래스를 작성해야 한다.

 

 

1. 서블릿 작성 규칙

   

1) 표준화된 폴더 구조 안에 서블릿 클래스가 위치해야 한다.
      서블릿이 저장될 폴더 - classes
      [표준화된 폴더 구조]
  context

         | 
         |---------------------jsp, html, css, js, image ...
         |
         ㅡㅡㅡWEB-INF
                 |---- web.xml
                 |---- lib (폴더) - objdbc6.jar와 같은 라이브러리
                 ㅡㅡㅡ classes(폴더) - 서블릿, dao, dto, ... 자바클래스
         
         => 서블릿클래스가 classes폴더에 없으면 서버가 찾을 수 없다!!!!!
         
   2) 서버에 의해서 호출될 것이므로 반드시 public클래스로 작성해야 한다.


   3) 서블릿클래스가 되기 위해서 무조건 서블릿 클래스를 상속받아야 한다.
       sevlet
           ^
           |
     GenericServlet ---- 서블릿의 일반적인 내용이 정의된 서블릿클래스
           ^
           |
     HttpServlet   ----- http프로콜에 특징적인 내용이 정의된 서블릿클래스
           ^
           |
      MyServlet   --- 사용자가 만든 서블릿
   
   4) 서버가 호출할 메소드를 오버라이딩 해야 한다.
      - 서버가 자동으로 호출하는 메소드를 callback메소드라고 한다.
      - 클라이언트가 요청을 하면 서버가 요청을 분석해서 서블릿 디렉토리에 존재하는 서블릿클래스를 찾아서 적절한 상황에 해당 메소드를 자동으로 호출한다.
        따라서 상황에 맞게 적절하게 처리하고 싶은 내용이있다면 각각의 메소드를 오버라이딩해서 내용을 정의해야 한다.
      - 서블릿의 lifesycle을 서버가 관리
                            --------------
                             ㄴ> 객체가 생성되고 생성된 객체를 사용하고 객체를 메모리에서 해제하는 모든 작업
      -오버라이딩 해야 하는 메소드는 lifecycle이랑 관련있는 메소드
      
      [오버라이딩 할 메소드]
      - init : 서블릿객체가 초기화될 때 호출되는 메소드
      - service : 클라이언트가 요청할 때마다 호출되는 메소드
                  => 클라이언트의 요청을 처리하는 메소드로 요청을 받고 처리할 내용을 구현
                  ex) 로그인, 게시판목록읽기, 메일읽기, 장바구니조회, 구매 ,예약 ....
      - doGet : 클라이언트가 get방식으로 요청할 때 호출되는 메소드
      - doPost : 클라이언트가 post방식으로 요청할 때 호출되는 메소드
      - destroy : 서블릿객체가 소멸될 때 호출되는 메소드
                  * 서블릿 클래스가 컴파일됐을 때
                  * WAS가 재부팅
                  * Context가 reload
   
   5) 서블릿을 등록
      - 서버가 요청을 분석해서 서블릿디렉토리에서 서블릿을 찾아서 실행할 수 있도록 요청별로 실행할 서블릿을 등록
      - 설정파일에 등록(web.xml)
      - 실제 작업은 annotation으로 설정
      - web.xml파일은 xml형식의 파일이므로 태그로 작성하고 작성규칙이 정해져 있기 때문에 정확하게 작성해야 한다.

      ** 작성규칙 : dtd - xml안에서 정의하고 사용할 엘리먼트를 정의한 명세서(엘리먼트의 순서, 값의 타입...)


      ①서블릿 클래스를 등록
       => 어떤 클래스를 사용해야 하는지 등록 : 무엇을 ???
       ex)basic패키지에 작성한 FirstServlet을 First라는 이름의 서블릿으로 등록
       <servlet>
      <servlet-name>서블릿명(별칭)</servlet-name>
            <servlet-class>패키지명.서블릿의 실제 클래스명</servlet-class>    
       </servlet>

<servlet>
  	<servlet-name>First</servlet-name>
  	<servlet-class>basic.FirstServlet</servlet-class>
</servlet>


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

       <servlet-mapping>
       <servlet-name>위에서 정의한 서블릿의 이름</servlet-name>
       <url-pattern>요청할 서블릿의 path</url-pattern>
                                   ------------------------------------
                           반드시 / or . 으로 시작해야 한다.
       </servlet-mapping>
       
       ex) Frist로 등록된 서블릿을 /first.sds로 요청했을 때 실행하겠다.

<servlet-mapping>
	<servlet-name>First</servlet-name>
  	<url-pattern>/first.sds</url-pattern>
</servlet-mapping>

 

 

 

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

 

[일반 html문서]
http://서버ip:port/context명/정적파일명(폴더포함)

html폴더의 basic.html
http://http://172.30.1.37:8088/clientweb/html/basic.html

[서블릿의 요청]
- http://서버ip:port/context명/서블릿매핑명
                                                        ---------------------
                                                           ㄴ> web.xml에 <url-pattern>에 등록하거나 annotation으로 등록한path
    => http://172.30.1.37:8088/serverweb/first.sds
    프로토콜//       ip       :포트 / context명 / url매핑명
    
- 서블릿을 못찾는 경우 : 404
    => http://서버ip:port/context명/servlet/요청한 서블릿클래스의 경로(basic.FirstServlet)

1) get방식   
   : 클라이언트가 입력한 내용을 요청헤더에 저장해서 서버로 전송하는 방식
     서버에 있는 데이터를 가져오기
   ① 주소표시줄에 직업 입력해서 가져오는 방식
   => 테스트용으로 사용하거나 첫 번째 페이지에서 요청하는 경우
   ② 하이퍼링크 클릭
   텍스트나 이미지를 클릭해서 서블릿을 요청
   => <a href = "http://172.30.1.37:8088/serverweb/first.sds">로그인</a>
   => <a href = "/context명/서블릿요청path">로그인</a>
        <a href = "/serverweb/first.sds">로그인</a>

<a href = "/serverweb/second.sds.html">서블릿요청</a>
<a href = "/serverweb/second.sds.html">
	<img alt="" src="/serverweb/images/yc03.jpg" width='300' height='300' />
</a>


   ③<form>태그에 method속성에 get을 적용하고 submit을 누른 경우
   : method를 생략하면 get방식
   <from action = "요청할 web application path" method = "요청방식">
   
   </form>
 

ex) first.sds으로 요청하는 서블릿을 get방식으로 요청하기

<form action="/serverweb/first.sds">   <!-- method="get" 생략해도 get방식, 생략 안 해도 get방식임 -->
	아이디:<input type="text" name="id"/><br/>
	패스워드:<input type="password" name="pass"/><br/>
	<input type="submit" value="로그인">
</form>
<form action="/serverweb/first.sds" method="get">
	아이디:<input type="text" name="id"/><br/>
	패스워드:<input type="password" name="pass"/><br/>
	<input type="submit" value="로그인">
</form>


=> submit버튼을 누르면 폼태그 사이에 정의된 모든 양식 태그의 name과 value가 action속성에 정의된 어플리케이션으로 get반식으로 전송
   


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

<form action="/serverweb/first.sds" method="post">
	아이디:<input type="text" name="id"/><br/>
	패스워드:<input type="password" name="pass"/><br/>
	<input type="submit" value="로그인">
</form>

 

 

 

 

<예제>

1. 서블릿 등록, 매핑

<servlet>
  	<servlet-name>paramtest</servlet-name>
  	<servlet-class>basic.ParamTestServelt</servlet-class>
</servlet>
<servlet-mapping>
  	<servlet-name>paramtest</servlet-name>
  	<url-pattern>/param.do</url-pattern>
</servlet-mapping>

 

2. 서블릿 요청

<form action="/serverweb/param.do" method="post">
	아이디:<input type="text" name="id"/><br/>
	패스워드:<input type="password" name="pass"/><br/>
	<input type="submit" value="로그인">
</form>

3. request, response

1) 한글 설정하기 - 출력유형도 설정해야 함(응답데이터의 형식 - MIME타입 text/html)
2) 응답객체에 클라이언트에게 전송할 메세지를 전달 - 서버에서 클라이언트에 전송하는 메세지가 웹 페이지에 출력되도록 작업하기
3) 응답정보를 클라이언트로 전송하기 위해서 출력스트림객체를 response에서 받아오기

package basic;
import java.io.IOException;
import java.io.PrintWriter;
import jakarta.servlet.ServletException;
import jakarta.servlet.http.HttpServlet;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;

public class ParamTestServelt extends HttpServlet{

	@Override
	protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
		System.out.println("요청성공");
		resp.setContentType("text/html;charset=UTF-8");
		PrintWriter pw = resp.getWriter();    //화면에 출력
		pw.print("<h2>안녕</2>");
		String id = req.getParameter("id");   //리퀘스트 안의 값을 꺼냄
		String pass = req.getParameter("pass");
		System.out.println("클라이언트가 입력한 아이디 : "+id);
		System.out.println("클라이언트가 입력한 패스워드 : "+pass);
	}
	
}

* HttpServletRequest객체와 HttpServletResponse객체는 클라이언트의 요청과 응답을 처리하기 위한 객체로 클라이언트가 요청한 내용과 클라이언트에 응답할 내용을 서버가 객체로 만들어서 service메소드를 호출할 때 전달한다.

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

public class ParamTestServelt extends HttpServlet {  }

 

* 한글 설정하기 - 출력유형도 설정해야 함(응답데이터의 형식 - MIME타입 text/html)

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

 

* 응답객체에 클라이언트에게 전송할 메세지를 전달 - 서버에서 클라이언트에 전송하는 메세지가 웹 페이지에 출력되도록 작업하기
응답정보를 클라이언트로 전송하기 위해서 출력스트림객체를 response에서 받아오기

PrintWriter pw = resp.getWriter(); //화면에 출력
pw.print("<h2>안녕</2>");

댓글