서블릿 사용하기

HY·2022년 4월 14일
0

Java 웹 개발

목록 보기
3/6

서블릿은 웹페이지를 동적으로 생성하기 위한 자바 서버 프로그램이다.

@WebServlet("/main")
public class MainServlet extends HttpServlet {
    public doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        ...
    }
    
    public doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        doGet(request, response);
    }
    ...
}

이전 포스팅 Java 웹 개발에서도 언급했듯 제공하고자 하는 메서드에 따라 doGet, doPost 등의 메서드에 필요한 내용을 구현하면 된다.

⛓ URL Mapping

@WebServlet 어노테이션으로 해당 서블릿과 연결될 url을 설정할 수 있다.
web.xml 파일에서도 서블릿 클래스와 요청 주소를 매핑할 수 있지만, 어노테이션 방식이 더 깔끔하고 보기 좋기 때문에 자주 사용되지는 않는다.

@WebServlet(name="Main Servlet", urlPatterns="/main")

위와 같은 방식으로 이름과 매핑될 url pattern을 지정할 수 있다.
또는, 그냥 다음과 같이 url pattern만 지정할 수도 있다.

@WebServlet("/main")

📩 응답 보내주기

PrintWriter 객체로 text, html 등의 응답을 보내줄 수 있다.
content type, content character encoding 등도 response 객체의 set 메서드를 통해 지정해줄 수 있다.

response.setContentType("text/html;charset=utf-8");
// response.setCharacterEncoding("utf-8");

PrintWriter out = response.getWriter();
out.print("Hello");

📜 예제

서블릿을 이용해서 도서 정보를 등록할 수 있는 간단한 웹 프로그램을 만들어보자.
먼저 입력을 받기 위해 다음과 같은 register.html을 만들었다.

<!DOCTYPE html>
<html lang="en">
  <head>
    <meta charset="UTF-8" />
    <meta http-equiv="X-UA-Compatible" content="IE=edge" />
    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
    <title>도서 관리</title>
  </head>
  <body>
    <h2>도서 관리</h2>
    <form action="main" accept-charset="utf-8">
      <fieldset style="width: 150">
        <input type="hidden" name="action" value="regist" method="post" />
        <legend>도서 관리</legend>
        <div><label for="isbn">도서번호</label> <input type="text" name="isbn" id="isbn" /></div>
        <div><label for="title">도서명</label> <input type="text" name="title" id="title" /></div>
        <div><label for="author">저자</label> <input type="text" name="author" id="author" /></div>
        <div><label for="price">가격</label> <input type="text" name="price" id="price" /></div>
        <div><label for="desc">설명</label> <input type="text" name="desc" id="desc" /></div>
        <div><button id="registBtn">등록</button> <button id="cancelBtn">취소</button></div>
      </fieldset>
    </form>
  </body>
</html>

입력
이 페이지에서 위와 같이 입력을 했을 때, 해당 정보를 데이터베이스에 넣고, 어떤 값이 들어갔는지 입력 내용을 확인할 수 있는 다음과 같은 페이지를 만들어 볼 것이다.

받은 데이터를 쉽게 관리하고 데이터베이스에 넣기 위해, 저번에 만들었던 BookDto와 BookDao를 사용했다. 이전 포스팅 : JDBC와 DAO, DTO
프로젝트 구조

먼저, 위의 register.html에서 보면 /main 으로 parameter로는 action=regist과 책 데이터들 (isbn=1, title=도서1, ... ) 를 보내주고 있다.
현재는 action=register 하나만 존재하지만, 나중에 책 조회 등의 다른 기능들도 만들고 싶으면 action=view 등 다른 action 들도 만들어서 서블릿에서 if else문으로 처리해주면 된다.

package com.practice.backend.servlet;

import java.io.IOException;
import java.io.PrintWriter;
import java.sql.SQLException;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import com.practice.backend.dao.BookDao;
import com.practice.backend.dao.BookDaoImpl;
import com.practice.backend.dto.Book;

@WebServlet("/main")
public class MainServlet extends HttpServlet {
	private static final long serialVersionUID = 1L;
	private static final BookDao bookDao = BookDaoImpl.getBookDao();
    
	protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		request.setCharacterEncoding("utf-8");
		doGet(request, response);
	}
	
	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		
		String act = request.getParameter("action");
		
		if ("regist".equals(act)) {
			doRegist(request, response);
		}
		
	}

	private void doRegist(HttpServletRequest request, HttpServletResponse response) throws IOException {	
		Book book = new Book();
		
		book.setIsbn(request.getParameter("isbn"));
		book.setTitle(request.getParameter("title"));
		book.setAuthor(request.getParameter("author"));
		book.setPrice(Integer.parseInt(request.getParameter("price")));
		book.setDesc(request.getParameter("desc"));
		book.setImg(request.getParameter("img"));
		
		try {
			bookDao.insert(book);
			
			response.setCharacterEncoding("utf-8");
			PrintWriter out = response.getWriter();
			out.print("<!DOCTYPE html><html lang='en'><head><meta charset='UTF-8' /><meta http-equiv='X-UA-Compatible' content='IE=edge' /><meta name='viewport' content='width=device-width, initial-scale=1.0' /><title>도서 입력</title></head><body><h2>입력 내용</h2><div>");
			out.print(book.toString());
			out.print("</div></body></html>");
			
		} catch (SQLException e) {
			e.printStackTrace();
		}
	}

}

위의 코드는 action=regist인 경우, doRegist 함수를 호출해서 그 함수안에서 parameter들을 받아 Book 객체 (DTO) 에 저장하고, 이 데이터를 DB에 넣은 후, 입력 내용을 출력하는 코드이다.
연결된 데이터베이스에서 select를 해보면 다음과 같이 잘 저장되는 것을 확인할 수 있다.

0개의 댓글