[WEB] Servlet을 사용하여 동적 웹 사이트 만들어보기
servlet으로 동적 웹 사이트를 만들어봅시다.
[Servlet 개념 보러가기]
[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에서 매핑할 수고를 덜어줍니다. 여기서 주의해야할점은 경로의 가장 처음에 / 를 사용해야한다는 것입니다.