controller : 모든 서블릿이 하는 일이 있고, 특정 대상만 하는 일이 있다?
그래서 controller를 두개로 나누었다.
프론트 컨트롤러 -> servlet으로 만들고
뒤의 컨트롤러 -> java로 만든다.
DispatcherServlet
: 어디로 분기시킬지, 어떤 데이터를 뽑아서 준비시킬지 결정한다.
package spms.servlets;
import java.io.IOException;
import javax.servlet.RequestDispatcher;
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 spms.vo.Member;
/*
1) 의미 : tomcat으로부터 바로 제어 controller로 전송하던 방식
-> tomcat은 Front Controller로 전송
Front Controller : DispatcherServlet
* Front Controller는 PageController로 분기
back controller : PageController
역할을 분할
2) 이유 :
2-1) 역할을 보다 상세히 나눠서 규격화(Framework)하려고 한다
2-2) 스프링 프레임워크의 제작 방식
2-3) Front Controller만 HttpServlet의 상속을 받고
Page Controller는 일반 자바 클래스로 전환(POJO) - 특별한 것 안넣고 자바로 만든다.
3) Front Controller(DispatcherServlet)의 역할
3-1) tomcat(서블릿 컨테이너 또는 WAS(아파치))과 연결되어 다른 controller에 분기
서블릿 컨테이너 : 서블릿을 동작시키는 주체
3-2) Page Controller에 전송할 VO객체 생성 (향후 자동화)
3-3) 서블릿/jsp 이동 처리
3-4) Page Controller에서 발생하는 예외처리
4) 장점
4-1) 다른 WAS에 이식할 때 Front Controller만 수정하면 된다
(Front Controller만 서블릿에 종속되기 때문에 = HttpServlet을 상속받으므로)
4-2) 브라우저한테 노출하고 싶지 않은 페이지를 감출 수 있다
4-3) Page Controller가 하는 공통 역할을 Front Controller에 담았으므로
자동화(Framework)하기 편리하다
*/
@WebServlet("*.do")
@SuppressWarnings("serial")
public class DispatcherServlet extends HttpServlet {
@Override
protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
response.setContentType("text/html;charset=UTF-8");
// pageController에 분기 전송을 위해 '서블릿 경로'를 얻는다
String servletPath = request.getServletPath();
try {
String pageControllerPath = null;
if("/member/list.do".equals(servletPath)) {
pageControllerPath = "/member/list";
}else if("/member/add.do".equals(servletPath)) {
pageControllerPath = "/member/add";
//아래 조건이 성립하지 않으면 doGet요청 (입력페이지만 전송)
if(request.getParameter("email")!=null) {
//doPost(추가할 새로운 데이터가 존재할 때 )요청일 때 객체 준비
request.setAttribute("member", new Member()
.setEmail(request.getParameter("email"))
.setPassword(request.getParameter("password"))
.setName(request.getParameter("name")));
}
}else if("/member/update.do".equals(servletPath)) {
pageControllerPath = "/member/update";
//아래 조건이 성립하지 않으면 doGet요청(상세 정보 보기)
if(request.getParameter("email")!=null) {
//doPost(수정 데이터 db에 반영 준비)
request.setAttribute("member", new Member()
.setNo(Integer.parseInt(request.getParameter("no")))
.setEmail(request.getParameter("email"))
.setName(request.getParameter("name")));
}
}else if("/member/delete.do".equals(servletPath)) {
pageControllerPath = "/member/delete";
}else if("/member/auth/login.do".equals(servletPath)) {
pageControllerPath = "/auth/login";
}else if("/member/logout.do".equals(servletPath)) {
pageControllerPath = "/auth/logout";
}
// 페이지 컨트롤러로 위임
RequestDispatcher rd = request.getRequestDispatcher(pageControllerPath);
rd.include(request, response);
//include에서 돌아와서
// (페이지 컨트롤러가 반환한)jsp페이지로 위임
String viewUrl = (String)request.getAttribute("viewUrl");
// 경로가 'redirect:'로 시작하면 바로 이동
if(viewUrl.startsWith("redirect:")) {
response.sendRedirect(viewUrl.substring(9));
return;
}else {
// 그게 아니라면 viewUrl쪽으로 다시 이동
rd = request.getRequestDispatcher(viewUrl);
rd.include(request, response);
}
}catch(Exception e) {
e.printStackTrace();
request.setAttribute("error", e);
RequestDispatcher rd =
request.getRequestDispatcher("/Error.jsp");
rd.forward(request, response);
}
}
}
MemberListServlet
package spms.servlets;
import java.io.IOException;
import java.sql.Connection;
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 spms.dao.MemberDao;
import spms.vo.Member;
@SuppressWarnings("serial")
@WebServlet("/member/list")
public class MemberListServlet extends HttpServlet{
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
try {
// ServletContext에 있는 Connection 객체를 사용하겠다
ServletContext sc = this.getServletContext();
MemberDao memberDao = (MemberDao)sc.getAttribute("memberDao");
List<Member> members = memberDao.selectList();
req.setAttribute("members", members);
req.setAttribute("viewUrl","/member/MemberList.jsp");
}catch(Exception e) {
// 예외를 던지면 include로 호출한 dispatcher 서블릿이 받아서 예외처리를 한다.
throw new ServletException(e);
}finally {
}
}
}
.jsp
: 모두 .do로 변경
.do
: 바깥에서 접근(관습)
do
가 없으면 내부에서 switching하는 주소
MemberAddServlet
package spms.servlets;
import java.io.IOException;
import java.sql.Connection;
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 spms.dao.MemberDao;
import spms.vo.Member;
@SuppressWarnings("serial")
@WebServlet("/member/add")
public class MemberAddServlet extends HttpServlet{
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
req.setAttribute("viewUrl","/member/MemberForm.jsp");
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
try {
ServletContext sc = this.getServletContext();
MemberDao memberDao = (MemberDao)sc.getAttribute("memberDao");
Member member = (Member)req.getAttribute("member");
memberDao.insert(member);
req.setAttribute("viewUrl", "redirect:list.do");
}catch(Exception e) {
// 예외를 던지면 include로 호출한 dispatcher 서블릿이 받아서 예외처리를 한다.
throw new ServletException(e);
}finally {
}
}
}
MemberUpdateServlet
package spms.servlets;
import java.io.IOException;
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 spms.dao.MemberDao;
import spms.vo.Member;
@SuppressWarnings("serial")
@WebServlet("/member/update")
public class MemberUpdateServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
try {
ServletContext sc = this.getServletContext();
MemberDao memberDao = (MemberDao)sc.getAttribute("memberDao");
Member member = memberDao.selectOne(Integer.parseInt(request.getParameter("no")));
request.setAttribute("member", member);
request.setAttribute("viewUrl", "/member/MemberUpdateForm.jsp");
} catch (Exception e) {
throw new ServletException(e);
}
}
@Override
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
try {
ServletContext sc = this.getServletContext();
MemberDao memberDao = (MemberDao)sc.getAttribute("memberDao");
Member member = (Member)request.getAttribute("member");
memberDao.update(member);
request.setAttribute("viewUrl", "redirect:list.do");
} catch (Exception e) {
throw new ServletException(e);
}
}
}
MemberDeleteServlet
package spms.servlets;
import java.io.IOException;
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 spms.dao.MemberDao;
@SuppressWarnings("serial")
@WebServlet("/member/delete")
public class MemberDeleteServlet extends HttpServlet {
@Override
public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
try {
ServletContext sc = this.getServletContext();
MemberDao memberDao = (MemberDao)sc.getAttribute("memberDao");
memberDao.delete(Integer.parseInt(request.getParameter("no")));
request.setAttribute("viewUrl", "redirect:list.do");
} catch (Exception e) {
throw new ServletException(e);
}
}
}
LogInServlet
package spms.servlets;
import java.io.IOException;
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 javax.servlet.http.HttpSession;
import spms.dao.MemberDao;
import spms.vo.Member;
@SuppressWarnings("serial")
@WebServlet("/auth/login")
public class LogInServlet extends HttpServlet{
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
request.setAttribute("viewUrl", "/auth/LogInForm.jsp");
}
@Override
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
try {
ServletContext sc = this.getServletContext();
MemberDao memberDao = (MemberDao)sc.getAttribute("memberDao");
Member member = memberDao.exist(
request.getParameter("email"),
request.getParameter("password"));
if (member != null) {
HttpSession session = request.getSession();
session.setAttribute("member", member);
request.setAttribute("viewUrl", "redirect:../member/list.do");
} else {
request.setAttribute("viewUrl", "/auth/LogInFail.jsp");
}
}catch(Exception e) {
throw new ServletException(e);
}
}
}
LogOutServlet
package spms.servlets;
import java.io.IOException;
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 javax.servlet.http.HttpSession;
@SuppressWarnings("serial")
@WebServlet("/auth/logout")
public class LogOutServlet extends HttpServlet{
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// 세션저장 객체를 무효화
HttpSession session = request.getSession();
session.invalidate();
request.setAttribute("viewUrl", "redirect:login.do");
}
}
Header.jsp
: EL 사용
member 객체와 email이 존재한다면 로그아웃
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
<div style="background-color:#00008b; color:white;
height:20px; padding:5px;">
SPMS(Simple Project Management System)
<c:if test="${!empty sessionScope.member and
!empty sessionScope.member.email}">
<span style="float:right;">
${sessionScope.member.name}
<a style="color:white;"
href="<%=request.getContextPath()%>/auth/logout.do">
로그아웃
</a>
</span>
</c:if>
</div>
<%=request.getContextPath()%> = ${pageContext.request.contextPath}
(root경로를 의미한다)