-
JSP 도입과 MVC 패턴framework/Spring 2018. 7. 31. 17:38반응형
지금까지 만든 회원 리스트 출력창은 모두 Servlet에서 out,print로 WebBrowser에 출력한다. 이 때 out.print는 버퍼에 태그를 저장했다가 내 보내는데 버퍼가 다 차면 매서드가 종료되기전에 보내기 때문에 에러가 생긴다. 또한 Servlet에는 java 코드와 html 코드가 섞여 있기 때문에 가독성이 떨어지고 유지보수의 불편함이 있다.
이런 문제점을 해결하기위해 JSP를 도입하게 된다. JSP는 JSP엔진에 의해 자바코드로 변환되어 컴파일 된 이후 다시 출력된다. 이미 우리가 나눠 놓은 DAO 와 Member 객체에 더해 출력부인 JSP까지 나뉘어 지게 된 것을 MVC 구조라고 부른다. MVC는 Model, View, Controller 의 약자로 각각 Model에는 DAO, Member 등이 포함되고, View 는 JSP, Controller는 Servlet를 가르키는 것으로 생각하면 된다.
이번에는 JSP를 도입하여 MVC 아키텍쳐를 완성해 보자.
1) src/main/webapp 아래에 view 폴더를 추가하고 list.jsp 파일을 만든다.
2) servlet 파일에 out.print 출력부를 list.jsp 파일로 옮기고 servlet 클래스를 수정한다.
지금 Servlet 클래스에서 out.print 로 출력되는 부분은 모두 jsp에서 처리하게 되므로 Servlet에서는 지워줘도 된다. 하지만 jsp로 member list를 보내야 하기 때문에 list 객체를 request에 담아서 전달한다. 바뀐 Servlet 클래스는 다음과 같다.
1234567891011121314151617181920212223242526272829303132333435363738package servlet;import java.io.IOException;import java.util.List;import javax.servlet.RequestDispatcher;import javax.servlet.ServletContext;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 dao.MemberDao;import domain.Member;@WebServlet("/member/list")public class MemberList extends HttpServlet {@Overrideprotected void doGet(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException {response.setContentType("text/html;charset=UTF-8");try {ServletContext sc = this.getServletContext();MemberDao memberDao = (MemberDao) sc.getAttribute("memberDao");List<Member> list = memberDao.selectList();request.setAttribute("list", list);RequestDispatcher rd = request.getRequestDispatcher("/view/list.jsp");rd.include(request, response); // include 명령은 데이터를 보낸 후 제어권을 다시 가져온다} catch (Exception e) {e.printStackTrace();}}}cs Servlet에서 지워진 out.print 코드 내에 담겨 있던 태그 문자열들은 JSP로 옮긴다. 새로 만든 list.jsp는 다음과 같다.
1234567891011121314151617181920212223242526<%@ page language="java" contentType="text/html; charset=UTF-8"pageEncoding="UTF-8"%><!DOCTYPE html><html><head><meta charset='UTF-8'><title>멤버 목록</title></head><body><h1>멤버 목록</h1><p><a href='add.html'>새회원</a></p><table border='1'><tr><th>아이디</th><th>이메일</th></tr><tr><td><a href='view?id='>%s</a></td><td>%s</td></tr></table></body></html>cs jsp를 통해서 view를 분리하기는 하였으나 servlet에서 넘어온 list를 출력하지 않고 있다. 스크립틀릿을 이용하여 출력하는 방법도 있으나 우리는 JSTL 라이브러리를 이용해 출력해 보자.
3) JSTL 라이브러리 설치
build.gradle 에 jstl 라이브러리를 추가해준다. dependency 영역에 다음과 같이 추가한다.
//jstl 라이브러리
// https://mvnrepository.com/artifact/javax.servlet/jstl
compile group: 'javax.servlet', name: 'jstl', version: '1.2'
gradle 명령으로 라이브러리를 다운로드 받는다.
4) core 태그 이용해 jsp 완성
core 태그는 반복, 조건, 데이터관리, 데이터베이스 액세스, 시간, 숫자, 날짜, 문자열 가공등을 사용할 수 있는 표준라이브러리이다. 이를 이용해 jsp에서 받아온 member list를 출력한다. 이 태그를 사용하기 위해서는 페이지 상단에 <%@ taglib prefix = "c" uri = "http://java.sun.com/jsp/jstl/core" %> 라는 태그를 삽입해야한다. 우리는 반복문을 돌면서 list안에 들어있는 내용을 출력할 것이기 때문에 <c:forEach> 태그를 사용하도록 하겠다. 완성된 list.jsp는 다음과 같다.
1234567891011121314151617181920212223242526272829<%@ page language="java" contentType="text/html; charset=UTF-8"pageEncoding="UTF-8"%><%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%><!DOCTYPE html><html><head><meta charset='UTF-8'><title>멤버 목록</title></head><body><h1>멤버 목록</h1><p><a href='add.html'>새회원</a></p><table border='1'><tr><th>아이디</th><th>이메일</th></tr><c:forEach items="${list }" var="member"><tr><td><a href='view?id=${member.id }'>${member.id }</a></td><td>${member.email }</td></tr></c:forEach></table></body></html>cs 5) UTF-8 filter 만들기
Servlet에 포함된 코드 response.setContentType("text/html;charset=UTF-8"); 는 객체의 text type을 UTF-8로 지정하는 것이다. servlet이 많아질 경우 같은 코드가 반복되게 되기 때문에 한 번에 처리할 수 있는 filter가 있으면 편리하다. xml 태그를 통해 제어하는 것은 spring을 도입할 때 하고 지금은 자바 코드를 통한 필터를 만들어 보자.
src/main/java 아래 filter 패키지를 생성하고 CharacterEncodingFilter를 만든다.
12345678910111213141516171819202122232425262728package bitcamp.pms.filter;import java.io.IOException;import javax.servlet.Filter;import javax.servlet.FilterChain;import javax.servlet.ServletException;import javax.servlet.ServletRequest;import javax.servlet.ServletResponse;import javax.servlet.annotation.WebFilter;@WebFilter("/*")public class CharacterEncodingFilter implements Filter{@Overridepublic void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)throws IOException, ServletException {// 서블릿을 실행하기 전에 수행할 작업request.setCharacterEncoding("UTF-8");// 다음 필터 또는 서블릿 실행chain.doFilter(request, response);}}cs 반응형'framework > Spring' 카테고리의 다른 글
FrontController 도입 (0) 2018.08.03 마이바티스(mybatis) 도입 (0) 2018.08.02 JDBC+DAO 활용한 회원 리스트 만들기 (0) 2018.07.30 서블릿(servlet)을 이용한 회원관리 페이지 만들기 (2) 라이브러리 등록과 회원목록 출력 (0) 2018.07.26 서블릿(servlet)을 이용한 회원관리 페이지 만들기 (1) 회원 테이블 생성 (0) 2018.07.26