서블릿의 한계는 MVC 안에서 두각을 나타낸다. 먼저 MVC는 디자인 패턴으로 각각 다음을 뜻한다.
물론 현재는 프론트 프레임워크로 View이 떨어져나가기도 했지만, 과거 시점에서 서블릿의 문제는 위 세 가지가 서블릿 안에 모두 들어가 있었다는 것이다.
1) 세 가지 역할을 하는 코드가 하나의 파일 안에 들어가, 가독성, 유지보수가 어렵다.
2) 프론트와 백이 겹쳐있기 때문에 협업이 어렵다.
그 결과, 자바 이탈자가 발생했고 이들을 잡기 위해 나온 것이 JSP(Java Server Page)이다.
사실 위 문제를 해결하기 위한 디자인 패턴이 MVC1이다. MVC1은 DAO로 Model만 분리했다. 다만 초기에는 JSP가 아닌, 서블릿을 사용했다.
그러나 서블릿의 원 목적인 ‘제어’를 하지 못하기 때문에 JSP로 대체해 사용하였다. 하지만 JSP 자체도 HTML에서 자바를 사용할 수 있도록 만든 것일 뿐, 그 자체는 인터프리터에서 서블릿으로 변환이 된다.
따라서 MVC1 또한 위의 2) 문제를 해결할 수 없었고, 그 대안으로 나온게 MVC2이다.
요청과 응답은 일종의 페이지 전환으로 이뤄진다. 그 방식으로 크게 3가지가 있는데, 이 중에서 클라이언트로부터 전달되는 Request 객체를 사용하는 방식이 좋다.
이 Request 객체는 WAS인 톰캣이 가지고 있으며, 서블렛과 JSP에겐 객체의 참조변수를 알려준다. 따라서 우린 이 Request의 데이터를 넣고 전달-명령만 하면 된다.
Request 객체에 데이터를 넣는 것은 .setAttribute(“name”, Object o);
을 사용한다.
위 메서드를 사용하면 request 변수를 통해서 Request 객체 내부에, 데이터를 호출할 일종의 변수명과 데이터 그 자체가 담긴다.
데이터를 전송하는 단계는 두 가지이다.
request.getRequestDispatcher("listView.jsp").forward(request, response);
.getRequestDispatcher("listView.jsp")
메서드를 사용해준다.forward()
메서드를 사용한다.둘 다 클라이언트, 서버 상관 없이 페이지를 전환시키는 메서드이지만 작동 방식에서 큰 차이가 있다.
MVC2 라는 디자인 패턴은 절대적이므로 디자인 레이아웃을 담당하는 JSP에 절대 JAVA가 쓰이면 안된다. 따라서 JAVA의 기능들을 쉽게 쓸 수 있도록 하는 문법을 사용한다.
${name}
전달 : request.setAttribute(“number”, “G”); request.setAttribute(“String”, 10);
number : ${number} // G
String : ${String} // 10
Servlet : CoffeeDTO dto = new CoffeeDTO(1001, “Tea”, 4000, “Y”);
전달 : request.setAttribute(“dto”, dto);
DTO from Servelt : ${dto.pid} , ${dto.pname}, ${dto.pprice}, ${dto.iced}
출력 : 1001, Tea, 4000, Y
하지만 EL만 가지고서는 반복문, 조건문과 같은 프로그래밍 언어의 기능을 이용할 수 없다. 따라서 태그의 형태로 퍼블리셔들이 사용할 수 있도록 만든 중재안이 JSTL이다.
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>
<c:forEach var="i" items="${list}">
${i.pid} : ${i.pname} <br>
<c:forEach>
<c:if test=“{true}”>
진실
<c:if>
<c:choose>
<c:when test="${!empty list}"> == else if
List empty
</c:when>
<c:otherwise> == else
<c:forEach var="i" items="${list}">
${i.pid} : ${i.pname} <br>
</c:forEach>
</c:otherwise>
</c:choose>
라이브러리
<%@ taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt"%>
<td>
<fmt:formatNumber value="${(i.kor+i.eng+i.math)/3.0 }" pattern=".0"/>
</td>
foramt을 사용하면, 계산식도 가능하다.