서블릿은 웹페이지를 동적으로 생성하기 위한 자바 서버 프로그램이다.
@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 등의 메서드에 필요한 내용을 구현하면 된다.
@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를 해보면 다음과 같이 잘 저장되는 것을 확인할 수 있다.