수업 내용 정리
(8주차 51일) Servlet, html
헨헨7
2024. 7. 1. 17:43
Servlet, JSP, JDBC
Servlet
> 서블릿
- 서블릿은 웹 브라우저로부터 요청을 받아 처리하고 결과를 다시 웹 브라우저로 전송하는 역할을 한다.
- 일반적인 자바 클래스와 다르게 javax.servlet.http.HttpServlet 클래스를 상속해야 한다.
- HttpServlet 클래스는 서블릿이 웹상에서 HTTP 프로토콜을 이용해 서비스를 처리하기 위해 반드시 상속해야 하는 클래스이다.
> 서블릿 동작 구조
- 클라이언트가 웹 브라우저를 통해 요청을 보낸다.
- 해당 요청이 서블릿에 대한 요청이면 서블릿 컨테이너에게 처리를 넘긴다.
- 서블릿에서 요청에 대한 실행이 완료된 후에는 서블릿 컨테이너가 실행 결과를 웹서버에 전달한다.
- 웹서버는 서비스를 요청한 클라이언트에 응답한다.
- 컨테이너의 서블릿에 대한 설정은 배표 서술자(web.xml)에 작성한다.
> 서블릿 생명주기
- 첫 번째 요청일 경우, 서블릿 객체를 생성하고 init() 메소드를 호출한다.
이후 요청에 대해서는 서블릿 객체 생성, init()메소드는 호출하지 않는다. - 다음에 service() 메소드가 클라이언트 요청 방식에 따라 doGet() 또는 doPost() 메소드를 호출한다.
- 최종적으로 서블릿이 서비스되지 않았을 때 destroy() 메소드를 호출한다.
destroy() 메소드는 보통 서버가 종료되었을 때, 서블릿의 내용이 변경되어 재 컴파일 될 때 호출된다.
> 배포 서술자(Deploymetn Descriptor)
- 애플리케이션에 대한 전체 설정 정보를 가지고 있는 파일으로, 배포 서술자의 정보를 가지고 웹 컨테이너가 서블릿을 구동한다.
- 웹 애플리케이션 폴더의 WEB-INF 폴더에 web.xml 파일이 배포 서술자이다.
- 설정 정보
- Servlet 정의, Servlet 초기화 파라미터
- Session 설정 파라미터
- Servlet/JSP 매핑, MIME type 매핑
- 보안 설정
- Welcome file list 설정
- 에러 페이지 리스트, 리소스, 환경 변수
Web.xml
<?xml version="1.0" encoding="UTF-8"?>
<!--
배포 서술자(DD, Deployment Descriptor)
- 배포 서술자는 웹 애플리케이션의 기본적인 설정을 위해 작성하는 파일이다.
-->
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns="https://jakarta.ee/xml/ns/jakartaee"
xsi:schemaLocation="https://jakarta.ee/xml/ns/jakartaee
https://jakarta.ee/xml/ns/jakartaee/web-app_6_0.xsd"
id="WebApp_ID" version="6.0">
<display-name>01-servlet</display-name>
<!--
welcome-file-list
- 클라이언트가 페이지 이름을 생략하고 요청했을 때 기본 웹 페이지에 대한 설정이다.
-->
<welcome-file-list>
<welcome-file>index.html</welcome-file>
<welcome-file>index.jsp</welcome-file>
<welcome-file>index.htm</welcome-file>
<welcome-file>default.html</welcome-file>
<welcome-file>default.jsp</welcome-file>
<welcome-file>default.htm</welcome-file>
</welcome-file-list>
<!-- 서블릿 등록 및 매핑 -->
<servlet>
<servlet-name>first</servlet-name> <!-- 등록할 이름 작성 -->
<servlet-class>com.beyond.servlet.FirstServlet</servlet-class> <!-- 등록할 서블릿 클래스 -->
</servlet>
<!-- http://localhost:8080/01-servlet/first.do -->
<servlet-mapping>
<servlet-name>first</servlet-name> <!-- 등록한 이름 작성 -->
<url-pattern>/first.do</url-pattern> <!-- 접근 URL 패턴 -->
</servlet-mapping>
</web-app>
FirstServlet.java
package com.beyond.servlet;
import java.io.IOException;
import java.io.PrintWriter;
import java.time.LocalDateTime;
import jakarta.servlet.ServletException;
import jakarta.servlet.http.HttpServlet;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;
/**
* 서블릿을 실행시키는 방법
* 1. jakarta.servlet.http.HttpServlet 상속하는 클래스를 생성한다.
* 2. 서블릿 등록 및 매핑한다.
* - web.xml에 서블릿을 등록 및 매핑한다.
* - @WebServlet 애노테이션으로 서블릿을 등록 및 매핑한다.
*/
public class FirstServlet extends HttpServlet {
public static final long serialVersionUID = -5206829137206333067L;
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp)
throws ServletException, IOException{
// 응답 헤더를 설정하는 메소드(한글 깨짐 현상 때문에 인코딩 설정)
resp.setContentType("text/html;charset=utf8");
System.out.println("클라이언트로부터 GET 요청을 받음");
// 응답 화면을 출력하기 위한 출력 스트림을 얻어온다.
PrintWriter out = resp.getWriter();
// 자바 코드로 응답 화면을 작성
out.write("<!DOCTYPE html>");
out.write("<html>");
out.write("<body>");
out.write("<h1>첫 번째 서블릿이 반환한 내용</h1>");
out.write("<p>현재 시간: " + LocalDateTime.now().toString() + "</p>");
out.write("</body>");
out.write("</html>");
out.write("<!DOCTYPE html>");
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp)
throws ServletException, IOException{
}
}
UserForm.html
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>개인 정보 입력</title>
</head>
<body>
<h2>개인 정보 입력</h2>
<form action="/01-servlet/method.do" method="get">
<label for = "name">이름: </label>
<input type = "text" id = "name" name = "userName"/>
<br>
<label for = "name">나이: </label>
<input type = "text" id = "age" name = "userAge"/>
<br>
<label><input type = "radio" name = "gender" value = "남자" checked/>남자</label>
<label><input type = "radio" name = "gender" value = "여자"/>여자</label>
<br>
<label>좋아하는 음식: </label>
<label><input type = "checkbox" name = "food" value = "한식" checked/>한식</label>
<label><input type = "checkbox" name = "food" value = "중식"/>중식</label>
<label><input type = "checkbox" name = "food" value = "일식"/>일식</label>
<label><input type = "checkbox" name = "food" value = "양식"/>양식</label>
<label><input type = "checkbox" name = "food" value = "분식"/>분식</label>
<br> <br>
<input type="submit" value = "전송"/>
<input type="reset" value = "취소"/>
</form>
</body>
</html>