반응형
방법1-1. 서블릿 클래스 작성
HelloServlet.java
package xyz.itwill.servlet;
import java.io.IOException;
import java.io.PrintWriter;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
//서블릿 프로그램 작성 방법
//💝1-1.
//javax.servlet.http.HttpServlet 클래스를 상속받은 자식클래스로 작성 - 서블릿 클래스
//=> [현재 우리가 사용하는 라이브러리 : JavaSE 라이브러리]
//=> [HttpServlet 클래스 - J2EE 라이브러리에 있는 클래스] >> [Apache Tomcat이 제공해주는 라이브러리에 있는 클래스]
//💝1-2.
//HttpServlet 클래스를 상속받은 자식클래스는 객체 직렬화 클래스이므로serialVersionUID 필드를 선언하는 것을 권장
public class HelloServlet extends HttpServlet {
private static final long serialVersionUID = 1L; //객체단위로 입출력할 때 필요한 것인데, 아직 안하므로 기본적인 serialVersionUID로 만듦
//💝2.
//HttpServlet 클래스의 doGet() 메소드 또는 doPost() 메소드 오버라이드 선언
//=> 클라이언트 요청에 대한 처리와 처리결과를 동적으로 웹문서를 생성하여 응답하기 위한 메소드
//=> 요청 처리 메소드 (WAS 프로그램에 의해 자동 호출)
//=> ex. doGet() 메소드에 POST 방식으로 요청하면? 405 error(허용하지 않는 요청방식) 떨어짐
//💝2-1.
//doGet()
//=>클라이언트가 해당 웹프로그램을 GET 방식으로 요청한 경우 호출되는 메소드
//doPost()
//=>클라이언트가 해당 웹프로그램을 POST 방식으로 요청한 경우 호출되는 메소드
//service()
//=>doGet() 메소드 또는 doPost() 메소드 대신 service() 메소드 오버라이드 선언 가능
//=>service() 메소드가 doGet()메소드 또는 doPost() 메소드보다 호출 우선순위가 높게 설정
//=>클라이언트가 해당 웹프로그램을 모든 요청방식으로 요청한 경우 호출되는 메소드
//💝2-2.
//WAS프로그램에 의해 메소드가 호출될 때,
//HttpServletRequest 겍체(request객체)와
//HttpServletResponse 객체(response객체)가 매개변수에 저장되어 제공
//💝2-3.
//HttpServletRequest
//=> 리퀘스트 메세지(요청 관련 정보)를 표현한 객체 - 입력 역할
//HttpServletResponse
//=> 리스폰즈 메세지(응답 관련 정보)를 표현한 객체 - 출력 역할
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//💝3. (선택)
//클라이언트에게 전송할 데이타 타입 설정 => 인코딩 지정
//=>클라이언트에게 응답할 결과에 대한 파일의 형식(MimeType)을 설정(변경)해야함
//형식:
//=>HttpServletResponse.setContentType(String mimeType[;charset=encoding])
//=>응답파일이 문서파일인 경우 문자의 형태(캐릭터셋 : CharacterSet : 인코딩) 설정
//=> [기본 응답파일] 형식: [text/html] , 캐릭터셋: [ISO-8859-1(서유럽어)]
response.setContentType("text/html;charset=utf-8"); //한글사이트 만들기 위한 설정
//"3번" 필수아님 : 한글사이트 만들기 위함이므로 영문사이트 만들 시 필요없음
//💝4. (선택)
//클라이언트에 데이타를 전송하기 위한 출력스트림 생성
//클라이언트 요청에 의해 생성된 응답파일에 대한 출력스트림을 반환받아 저장
//형식: HttpServletResponse.getOutputStream()
//=>원시데이타(1Btye)를 전달할 수 있는 출력스크림(ServletOutputStream 객체)를 반환하는 메소드
//=> 그림, 소리, 동영상 파일 등을 생성하여 클라이언트에게 응답하기 위한 출력스트림
//형식: HttpServletResponse.getWriter()
//=>인코딩 처리된 문자데이타(2Btye)를 전달할 수 있는 출력스크림(PrintWriter 객체)를 반환하는 메소드
//=> PlainText, HTML, XML, JSON 파일 등과 같은 문서파일을 생성하여 클라이언트에게 응답하기 위한 출력스트림
PrintWriter out = response.getWriter();
//"4번" 필수아님 : 요청에 대한 처리를 끝내고 클라이언트에게 응답결과로 문서를 만들어주지 않고, 응답결과로 URL 주소를 제공하여 재요청하라고 할 수도 있음
//서버 : "클라야, URL 주소를 하나 알려줄테니 다시 요청해봐~"
//💝5.
//클라이언트에 데이타 전송 => HTML
//요청에 대한 처리와 처리에 대한 결과를 출력스트림을 사용하여 응답파일 생성
out.println("<!DOCTYPE html>"); //출력스트림으로 문자열(HTML 태그)을 전달하여 문서파일 작성
out.println("<html>");
out.println("<head>");
out.println("<meta charset='UTF-8'>");
out.println("<title>Servlet</title>");
out.println("</head>");
out.println("<body>");
out.println("<h1>서블릿(Servlet)</h1>");
out.println("<hr>");
out.println("<p>Hello, Servlet!!!</p>");
out.println("</body>");
out.println("</html>");
//실행 시 아직 브라우저에 출력되지 않음!!
//우리가 지금까지 만든 것은 서블릿클래스이지, 서블릿이 아님
//💝6.
//서블릿 클래스를 서블릿(웹프로그램)으로 실행되도록 설정
//=> [Web.xml] 파일에서 서블릿 클래스를 서블릿(웹프로그램)으로 등록하여
//=> 서블릿을 요청할 수 있는 URL 주소 매핑 설정
//=> (서블릿 파일은 반드시 Servlet 매핑을 해야함)
//클라이언트가 매핑된 URL 주소로 서블릿을 요청한 경우,
//WAS 프로그램은 서블릿 클래스로 객체를 생성하고 -> 요청 처리 메소드를 호출하여 -> 요청에 대한 처리와 응답결과를 생성
//=> 서블릿 클래스가 "이미" 객체로 생성된 경우에는 요청 처리 메소드만 호출하여 실행
}
}
방법1-2. 서블릿 매핑
1) 서블릿 매핑이란?
- URL에서 Servlet 클래스를 요청하기 위한 이름을 지정하는 것
- WebContent >> WEB-INF >> web.xml 파일 수정 ( <servlet> 및 <servlet-mapping> 태그 추가)
- web.xml
- 현재 프로젝트가 WAS 프로그램에 의해 웹자원(WebContext)로 변형될 때
필요한 정보를 제공하기 위한 환경설정파일 (configuration파일) - XSD 파일(XML 스키마 파일)에 선언된 태그(엘리먼트)만 사용 가능
2) 요청할 URL 주소 예시
- 클라이언트가 요청할 URL 주소 : ex) /(root context) 밑에 hello.itwill
- http://localhost:8000/servlet/hello.itwill
- http://localhost:8000 /(서버 루트디렉토리) servlet /(Context 루트디렉토리) hello.itwill
3) 서블릿 매핑 형식
<servlet>
<servlet-name>서블릿명</servlet-name>
<servlet-class>서블릿클래스명</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>서블릿명</servlet-name>
<url-pattern>URL매핑이름</url-pattern>
</servlet-mapping>
web.xml
<?xml version="1.0" encoding="UTF-8"?>
<!-- => WAS 프로그램이 실행될 때 "자동으로 읽어" 필요한 설정에 맞게 동작됨 -->
<web-app xmlns:xsi="<http://www.w3.org/2001/XMLSchema-instance>" xmlns="<http://xmlns.jcp.org/xml/ns/javaee>" xsi:schemaLocation="<http://xmlns.jcp.org/xml/ns/javaee> <http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd>" id="WebApp_ID" version="4.0">
<display-name>servlet</display-name>
<!-- context-param : 현재 프로젝트에 작성된 모든 웹프로그램에게 필요한 값을 제공하기 위한 엘리먼트 -->
<context-param>
<!-- param-name : 제공값을 구분하기 위한 이름(식별자)을 설정하는 엘리먼트 -->
<param-name>name</param-name>
<!-- param-value : 제공될 값을 설정하는 엘리먼트 -->
<param-value>홍길동</param-value>
</context-param>
<!-- 💝servlet : 서블릿 클래스를 서블릿(웹프로그램)으로 등록하기 위한 엘리먼트 -->
<servlet>
<!-- servlet-name : 서블릿을 구분하기 위한 이름(식별자)을 설정하는 엘리먼트 -->
<servlet-name>hello</servlet-name>
<!-- servlet-class : 서블릿으로 등록될 서블릿 클래스를 설정하는 엘리먼트 -->
<servlet-class>xyz.itwill.servlet.HelloServlet</servlet-class>
<!-- init-param : 현재 서블릿(웹프로그램)에게 필요한 값을 제공하기 위한 엘리먼트 : HelloServlet 클래스만 사용 가능 -->
<init-param>
<param-name>title</param-name>
<param-value>서블릿</param-value>
</init-param>
</servlet>
<!-- 💝servlet-mapping : 서블릿을 실행하기 위한 요청 URL 주소의 패턴을 등록하기 위한 엘리먼트 -->
<servlet-mapping>
<!-- servlet-name : 요청 URL 주소에 의해 실행될 서블릿의 이름을 설정하는 엘리먼트 -->
<servlet-name>hello</servlet-name>
<!-- url-pattern : 서블릿을 실행하기 위한 URL 주소의 패턴을 설정하는 엘리먼트 -->
<url-pattern>/hello.itwill</url-pattern>
</servlet-mapping>
<!-- welcome-file-list : 기본 웹프로그램을 등록하기 위한 엘리먼트 -->
<!-- 기본 웹프로그램 : 클라이언트가 서버에 접속하여 웹프로그램을 요청하지 않은 경우 기본적으로 실행되어 응답될 웹프로그램 - 메인페이지 -->
<welcome-file-list>
<!-- welcome-file : 기본 웹프로그램(welcomeFile)의 이름을 설정하기 위한 엘리먼트 -->
<!-- => 순차적으로 적용 -->
<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>
</web-app>
- 설정이 잘 되었는지 확인 가능!

방법2. 어노테이션을 이용한 서블릿클래스 작성 및 매핑
1) 이클립스의 서블릿
- 마우스 오른쪽 버튼 클릭 >> servlet >> class name >> URL mappings >> 필요한기능 선택 >> web.xml 파일 수정 없이 이용 가능!
- URL주소 : http://172.16.5.1:8000/servlet/first.itwill >>>>> FirstServlet 클래스의 내용이 실행됨
- Servlet 3.0 이상에서는 web.xml를 수정하는 방법보다 Servlet 파일에 @WebServlet 어노테이션을 사용하여 매핑함
FirstServlet.java
package xyz.itwill.servlet;
import java.io.IOException;
import java.io.PrintWriter;
import java.text.SimpleDateFormat;
import java.util.Date;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
//💝6.
//어노테이션(annotation) : API 문서에 특별한 설명을 제공하기 위해 만들어진 기능
// => 프로그램 작성에 필요한 특별한 의미를 제공하거나 실행에 필요한 정보를 제공하는 기능
//@WebServlet : 서블릿 클래스를 서블릿으로 등록하고 URL 주소를 매핑하기 위한 어노테이션
//=> [web.xml] 파일의 <servlet> 엘리먼트와 <servlet-mapping> 엘리먼트가 제공하는 기능과 동일한 효과 제공
//@WebServlet 어노테이션의 속성을 사용하여 서블릿 이름과 요청 URL 주소 설정
// => name 속성(선택) : 서블릿의 이름을 속성값으로 설정 - 속성 설정을 생략하면 클래스명을 서블릿 이름으로 자동 설정
// => value 속성(필수) : 요청 URL 주소를 속성값으로 설정 - 다른 속성이 없는 경우 속성값만 설정 가능
//@WebServlet(name="first" ,value="/first.itwill")
@WebServlet("/first.itwill")
//💝1.
public class FirstServlet extends HttpServlet {
private static final long serialVersionUID = 1L;
//💝2.
//클라이언트의 모든 요청방식에 의한 요청을 처리하기 위해 자동 호출되는 메소드 - 요청 처리
// => 클라이언트 요청에 대한 처리 명령(request객체)과 응답결과를 생성(response객체)하기 위한 명령 작성
protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//💝3.
//💝4.
//클라이언트에게 응답할 결과에 대한 생성하기 위한 출력스트림을 반환받아 저장
// => 클라이언트 요청에 대한 응답결과 파일을 생성하지 않을 경우 생략 가능
// => 클라이언트에게 URL 주소로 응답할 때
response.setContentType("text/html;charset=utf-8");
//클라야, 나 html문서 만들꺼고, 그 문서는 utf-8로 되어있어!
PrintWriter out = response.getWriter();
//💝5.
//요청에 대한 처리와 응답을 위한 결과파일 생성
// => 서블릿은 모든 클라이언트에게 일관성 있는 처리결과를 동적으로 생성하여 제공함 - 서블릿을 이용하는 이유
//vs 자바스크립트 : 클라이언트가 가진 날짜와 시간을 이용하므로, 클라이언트마다 결과물 다를 수 있음
//VS 서블릿 : 서버가 가진 날짜와 시간을 이용하므로, 똑같은 결과물 나옴
//서버 시스템의 날짜와 시간 저장된 Date 객체 생성
Date now = new Date();
//날짜와 시간 관련 패턴 정보가 저장된 SimpleDateFormat 객체 생성
SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy년 MM월 dd일 HH시 mm분 ss초");
//SimpleDateFormat 객체의 format() 메소드를 호출하여 매개변수로 전달받은 Date 객체를
//SimpleDateFormat 객체에 저장된 패턴의 날짜와 시간 형식의 문자열로 변환하여 반환
String displayNow = dateFormat.format(now);
//response 객체의 body : 아래의 HTML 문서 파일을 담아 클라이언트에게 응답
out.println("<!DOCTYPE html>");
out.println("<html>");
out.println("<head>");
out.println("<meta charset='UTF-8'>");
out.println("<title>Servlet</title>");
out.println("<style type=\\\\"text/css\\\\">");
out.println("p {");
out.println("width: 600px;");
out.println("margin: 0 auto;");
out.println("padding: 30px 0;");
out.println("font-size: 2em;");
out.println("font-weight: bold;");
out.println("text-align: center;");
out.println("border: 2px solid black;");
out.println("}");
out.println("</style>");
out.println("<script type='text/javascript'>");
out.println("setInterval(function() { location.reload(); }, 1000);");
out.println("</script>");
out.println("</head>");
out.println("<body>");
out.println("<h1>서블릿 시계</h1>");
out.println("<hr>");
out.println("<p>"+displayNow+"</p>");
out.println("</body>");
out.println("</html>");
//서블릿의 장점: 모든 클라이언트에게 일관성 있는 결과물 제공
//서블릿의 단점: 웹문서 만들기 어려움 - 자동완성 기능 없음
//서블릿의 단점 보완 : JSP
//=> 웹 문서 형태로 JSP를 만들면 웹프로그램이 됨
//=> 자동완성 기능 사용 가능
//WAS가 클라이언트의 요청을 받아 FirstServlet 클래스를 객체로 만들어서
//오버라이드 선안한 service() 메소드 호출해 실행함
//=> 실행한 내용 요청에 대한 응답 결과물 + 출력스트림을 통해 보내줌
//실행한 결과물을 response 객체에 담아서 클라이언트에게 응답함
//클라이언트는 그 결과물을 받아서 출력
}
}
반응형
'servlet' 카테고리의 다른 글
[servlet] 6. 쿠키 생성, 전달, 제거 프로그램 (cookie) (0) | 2024.05.25 |
---|---|
[servlet] 5. 파일업로드 프로그램 (multipart/form-data) (0) | 2024.05.24 |
[servlet] 4. 회원가입 프로그램 (form) (0) | 2024.05.24 |
[servlet] 3. 공지사항 프로그램(이미지, html) (0) | 2024.05.23 |
[servlet] 1. 서블릿의 개념, 동작원리 및 생명주기(Lifecycle) 관리 (0) | 2024.05.22 |