
🌷서블릿: 자바의 웹을 구현하는 기술
자바의 웹 기술
Jakarta EE Platform API

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


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

자바 폴더에 패키지, 파일 생성
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("안녕하세요!");
}
}
특정 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 객체를 만든다.
<?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에 담겨있다 ??



등등...
상위 클래스인 ServletRequest 인터페이스
⭐getParameter(String name) 메서드 -> 데이터 수집...
HttpServletResopnse 인터페이스
SC_MOVED_TEMPORARILY: 임시이동
...
응답코드 관련된 상수도 정의되어있다..

addCookie
addHeader: 서버가 작성해서 보내줌...
getStatus(): 응답 상태코드 조회
sendError(int sc): 응답코드를 에러형태로..
sendRedirect(String location): 입력한 주소로 페이지 이동(응답 헤더를 통해서)메서드


setBufferSize() 버퍼를 가지고 모아서 출력하는게 좋다,,
getWriter() 출력결과물 보여줌

TOMCAT -> 동기식, 접속자 늘어나면 쓰레드가 생성된다. -> 같은 자원을 여러 쓰레드가 동시에 접근하게 된다.
- 서블릿쪽에서 인스턴스 변수 정의하는게 좋다.
📢ServletRequest
- String getParameter(String name): name으로 전송된 값
- Map<String, String[]> getParameterMap(): 전체 요청 데이터를 Map 형태로 반환
- Enumeration<\String> getParameterNames(): 전송된 모든 name을 반환
- String[] getParameterValies(String name): name으로 전송된 값이 여러개인 경우

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


content type 추가해주면 된다.



POST로 유입!!


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

클라이언트가 POST 요청을 보내면 이 메서드가 실행됩니다.
먼저, req.setCharacterEncoding("UTF-8");를 사용하여 요청의 문자 인코딩을 UTF-8로 설정합니다. 이는 요청 파라미터의 한글 데이터를 제대로 받기 위함입니다.
req.getParameter("parameterName")을 사용하여 POST로 전송된 데이터를 읽어옵니다. 여기서는 "email", "password", "confirmPassword", "userName", "hobby" 파라미터의 값을 읽어옵니다.

읽어온 데이터를 원하는 대로 처리할 수 있습니다. 이 코드에서는 콘솔에 제목, 내용, (선택된 취미)를 출력하고 있습니다.
req.getParameterValues("parameterName")을 사용하여 하나의 파라미터에 대해 여러 값을 받아올 수 있습니다. 여기서는 선택된 모든 취미를 배열로 받아와서 출력하고 있습니다.



🎊 이해를 위해 추가한~~
http://example/login URL을 요청하면, 이 요청이 서버로 전달됩니다.📃요약
- 클라이언트 요청: 클라이언트가 웹 브라우저를 통해 특정 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>
서블릿이 객체가 되면
객체 생성 후에
➡️ 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파일에 직접 입력하지 않아도 애노테이션으로 쉽게 처리할 수 있는 방법이 있다.
