관리 메뉴

거니의 velog

230925_Servlet 1 본문

대덕인재개발원_자바기반 애플리케이션

230925_Servlet 1

Unlimited00 2023. 9. 25. 13:23


[server.xml]

[test.jsp]

<%@ page language="java" contentType="text/html; charset=EUC-KR"
    pageEncoding="EUC-KR"%>
<% 
	String name = "홍길동";
%>
<!DOCTYPE html>
<html>
	<head>
		<meta charset="EUC-KR">
		<title>Insert title here</title>
	</head>
	<body>
		<h2><%= name %>씨 안녕하세요.<br />연습용 페이지입니다.</h2>
	</body>
</html>

- http://localhost:8090/webTest/test.jsp


[ServletTest01.java]

package kr.or.ddit.basic;

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;

/*
 * 서블릿이란? 컨테이너(서블릿 엔진)에 의해 관리되는 자바 기반 웹 컴포넌트로서
 * 			동적인 웹 컨텐츠 생성을 가능하게 해 준다.
 * 
 * 이 예제는 배포 서술자(web.xml)을 이용하여 실행할 Servlet을 등록하여 처리하는 예제이다.
 */

/*
 * http://localhost:8090/webTest/servletTest01.do
 * 
 * - http 		==> 프로토콜
 * - localhost  ==> 서버 컴퓨터 이름(또는 도메인명) 또는 서버의 IP주소
 * - 8090 		==> Port번호 (80번일 경우 생략이 가능하다.)
 * - /webTest	==> 컨텍스트 패스 (보통 웹 프로젝트 이름으로 지정한다.)
 * - /servletTest01.do ==> 서블릿 요청 패턴
 */

// Servlet클래스는 HttpServlet 클래스를 상속해서 작성한다.
public class ServletTest01 extends HttpServlet {

	// 이 클래스에서는 service()메서드 또는 doGet()메서드, doPost()메서드를 재정의해서
	// 처리할 내용을 작성한다.
	
	// doGet()메서드나 doPost()메서드는 service()메서드를 통해서 자동으로 호출된다.
	
	// 위 메서드의 매개변수로 주어지는 객체들
	// 1) HttpServletRequest객체 ==> 서비스 요청에 관련된 정보 및 메서드를 관리하는 객체
	// 2) HttpServletResponse객체 ==> 서비스 응답에 관련된 정보 및 메서드를 관리하는 객체
	
	// doGet()메서드 ==> GET방식의 요청을 처리하는 메서드
	@Override
	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		response.setCharacterEncoding("utf-8"); // 응답 문서의 인코딩 방식 설정
		response.setContentType("text/html; charset=utf-8"); // 응답 문서의 ContentType 설정
		
		// 처리한 내용을 응답으로 보내기 위해서 PrintWrite객체를 생성한다.
		PrintWriter out = response.getWriter(); // 클라이언트와 연결된 PrintWriter객체 생성
		
		// 처리한 내용을 출력한다. (==> 응답으로 전송한다.)
		
		// 방법1) append()메서드 이용하기
		out.append("<html>")
			.append("<head><meta charset='utf-8' /><title>첫번째 Servlet</title></head>")
			.append("<body>")
			.append("<h2 style='text-align: center;'>")
			.append("안녕하세요, 첫번째 Servlet 프로그램입니다.</h2>")
			.append("</body>")
			.append("</html>");
	}
	
	// doPost()메서드 ==> POST방식의 요청을 처리하는 메서드
	@Override
	protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		
	}
	
}

[web.xml]

<?xml version="1.0" encoding="UTF-8"?>
<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">

	<servlet> 
	    <servlet-name>servletTest01</servlet-name> 
	    <servlet-class>kr.or.ddit.basic.ServletTest01</servlet-class> 
	</servlet> 
	
	<servlet-mapping> 
	    <servlet-name>servletTest01</servlet-name> 
	    <url-pattern>/test01.do</url-pattern> 
	</servlet-mapping>

</web-app>

- http://localhost:8090/webTest/test01.do


[ServletTest02.java]

package kr.or.ddit.basic;

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;

/*
 * 이 예제는 서블릿 등록을 배포 서술자(web.xml)를 이용하지 않고
 * @WebServlet 이라는 애너테이션을 이용하여 등록하는 예제이다.
 * 
 * @WebServlet 애너테이션은 Servlet버전 3.0이상에서 사용할 수 있다.
 * 
 * @WebServlet 애너테이션의 속성들
 * 1. name : 서블릿의 이름을 설정한다. ( 기본값 : 빈문자열("") )
 * 2. urlPatterns : 서블릿의 URL패턴의 목록을 설정한다. ( 기본값 : 빈배열( { } ) )
 * 		예) urlPatterns="/url패턴1" 또는 urlPatterns={ "/url패턴1" } ==> 패턴이 1개일 경우
 * 		예) urlPatterns={ "/url패턴1", "/url패턴2", ... } ==> 패턴이 2개 이상일 경우
 * 3. value : urlPatterns와 동일한 기능을 한다.
 * 4. description : 주석(설명글)을 지정한다.
 */

@WebServlet(
	urlPatterns = {"/test02.go"},
	description = "애너테이션을 이용한 서블릿 설정"
)
public class ServletTest02 extends HttpServlet {

	// doGet 메서드
	@Override
	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		response.setCharacterEncoding("utf-8");
		response.setContentType("text/html; charset=utf-8");
		
		PrintWriter out = response.getWriter();
		
		// 처리한 내용 출력하기
		// 방법2) print(), println(), printf() 메서드를 이용한 내용 출력
		out.println("<html>");
		out.println("<head><meta charset='utf-8' /><title>두 번째 서블릿</title></head>");
		out.println("<body>");
		out.println("<h2>안녕하세요, 두번째 Servlet 입니다...<br />");
		out.println("@WebServlet 애너테이션을 이용한 예제입니다.</h2>");
		out.println("</body>");
		out.println("</html>");
	}
	
	// doPost 메서드
	@Override
	protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		
	}
	
}

- http://localhost:8090/webTest/test02.go


[servletTest.jsp]

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
	<head>
		<meta charset="UTF-8" />
		<title>서블릿 요청 연습</title>
		<script type="text/javascript">
			window.onload = function(){
				document.getElementById("getBtn").addEventListener("click", function(){
					location.href = "http://localhost:8090/webTest/servletTest03.do";
				});
			}
		</script>
	</head>
	<body>
	
		<h2>서블릿 요청 연습</h2>
		<br /><hr /><br />
		
		<h3>GET방식 요청하기1 ==> 링크 방식</h3>
		<a href="http://localhost:8090/webTest/servletTest03.do">GET방식 요청 1</a>
		<br /><hr /><br />
		
		<h3>GET방식 요청하기2 ==> form태그의 method속성 이용하기</h3>
		<!--  
			<form>태그의 속성
			action속성 ==> <form>태그에서 구성하여 서버로 보낸 데이터를 받아서 처리할 문서명을 지정하는 속성
			method속성 ==> get 또는 post (이 속성이 생략되면 기본적으로 Get방식으로 처리된다.)
		-->
		<form action="http://localhost:8090/webTest/servletTest03.do" method="get">
			<input type="submit" value="GET방식 요청2" />
		</form>
		<br /><hr /><br />
		
		<h3>GET방식 요청하기3 ==> javascript의 location.href속성 이용하기</h3>
		<form>
			<input id="getBtn" type="button" value="GET방식 요청3" />
		</form>
		<br /><hr /><br />
		
		<h3>POST 방식 요청하기 ==> form태그의 method속성을 'post'로 지정한 경우</h3>
		<form action="http://localhost:8090/webTest/servletTest03.do" method="post">
			<input type="submit" value="POST방식 요청" />
		</form>
		
	</body>
</html>

- http://localhost:8090/webTest/basic/servletTest.jsp


[ServletTest03.java]

package kr.or.ddit.basic;

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의 동작 과정에 대하여...
 * 
 * 1. 사용자(클라이언트)가 URL을 클릭하여 HTTP요청(Request)을 Servlet Container로 전송(요청)한다.
 * 2. 컨테이너는 web.xml에 정의된 'url패턴'을 확인하여 어느 서블릿을 통해 처리해야 할지를 검색한다.
 * 	  (로딩이 안 된 경우에는 로딩을 한다. 처음 로딩 시 init()메서드가 호출된다.)
 *    (이부분 설정의 서블릿 버전 3.0이상에서는 @WebServlet 애너테이션을 이용하여 설정할 수 있다.)
 * 3. Servlet Container는 개별 요청을 처리할 쓰레드를 생성하여 해당 서블릿 객체의 service()메서드를 호출한다.
 *    (이 때 HttpServletRequest객체와 HttpServletResponse객체를 생성하여 매개변수에 넘겨준다.)
 * 4. service()메서드는 전송 방식(GET, POST등의 메서드 타입)을 체크하여 적절한 메서드를 호출한다.
 *    (doGet(), doPost(), doPut(), doDelete() 등)
 * 5. 요청 및 응답 처리가 모두 완료되면 HttpServletRequest객체와 HttpServletResponse객체는 자동으로 소멸된다.
 * 6. 컨테이너로부터 서블릿이 제거되는 경우에는 destroy()메서드가 호출된다.
 */

// Servlet의 LifeCycle 예제
//@WebServlet(
//	urlPatterns = {"/servletTest03.do"},
//	description = "서블릿 생명 주기"
//)
@WebServlet("/servletTest03.do")
public class ServletTest03 extends HttpServlet {
	
	@Override
	public void init() throws ServletException {
		System.out.println(this.getServletName() + "에서 init() 메서드 호출");
	}
	
	@Override
	public void destroy() {
		System.out.println(this.getServletName() + "에서 destroy() 메서드 호출");
	}
	
	@Override
	protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		System.out.println("service() 메서드 시작...");
		
		// GET방식과 POST방식에 맞는 메서드 호출하기
		
		// 방법1 ==> 부모 클래스인 HttpServlet의 service()메서드에게 위임하기
//		super.service(request, response);
		
		// 방법2 ==> 클라이언트의 전송 방식(GET, POST)을 구분해서 직접 메서드 호출하기
		//			HttpServletRequest객체의 getMethod()메서드를 이용한다.
		String method = request.getMethod();
		System.out.println("method => " + method);
		
		if("GET".equals(method)) {
			doGet(request, response);
		}else {
			doPost(request, response);
		}
	}
	
	@Override
	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		System.out.println("doGet() 메서드 시작...");
		
		response.setCharacterEncoding("utf-8");
		response.setContentType("text/html; charset=utf-8");
		PrintWriter out = response.getWriter();
		
		out.println("<html>");
		out.println("<head><meta charset='utf-8' /><title>서블릿 생명 주기 - doGet()</title></head>");
		out.println("<body><h2 style='color: red;'>doGet()메서드를 처리한 결과입니다...</h2></body>");
		out.println("</html>");
	}
	
	@Override
	protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		System.out.println("doPost() 메서드 시작...");
		
		response.setCharacterEncoding("utf-8");
		response.setContentType("text/html; charset=utf-8");
		PrintWriter out = response.getWriter();
		
		out.println("<html>");
		out.println("<head><meta charset='utf-8' /><title>서블릿 생명 주기 - doPost()</title></head>");
		out.println("<body><h2 style='color: blue;'>doPost()메서드를 처리한 결과입니다...</h2></body>");
		out.println("</html>");
	}

}

'대덕인재개발원_자바기반 애플리케이션' 카테고리의 다른 글

230927_Servlet 3  (2) 2023.09.27
230926_Servlet 2  (0) 2023.09.26
230922_Log4J  (0) 2023.09.22
230921_MyBatis 과제_myBatisBoardTest  (0) 2023.09.21
230921_MyBatis 2  (0) 2023.09.21