Java/Servlet & JSP

MVC 식 Servlet 사용

체리필터 2009. 1. 21. 16:50
728x90
반응형

Head First Servlet & JSP 책을 통해 알게 된 MVC 식 Servlet 예제를 통해 기본적인 Servlet & JSP가 어떻게 돌아가는지 확인해 본다.
기본적인 디렉토리는 아래와 같다는 가정하에 작업을 한다.


1. 디렉토리 구성

src밑에 com.example.web 패키지와 com.example.model 패키지를 만든다.(패키지는 디렉토리와 같은 개념이다.)
web 디렉토리 밑에는 일반적인 servlet이 들어가며, model 밑에는 Pojo Java가 들어간다.
기본적인 html 파일인 form.html과 결과값을 처리할 jsp 파일인 result.jsp 파일은 WebContent 밑에 들어간다.

2. web.xml 작성

WebContent/WEB-INF/web.xml에 다음과 같이 작성한다.

 <servlet>
      <servlet-name>Ch3 Beer</servlet-name>
      <servlet-class>com.example.web.BeerSelect</servlet-class>
  </servlet>
  <servlet-mapping>
      <servlet-name>Ch3 Beer</servlet-name>
      <url-pattern>/SelectBeer.do</url-pattern>
  </servlet-mapping>​
3. form.html은 다음과 같이 작성한다.
<html>
<body>
<h1 align="center">Beer Selection Page</h1>
<form method="post" action="SelectBeer.do">
Select beer characteristics<p>
Color:
<select name="color" size="1">
    <option>light</option>
    <option>amber</option>
    <option>brown</option>
    <option>dark</option>
</select>
<br><br>
<center>
    <input type="submit">
</center>
</form>
</body>
</html>​
form.html파일에서 호출하는 파일은 SelectBeer.do파일이며 DocumentRoot 디렉토리 바로 아래서 호출하게 되므로 http://localhost:8080/SelectBeer.do 파일을 호출하게 될 것이다.
호출하는 방식은 post 형식이다.
web.xml 파일에 설정한 대로 SelectBeer.do url pattern은 Ch3 Beer라고 이름이 정해진 서블릿을 찾아 호출하게 된다. 즉 com.example.web 패키지 밑에 있는 BeerSelect.class 파일을 호출하게 되는 것이다.

4. BeerSelect.java(Servlet)
package com.example.web;

import com.example.model.*;

import java.awt.List;
import java.io.IOException;
import java.io.PrintWriter;
import java.util.ArrayList;
import java.util.Iterator;

import javax.servlet.RequestDispatcher;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

public class BeerSelect extends HttpServlet {
    public void doPost(HttpServletRequest request, HttpServletResponse response) throws IOException, ServletException {        
        String c = request.getParameter("color");
        
        BeerExpert be = new BeerExpert();
        ArrayList result = be.getBrands(c);
        
        request.setAttribute("styles", result);
        
        RequestDispatcher view = request.getRequestDispatcher("result.jsp");
        view.forward(request, response);
    }
}​
5. BeerExpert.java(Pojo Java)
package com.example.model;

import java.util.ArrayList;

public class BeerExpert {
    public ArrayList getBrands(String color) {
        ArrayList brands = new ArrayList();
        if(color.equals("amber")) {
            brands.add("Jack Amber");
            brands.add("Red Moose");
        } else {
            brands.add("Jail Pale Ale");
            brands.add("Gout Stout");
        }
        
        return(brands);
    }
}​
form.html에서 select list의 이름으로 지어진 color란 값을 BeerSelect에서 request객체의 getParameter메소드로 받아 c란 변수에 담아둔다.
model에 있는 BeerExpert에서 경우에 따라 값을 선택한 후 리턴한다.
BeerSelect Servlet에서는 리턴된 값을 result에 받아서 request 객체에 담아 result.jsp로 forward 한다.

6. result.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%@ page import="java.util.*" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Beer Recommendation JSP</title>
</head>
<body>
<h1 align="center">Beer Recommendation JSP</h1>
<%
    ArrayList styles = (ArrayList)request.getAttribute("styles");
    Iterator it = styles.iterator();
    while(it.hasNext()) {
        out.println("<br>try : " + it.next());
    }
%>
</body>
</html>​

request 객체에서 styles란 변수에 담긴 내용을 가져와서 루프를 돌면서 보여준다.

==================================================================================================

위와 같이 작업을 하게 되면, BeerSelect가 controller, BeerExpert가 model, result.jsp가 view가 되는 것이다.
기존 php 개발과 비교해 보면 상당히 난잡(?) 한 느낌이 든다.
객체 지향이라는 기본적인 개념은 상당히 좋은 개념인 듯 한데, 실제 적용에는 상당히 복잡해 보인다.
앞으로 이런 삽질을 계속 해 대야 하다니 ^^;;

덧. 되도 않는 UML을 그려 봤습니다. 사실 사용법을 몰라 대충 그린 건데, 글로 설명하는 것보다 이미지 설명이 그나마 좋을 듯 해서 첨부합니다. ^^



728x90
반응형

'Java > Servlet & JSP' 카테고리의 다른 글

Session 관리  (0) 2009.01.30
스레드 안전한 ServletContext 만들기  (1) 2009.01.29
ServletContext 이용하기  (2) 2009.01.23
ServletConfig 이용하기  (0) 2009.01.22
Servlet의 작성  (3) 2009.01.21