[boost course] 4. Servlet

hyeon·2022년 5월 6일
0

Servlet

자바 웹 어플리케이션

  • WAS에 설치(deploy)되어 동작하는 어플리케이션
  • 자바 웹 어플리케이션에는 HTML,CSS,이미지,자바로 작성된 클래스(Servlet도 포함됨,package,인터페이스등), 각종 설정파일 등이 포함된다.

자바 웹 어플리케이션의 폴더 구조

약속이기 때문에 폴더구조를 꼭 지켜줘야함
1. WEB-INF폴더 : 안에 web.xml (=배포 기술자) 웹애플리케이션에대한 정보를 다가지고 있는 것(servlet 3.0미만에서는 필수, 이상에는 어노테이션 사용)

<WEB-INF 하위 폴더>
1-(1) lib 폴더 : jar 파일들
1-(2) classes : 작성한 class들, java 패키지

  1. 리소스들 : html,css,js,이미지등 여러 리소스들

Servlet이란?

서블릿은 자바 웹 어플리케이션의 구성요소 중 동적인 처리를 하는 프로그램의 역할을 한다.

  • WAS에서 동작하는 JAVA클래스이다.
  • HttpServlet클래스를 상속받아야 한다.
  • JSP로부터 최상의 결과를 얻으려면 웹페이지를 개발할 때 JSP와 서블릿을 조화롭게 사용해야한다 (ex, 웹페이지를 구성하는 화면은 JSP로 표현하고 복잡한 프로그래밍은 서블릿으로 구현) 앞에서 만든 HelloServlet 처럼 html코드를 일일이 out.print에 넣을 수는 없다.

Servlet 작성방법

Servlet 3.0 이상에서 사용하는 방법 실습

실습내용

1~10 출력하는 TenServlet 작성 http://localhost:8080/exam31/ten으로 동작하도록 설정

과정


모듈 3.1인 프로젝트 생성


URL ten으로 수정

서블릿은 동적으로 응답결과를 만들어내는것
-> 동적으로 만들어낸다는 것은 응답할 페이지를 만들어서 가지고 있는게 아니라 요청이 들어왔을 때 이 프로그램이 실행되면서 (ten이라고 요청하면 이 서블릿이 실행됨) 응답할 코드를 만들어내고 응답.

HttpServletRequest request, HttpServletResponse response

클라이언트가 요청할 때 요청을 받아내는 객체와 응답을 하기 위한 객체 두 개를 자동으로 만들어낸다. 객체 안에 요청과 응답에 대한 정보들이 추상화 되어있다.

코드

package exam;

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;

/**
 * Servlet implementation class TenServlet
 */
@WebServlet("/ten")
public class TenServlet extends HttpServlet {
	private static final long serialVersionUID = 1L;
       
    /**
     * @see HttpServlet#HttpServlet()
     */
    public TenServlet() {
        super();
        // TODO Auto-generated constructor stub
    }

	/**
	 * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)
	 */
	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		response.setContentType("text/html; charset=utf-8" );
		PrintWriter wt=response.getWriter();
		wt.print("<h1>1부터 10까지 출력</h1>");
		for(int i=1;i<11;i++) {
			wt.print(i+"<br>");
		}
		wt.close();
	}

}

결과

@WebServlet("/hyeon")

webservlet 어노테이션을 hyeon으로 바꿨을 때의 결과

Servlet 3.0 미만에서 사용하는 방법 실습

    <servlet>
        <description></description>
        <display-name>TenServlet</display-name>
        <servlet-name>TenServlet</servlet-name>
        <servlet-class>exam.TenServlet</servlet-class>
    </servlet>
    <servlet-mapping>
        <servlet-name>TenServlet</servlet-name>
        <url-pattern>/ttt</url-pattern>
    </servlet-mapping>

web.xml은 클라이언트가 요청을 할 때 이런 URL로 요청하면 web.xml에서 servlet-name이 같은 서블릿을 찾아서 exam 패키지 안에 있는 TenServlet을 실행할 수 있다.

  1. < url-pattern > 태그안의 URL이 같은 것을 찾는다.
  2. URL이 존재한다면 < servlet-name >을 찾는다.
  3. < servlet >태그안에서 똑같은 이름을 가진 것을 찾는다
  4. 실행시킬 class를 < servlet-class >보고 찾는다.

=> 3.0 이상은 annotation이 이 과정을 대신해줌

Servlet 생명주기

  1. 처음 실행했을 때

  2. 새로고침 했을 때

    => 서블릿은 서버에 서블릿객체를 여러개 만들지 않는다. 요청된 객체가 메모리에 있는지 없는지만 확인해서 있으면 service를 호출한다.

  3. Servlet을 수정했을 때

  4. 서블릿을 수정하고 새로고침 했을때
    다시 처음부터 객체를 생성하고 init을 호출하고 service를 호출한다.

    서블릿의 생명주기 한장정리

    HttpServlet의 service메소드는 이미 구현이 되어있는 상태이다.
    그래서 HelloServlet만들때에는 doGet()이라는 메서드만 오버라이드 했지만 서블릿의 부모인 httpServelt의 service 메서드가 실행이 된것

    HttpServlet의 service 메소드는 템플릿 메소드패턴으로 구현이 되어있는데 클라이언트의 요청이 GET인 경우 doGet메소드를 호출하고 Post인 경우는 doPost를 호출한다.

    Request,Response 객체 이해하기

    httpservletrequest에서 전달된 객체는 service, doget, dopost와 같은 메서드 들의 파라매터로서 전달되어 사용하게된다.

    1. HttpServletRequest

  • http 프로토콜의 request 정보를 서블릿에게 전달하기위한 것

  • 헤더정보, 파라미터,쿠키,url등의 정보를 읽어들이는 메소드를 가지로 있다.

  • body의 stream을 읽어들이는 메소드를 가지고있다.

    클라이언트가 서버에게 요청을 보낼 때 함께보내는 정보들

    1. 헤더 정보
    헤더: 데이터 블록의 맨앞에 위치한 데이터. 요청과 응답을 위한 부가정보들.

    request.getHeaderNames();		//헤더의 이름을 알아낼수있다.
    request.getHeader(headerName);	//헤더의 이름으로 정보를 알아낼 수 있다.

    2. 파라미터
    http://localhost:8080/webtest/param?name=kim&age=100
    ?뒤에 있는것들이 파라미터이다. &를 기준으로 나눠진다.
    =앞에 있는것이 파라미터 이름 뒤에있는 것이 파라미터 값이다
    파라미터는 반드시 URL로만 오는것은 아니고 HTML의 form태그안의 input 태그 안의 값도 파라미터로 넘어옴

    request.getParameter("이름")	//파라미터 정보 받기

    3. 그외의 정보 출력

     		  http://localhost:8080/webtest/info
     		String uri = request.getRequestURI();		//uri :도메인과 포트이하의 값 (/webtes/info)
    			StringBuffer url = request.getRequestURL(); 	//URL :오쳥주소 전체
    			String contentPath = request.getContextPath(); 	//contextpath :보통 프로젝트 이름(웹 애플리케이션과 매핑된 path was안에 여러개의 앱이 있을 수 있음 그때 찾아가는 path)
    			String remoteAddr = request.getRemoteAddr();	//클라이언트의 주소값

    2. HttpServletResponse

  • WAS는 어떤 클라이언트가 요청을 보냈는지알고, 해당 클라이언트에게 응답을 보내기 위한 HttpServletResponse 객체를 생성하여 서블릿에게 전달한다.

  • 서블릿은 해당 객체를 이용하여 content type, 응답코드, 응답메시지등을 전송한다.

profile
남기고 싶은 개발자입니다 :>

0개의 댓글