2024. 7. 12. 23:42ㆍWebBack/Spring
기존의 코드를 서블릿 형식으로 바꾸기
기존의 TwoDice 코드이다. 이를 서블릿으로 바꾸려면 어떻게 해야할까?
@Controller
public class TwoDice{
@RequestMapping("/rollDice")
public static void main(HttpServletResponse response) throws IOException {
int idx1 = (int)(Math.random()*6)+1;
int idx2 = (int)(Math.random()*6)+1;
response.setContentType("text/html");
response.setCharacterEncoding("utf-8");
PrintWriter out = response.getWriter();
out.println("<html>");
out.println("<head>");
out.println("</head>");
out.println("<body>");
out.println("<img src='resources/img/dice" + idx1 + ".jpg'>");
out.println("<img src='resources/img/dice" + idx2 + ".jpg'>");
out.println("</body>");
out.println("</html>");
}
}
1. @Controller와 @RequestMapping을 @WebServlet으로 바꾼다.
2. 서블릿은 클래스 상속을 받아야 한다. extends HttpServlet을 추가하자. (자바에서는 상속을 하나만 받을 수 있다는 점에서 Controller가 더 유용하다. 특히 매핑을 클래스 단위로 해서 URL마다 클래스를 여러개 만들어야 한다.)
3. service 메서드에는 HttpServletRequest request와 HttpServletResponse response가 항상 들어가야 한다. 그리고 service는 오버라이딩을 이용한 것이라 @Override를 써주는 것이 좋다.
@WebServlet("/rollDice2")
public class TwoDiceServlet extends HttpServlet{
@Override
public void service (HttpServletRequest request, HttpServletResponse response) throws IOException {
int idx1 = (int)(Math.random()*6)+1;
int idx2 = (int)(Math.random()*6)+1;
response.setContentType("text/html");
response.setCharacterEncoding("utf-8");
PrintWriter out = response.getWriter();
out.println("<html>");
out.println("<head>");
out.println("</head>");
out.println("<body>");
out.println("<img src='resources/img/dice" + idx1 + ".jpg'>");
out.println("<img src='resources/img/dice" + idx2 + ".jpg'>");
out.println("</body>");
out.println("</html>");
}
}
제대로 실행되는 것을 확인할 수 있다. 그런데 왜 메서드 이름을 service로 해야할까? 이를 이해하기 위해서는 서블릿의 기본적인 메서드를 확인할 필요가 있다.
서블릿의 구조
서블릿은 기본적으로 3가지 메서드를 가지고 있다.
1. init : 서블릿을 초기화 - 서블릿을 생성 또는 리로딩할 때, 한 번만 실행됨
2. service : 호출될 때마다 반복적으로 실행됨
3. destroy : 뒷정리 작업. 서블릿이 제거될 때, 한 번만 실행
아래가 이를 기반으로 만든 기본 구조이다. 참고로 서블릿 콘테이너가 객체를 생성해주므로 따로 만들 필요가 없다. 서블릿은 싱글톤이기 때문에 객체를 여러개 만들어 메모리를 낭비하지 않는다. 그래서 init이 한 번만 실행된다.
@WebServlet("/hello2")
public class HelloServlet extends HttpServlet {
@Override
public void init() throws ServletException {
System.out.println("init() is called");
}
@Override
protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
System.out.println("service() is called");
}
@Override
public void destroy() {
System.out.println("destroy() is called");
}
}
클래스 이름을 지정하고 [source] -> [override/implement methods] -> init, service, destroy 선택으로 간단히 만들 수 있다.
'WebBack > Spring' 카테고리의 다른 글
[Spring] JSTL를 써보자 (0) | 2024.07.13 |
---|---|
[Spring] JSP 알아보기 (0) | 2024.07.13 |
[Spring] 자바 버전을 바꿔보자 (0) | 2024.07.09 |
[Spring] 어떻게 view로 전달이 될까? (0) | 2024.07.09 |
[Spring] MVC 패턴 (0) | 2024.07.09 |