WEB

[WEB] Servlet을 사용하여 동적 웹 사이트 만들어보기

yo~og 2021. 11. 26. 18:50

servlet으로 동적 웹 사이트를 만들어봅시다. 

 

[Servlet 개념 보러가기]

[WEB] Servlet VS JSP

 

[WEB] Servlet VS JSP

Servlet과 JSP의 각각의 개념을 알아보고 차이점도 알아봅시다. Servlet 자바를 사용하여 웹페이지를 동적으로 생성하는 서버측 프로그램 웹 서버의 성능을 향상하기 위해 사용되는 자바 클래스의

e-you.tistory.com


1. 첫 페이지 index.html 만들기

 

프로젝트의 WebContent에서 index.html을 만들어줍니다.

 

 

index.html

<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>index.html</title>
</head>
<body>
   <h1>인덱스 페이지입니다.</h1>
   <ul>
      <li><a href="hello">hello 요청</a></li>
      <li><a href="/Step01_Servlet/hello">hello 요청</a></li>
      
      <!-- 아래의 링크를 눌렀을때 "good bye client!" 가 웹브라우저에 출력되도록 프로그래밍해 보세요. -->
      <li><a href="bye">bye 요청</a></li>
      <li><a href="/Step01_Servlet/bye">bye 요청</a></li>
      
      <li><a href="time">현재 시간 보기</a></li>
      <li><a href="/Step01_Servlet/time">현재 시간 보기</a></li>
      
      <li><a href="sub/fortune">오늘의 운세보기</a></li>
      <li><a href="/Step01_Servlet/sub/fortune">오늘의 운세보기</a></li>
   </ul>

</body>
</html>

각각의 첫 링크는 상대경로, 두번째 링크는 절대경로 입니다. 두 경로 모두 접근 가능합니다.

가장 먼저 helloServlet을 보겠습니다.

 


2. 링크에 연결할 Servlet 만들기

 

helloServlet.java

package test.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;

/*
 *  /hello 요청에 대해 응답할 객체를 생성할 클래스 정의하기
 *  
 *  1. HttpServlet 클래스를 상속받는다.
 *  2. service() 메소드를 오버라이드 한다.
 *  3. service() 메소드 안에 원하는 동작을 코딩한다.
 *  4. WEB-INF/web.xml 문서를 Generate 한다.
 *  (프로젝트에 마우스 우클릭 => Java EE Tools => Generate Deployment Descriptor Stub 선택)
 *  5. web.xml 문서안에 우리가 만든 HelloServlet이 어떤 경로 요청이 왔을 때 동작을 할지 설정(맵핑)을 한다.
 */
public class HelloServlet extends HttpServlet{
	@Override
	protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
		//클라이언트에게 문자열을 출력할 수 있는 객체의 참조값 얻어오기
		PrintWriter pw = resp.getWriter();
		//문자열 두줄 출력하기
		pw.println("hi client");
		pw.println("What are you want?");
		pw.close();
	}
	
}

 

Java Resources -> src에 원하는 패키지를 만든 후 HelloServlet을 만들어줍니다.

Servlet에서는 HttpServlet 클래스를 상속받습니다. 그 다음 service를 오버라이드합니다. 이 안에서 원하는 동작을 코딩하시면됩니다. 

PrintWriter pw = resp.getWriter();을 사용하여 클라이언트에게 문자열을 출력할 수 있는 객체의 참조값을 얻어오고 pw.println(); 을 사용하여 문자열을 출력할 수 있습니다. 


3. Servlet을 매핑시켜줄 web.xml 만들기

 

 

이제 서블릿을 매핑 해주어야합니다. WEB-INF 폴더 아래에 web.xml 문서를 생성합니다.

생성 방법 : 프로젝트에 마우스 우클릭 => Java EE Tools => Generate Deployment Descriptor Stub 선택

 

 

 

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_3_1.xsd" version="3.1">
  <display-name>Step01_Servlet</display-name>
  <welcome-file-list>
    <welcome-file>index.html</welcome-file>
    <welcome-file>index.htm</welcome-file>
    <welcome-file>index.jsp</welcome-file>
    <welcome-file>default.html</welcome-file>
    <welcome-file>default.htm</welcome-file>
    <welcome-file>default.jsp</welcome-file>
  </welcome-file-list>
  
  <!-- 
  	HelloServlet 이라는 이름의 서블릿이 어디에 있는지 tomcat 서버에 알려주기
  	서블릿의 이름은 우리 마음대로 지을 수 있다.
  -->
  <servlet>
  	<servlet-name>HelloServlet</servlet-name>
  	<servlet-class>test.servlet.HelloServlet</servlet-class>
  </servlet>
  <!-- 
  	HelloServlet 이라는 이름의 서블릿이 어떤 경로 요청이 들어왔을때 동작하기 할 것인지 설정하기
  -->
  <servlet-mapping>
  	<servlet-name>HelloServlet</servlet-name>
  	<url-pattern>/hello</url-pattern>
  </servlet-mapping>
  

</web-app>

<servlet>과 <servlet-mapping>을 사용하여 매핑을 해줍시다. 

<servlet>안에서는 전에 만들어놨던 서블릿의 이름과 위치를  tomcat에 알려줍니다.

<servlet-mapping> 안에서는 HelloServlet이라는 이름의 서블릿이 어떤 경로 요청이 들어왔을때 동작하게 할 것인지 설정합니다.


4. 동작 확인

hello 요청링크를 눌러봅시다.

 

 

/hello 경로로 들어가면 HelloServlet.java 가 로딩된 것을 볼 수 있습니다.


5. web.xml 없이 Servlet 연결해보기

이렇게 매번 web.xml에서 매핑을 하면 귀찮을 때가 많습니다. 이번에는 web.xml에서 매핑을 하지 않고 servlet을 연결해봅시다.

 

TimeServlet.java

package test.servlet;

import java.io.IOException;
import java.io.PrintWriter;
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;
/*
 *	@WebServlet("요청경로")
 *
 *	요청 경로는 반드시..........
 *	/로 시작해야한다.
 *	/를 작성하지 않으면 서버가 start가 안된다.
 */
@WebServlet("/time")
public class TimeServlet extends HttpServlet {
	@Override
	protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {

		//응답 인코딩 설정
		resp.setCharacterEncoding("utf-8");
		//응답 컨텐츠 type 설정 (웹브라우저에 어떤 컨텐츠를 응답할것인지 알려서 준비를 시킨다)
		resp.setContentType("text/html;charset=utf-8");

		//요청을한 클라이언트에게 응답할수 있는 객체의 참조값 얻어오기
		PrintWriter pw = resp.getWriter();
		pw.println("<!DOCTYPE html>");
		pw.println("<html>");
		pw.println("<head>");
		pw.println("<meta charset=\"UTF-8\">");
		pw.println("<title>현재 시간 페이지</title>");
		pw.println("</head>");
		pw.println("<body>");
		Date d = new Date();
		pw.print("<p> 현재 시간 : " + d.toString()+"</p>");
		pw.println("</body>");
		pw.println("</html>");
		pw.close();
		
		
	}
}

TimeServlet입니다. 

 

 

 

<li><a href="time">현재 시간 보기</a></li>
<li><a href="/Step01_Servlet/time">현재 시간 보기</a></li>

index.html에서 위와 같은 코드와 연결해봅시다.

 

 

 

@WebServlet("/time")

TimeServlet.java에서 이 코드만 빼고 HelloServlet에서 보았던 내용과 같습니다. 이 WebServlet을 사용하면 Web.xml에서 매핑할 수고를 덜어줍니다. 여기서 주의해야할점은 경로의 가장 처음에 / 를 사용해야한다는 것입니다.