서블릿

예지성준·2024년 5월 14일
0
post-thumbnail

서블릿(Servlet)

1. 서블릿(Servlet)의 개요

  • 🌷서블릿: 자바의 웹을 구현하는 기술

  • 자바의 웹 기술
    Jakarta EE Platform API

    • jakartaee - API 명세 정의(servlet API)
    • jakarta.servlet
    • jakarta.servlet.http
    • jakarta.servlet.jsp ...

패키지들 중 jakarta.servlet.http 에서 HttpServlet 추상클래스를 사용해보자

매개변수로는 요청과 응답이 들어간다.

2. 서블릿(Servlet) 클래스 작성하기

자바 폴더에 패키지, 파일 생성
HttpServlet(추상클래스) 상속 받고 Generate에서 override 함수 지정해준다

doGet 함수 재정의 할거임!(주소입력해서 접근할거임)
*doGet: get방식으로 요청

public class HelloServlet extends HttpServlet { 
//웹기술 동작을 위한 상속, 자바의 웹기술로서쓸수있는 클래스가 된다.
//요청 메서드 do ~

//서블릿은 다양하게 공유되야하니 접근제어자 public으로 바꿔주자
    @Override
    public void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        System.out.println("안녕하세요!");
    }
}

3. web.xml 파일에 서블릿(Servlet) 등록하기

특정 url을 해당 서블릿 클래스와 매칭 시켜주기 위해 등록시켜야 한다.
특정 url과 매핑시키기 !!!

👩‍🏫참고)WEB-INF 폴더에서 web.xml 파일 생성
저 태그 사이에 들어갈게 길다,, 예시본에서 땡겨쓰자

metadata-complete="true" 이거는 제거할 것 ! -> 애노테이션 인식 못함

  • 매핑을 위한 설정
<servlet>
	<servlet-name>서블릿 구분 이름(중복x)</servlet-name>
    <servlet-class>서블릿 클래스 전체 이름(패키지명을 포함)</servlet-class>
</servlet>
<servlet-mapping>
	<servlet-name>서블릿 구분 이름</servlet-name>
    //찾고자 서블릿 구분이름을 가지고 해당하는 클래스 찾음
    <url-pattern>주소패턴</url-pattern>
</servlet-mapping>

◽ 크롬에서 경로 입력시 http://localhost:3000/day03/hello

doGet쪽으로 유입된걸 확인 할 수 있다.


내부에서 요청 헤더와 바디를 기초로 HttpServletRequest 객체를 만든다.


4. XML 문법의 기초

<?xml version="1.0" encoding="UTF-8" ?> //xml 선언자

<servlet>
	<servlet-name>서블릿 이름</servlet-name>
	<servlet-class>패키지명을 포함한 전체 서블릿 클래스 경로</servlet-class>
</servlet>
<servlet-mapping>
	<servlet-name>서블릿 이름</servlet-name>
	<url-pattern>요청 URL 패턴</url-pattern>
</servlet-mapping>

HttpServletRequest : 요청

HttpServletResponse : 응답

서블릿 API
구현체는 Tomcat쪽에 있음
페이지 이동 메서드 Response에 담겨있다 ??

  • HttpservletRequest 인터페이스

등등...

  • 상위 클래스인 ServletRequest 인터페이스
    getParameter(String name) 메서드 -> 데이터 수집...

  • HttpServletResopnse 인터페이스

SC_MOVED_TEMPORARILY: 임시이동
...

응답코드 관련된 상수도 정의되어있다..

addCookie
addHeader: 서버가 작성해서 보내줌...
getStatus(): 응답 상태코드 조회
sendError(int sc): 응답코드를 에러형태로..

sendRedirect(String location): 입력한 주소로 페이지 이동(응답 헤더를 통해서)메서드

  • ServletResponse 인터페이스에 기능이 더 있다.

setBufferSize() 버퍼를 가지고 모아서 출력하는게 좋다,,

getWriter() 출력결과물 보여줌

TOMCAT -> 동기식, 접속자 늘어나면 쓰레드가 생성된다. -> 같은 자원을 여러 쓰레드가 동시에 접근하게 된다.

  • 서블릿쪽에서 인스턴스 변수 정의하는게 좋다.

5. 웹 브라우저로부터 데이터 입력 받기

📢ServletRequest

  • String getParameter(String name): name으로 전송된 값
  • Map<String, String[]> getParameterMap(): 전체 요청 데이터를 Map 형태로 반환
  • Enumeration<\String> getParameterNames(): 전송된 모든 name을 반환
  • String[] getParameterValies(String name): name으로 전송된 값이 여러개인 경우

JoinServlet 클래스 만들고 HttpServlet 메서드 오버라이드!

content type 추가해주면 된다.

doGet() 메서드:

  • 클라이언트가 서블릿에 GET 요청을 보내면 이 메서드가 실행됩니다.
  • 먼저, resp.setContentType("text/html;charset=UTF-8");를 사용하여 응답의 컨텐츠 타입을 HTML로 설정하고, 문자 인코딩을 UTF-8로 지정합니다. 이는 응답이 HTML 형식임을 클라이언트에게 알려주고 한글을 제대로 표시하기 위함입니다.
  • PrintWriter 객체를 사용하여 응답 데이터를 클라이언트에게 전송합니다. 여기서는 HTML 폼을 출력하여 사용자에게 게시글을 작성할 수 있는 화면을 제공합니다. 제목과 내용을 입력할 수 있는 텍스트 필드와 텍스트 영역이 제공됩니다.


POST로 유입!!

name속성을 가지고 조회해보자

doPost() 메서드:

  • 클라이언트가 POST 요청을 보내면 이 메서드가 실행됩니다.

  • 먼저, req.setCharacterEncoding("UTF-8");를 사용하여 요청의 문자 인코딩을 UTF-8로 설정합니다. 이는 요청 파라미터의 한글 데이터를 제대로 받기 위함입니다.

  • req.getParameter("parameterName")을 사용하여 POST로 전송된 데이터를 읽어옵니다. 여기서는 "email", "password", "confirmPassword", "userName", "hobby" 파라미터의 값을 읽어옵니다.

  • 읽어온 데이터를 원하는 대로 처리할 수 있습니다. 이 코드에서는 콘솔에 제목, 내용, (선택된 취미)를 출력하고 있습니다.

  • req.getParameterValues("parameterName")을 사용하여 하나의 파라미터에 대해 여러 값을 받아올 수 있습니다. 여기서는 선택된 모든 취미를 배열로 받아와서 출력하고 있습니다.


🎊 이해를 위해 추가한~~

Servlet의 동작 과정

  1. 클라이언트 요청
  • 클라이언트(예: 웹 브라우저)가 특정 URL에 요청을 보냅니다. 이 요청은 HTTP 프로토콜을 통해 서버로 전달됩니다.
  • 예를 들어, 사용자가 브라우저에서 http://example/login URL을 요청하면, 이 요청이 서버로 전달됩니다.
  1. 웹 서버가 요청 받음
  • 웹 서버(예: Apache Tomcat)는 이 요청을 수신합니다.
  • 서버는 요청된 URL 패턴을 기반으로 어떤 서블릿이 이 요청을 처리할지 결정합니다. 이 결정은 web.xml 또는 애너테이션을 통해 설정된 servlet-mapping에 따라 이루어집니다.
  1. Servlet 호출
  • 서버는 해당 요청을 처리하기 위해 서블릿을 호출합니다. 서블릿 컨테이너가 서블릿의 인스턴스를 생성하고(초기 요청 시) service() 메서드를 호출합니다.
  • service() 메서드는 HTTP 메서드(GET, POST 등)에 따라 doGet() 또는 doPost()와 같은 적절한 메서드를 호출합니다.
  1. 요청 처리
  • 서블릿의 doGet()이나 doPost() 메서드에서 요청을 처리합니다.
  • 이 과정에서 HttpServletRequest 객체를 통해 클라이언트의 요청 데이터를 얻을 수 있습니다. 예를 들어, 폼 데이터, URL 파라미터, 헤더 정보 등을 얻을 수 있습니다.
  • 필요에 따라 데이터베이스와 상호 작용하거나 다른 비즈니스 로직을 수행합니다.
  1. 응답 생성
  • 요청 처리가 완료되면 서블릿은 HttpServletResponse 객체를 통해 응답을 생성합니다.
  • 응답에는 HTML, JSON, XML 등의 컨텐츠가 포함될 수 있습니다. 서블릿은 응답 데이터의 컨텐츠 타입과 상태 코드를 설정하고, 응답 본문을 작성합니다.
  1. 클라이언트로 응답 전송
  • 서블릿이 응답 생성을 완료하면, 웹 서버는 이 응답을 클라이언트로 전송합니다.
  • 클라이언트는 이 응답을 받아 화면에 표시하거나, 추가적인 처리를 수행합니다.

📃요약

  • 클라이언트 요청: 클라이언트가 웹 브라우저를 통해 특정 URL에 요청을 보냅니다.
  • 웹 서버: 서버가 요청을 수신하고, 서블릿을 호출합니다.
  • 서블릿: 서블릿이 요청을 처리하고 응답을 생성합니다.
  • 응답 전송: 서버가 서블릿의 응답을 클라이언트로 전송합니다.

/member/* -> /member/join, member/login
*: 모든 문자열

/member/*.jsp -> 확장자가 .jsp 모든 경로

    <servlet>
        <servlet-name>member-servlet</servlet-name>
        <servlet-class>servlets.MemberServlet</servlet-class>
    </servlet>
    <servlet-mapping>
        <servlet-name>member-servlet</servlet-name>
        <url-pattern>/member/*</url-pattern>
    </servlet-mapping>

6. init메서드와 destroy 메서드

GenericServlet

  • 서블릿 생명 주기에 대한 메서드

서블릿이 객체가 되면

객체 생성 후에
➡️ 1. init() 메서드 호출(객체 생성 직후 1번만 호출) / 서블릿 초기화시에 해야될 작업, 설정 작업을 주로 함

매개변수 있는 init 사용했을때🔽

설정하기 위한 재료/값을 제공

◾ ServletConfig

  • String getInitParameter(String name) -> 설정값 조회

1) 서블릿 설정 init-param: 특정 서블릿 내에서만 유효한 초기 설정 값

#web.xml
<init-param>
  <param-name> 설정 이름 </param-name>
  <param-value> 설정 값 </param-value>
 </init-param>

위의 값들은 hello-sevelet내에서만 가능

2) context-param: 모든 서블릿에서 공유하는 초기 설정 값

  • 모든 서블릿이 공유하는 설정값 넣을때
<context-param>
  <param-name> 설정명</param-name>
  <param-value> 설정값 </param-value>
</context-param>

  • 설정값 여러개일때는 태그를 여러번쓰면 됨

➡️ do....(...)형태의 메서드 : 매 요청시 마다 호출

➡️ 2. destroy() 메서드 호출(1 번 호출): 서블릿 객체가 소멸 전 호출 -> 자원 해제...

요청 총 3번했을때

destroy는 소멸 전 호출된다.


✨✨✨
xml파일에 직접 입력하지 않아도 애노테이션으로 쉽게 처리할 수 있는 방법이 있다.

profile
꽁꽁 얼어붙은 한강 위로 😺

0개의 댓글