Front-Controller 패턴 사용
a.jsp -> web.xml -> servlet(UserFrontController) -> if,switch -> controller -> c.jsp(forward, redirect)
위의 루트만 생각하고 있으면 크게 어렵지 않다.
1. a.jsp 단계에서 loginview.jsp를 만들어 낸다
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>로그인</title>
</head>
<body>
<c:set var="cp" value="${pageContext.request.contextPath}"> </c:set>
<c:if test="${not empty param.login}">
<script>alert("로그인 실패!")</script>
</c:if>
<div id="wrap">
<form name="loginForm" action="${cp}/user/UserLoginOk.us" method="post">
<table>
<tr>
<th>아이디</th>
<td>
<input type="text" name="userid">
</td>
</tr>
<tr>
<th>비밀번호</th>
<td>
<input type="password" name="userpw">
</td>
</tr>
<tr>
<th colspan="2"><input type="submit" value="로그인"></th>
</tr>
</table>
<a href="${cp}/user/UserJoin.us">회원가입</a>
</form>
</div>
</body>
</html>
2. 로그인 버튼을 누르게 되면 UserLoginOk.us로 이동하도록 링크를 걸어주고, 클릭시 web.xml파일에 들어가 .us가 나타내는 front-controller를 검색한다.
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://xmlns.jcp.org/xml/ns/javaee" xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd" id="WebApp_ID" version="4.0">
<display-name>board_mvc2</display-name>
<welcome-file-list>
<welcome-file>index.html</welcome-file>
<welcome-file>index.htm</welcome-file>
<welcome-file>index.jsp</welcome-file>
<welcome-file>default.html</welcome-file>
<welcome-file>default.htm</welcome-file>
<welcome-file>default.jsp</welcome-file>
</welcome-file-list>
<servlet>
<servlet-name>UserFrontController</servlet-name>
<servlet-class>com.project.app.user.UserFrontController</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>UserFrontController</servlet-name> // .us를 찾아 userfrontcontroller를 연결해준다
<url-pattern>*.us</url-pattern>
</servlet-mapping>
</web-app>
3. servlet(UserFrontController)에서 해당 주소값인 UserLoginOk.us와 일치하는 case를 찾고 해당 조건을 실행한다.
즉, if,switch 에서 해당하는 controller 를 실행 해준다.
package com.project.app.user;
import java.io.IOException;
import javax.servlet.RequestDispatcher;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import com.project.action.ActionTo;
public class UserFrontController extends HttpServlet {
private static final long serialVersionUID = 1L;
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
doProcess(req,resp);
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
doProcess(req,resp);
}
protected void doProcess(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
String requestURI = req.getRequestURI();
String contextPath = req.getContextPath();
String command = requestURI.substring(contextPath.length());
ActionTo transfer = new ActionTo();
switch(command) {
case "/user/UserLogin.us":
transfer = new ActionTo();
transfer.setPath("/app/user/loginview.jsp");
transfer.setRedirect(false);
break;
case "/user/UserLoginOk.us":
try {
transfer = new UserLoginOkAction().execute(req, resp);
} catch (Exception e) {
System.out.println("UserLoginOk :" + e);
}
break;
case "/user/UserLogoutOk.us":
transfer = new ActionTo();
transfer.setRedirect(false);
transfer.setPath("/user/UserLogin.us");
req.getSession().removeAttribute("loginUser");
break;
}
//일괄처리 (어디인지, 어떤방식인지 몰라도 그냥 transfer 객체에 담겨있는
//정보대로 페이지를 이동시키는 코드)
if(transfer != null) {
if(transfer.isRedirect()) {
resp.sendRedirect(transfer.getPath());
}else {
RequestDispatcher disp = req.getRequestDispatcher(transfer.getPath());
disp.forward(req, resp);
}
}
}
}
4. 위 루트에 해당하는 action 클래스를 실행하고 DAO / DTO 를 사용하여 DB에 원하는 로그인 정보를 확인하고, session에 유저의 정보를 넣어서 보내주게 된다.
그리고 c.jsp(forward, redirect) 에 해당하는 새로운 페이지로 이동할 링크를 설정해주며, 로그인은 큰 변화가 없는 상태이기 때문에 forward를 이용해준다(redirect를 false로 주고 기존 루트에 바로 연결해준다)
package com.project.app.user;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import com.project.action.Action;
import com.project.action.ActionTo;
import com.project.app.user.dao.UserDAO;
import com.project.app.user.dao.UserDTO;
public class UserLoginOkAction implements Action{
@Override
public ActionTo execute(HttpServletRequest req, HttpServletResponse resp) throws Exception {
// 입력한 데이터 DB처(Mybatis)
UserDAO udao = new UserDAO();
String userid = req.getParameter("userid");
String userpw = req.getParameter("userpw");
HttpSession session = req.getSession();
UserDTO loginUser = udao.login(userid, userpw);
ActionTo transfer = new ActionTo();
if(loginUser != null) {
// 로그인 성공
session.setAttribute("loginUser", loginUser);
// 어떤 방식으로 이동할지 세팅
transfer.setRedirect(false);
// 어디로 이동할지 세팅 (forward 앞의 cp가 남아 있음 / redirect 재요청이라 cp가 날아감)
transfer.setPath("/board/BoardList.bo");
}
else {
//로그인 실패
transfer.setRedirect(false);
transfer.setPath("/user/UserLogin.us?login=f");
}
return transfer;
}
}
위의 코드들은 front-controller 패턴의 흐름을 위해서 기본적인 파트만 나타내었고, ActionTo 클래스를 만들어주거나 DAO/DTO와 mapper , mybatis 연결은 생략해 놓았다.
처음 접하면 흐름이 복잡해 보일 수 있으나, controller를 통해 구현하고자 하는 기능들을 나누어서 데이터를 연결해주기 때문에 큰 규모로 개발을 하기에 적합하다고 볼 수 있다.
'BACK-END' 카테고리의 다른 글
[Spring]스프링 프레임워크란 ? (0) | 2022.03.18 |
---|---|
[Oracle] 오라클 데이터베이스 (0) | 2022.03.11 |
[JSP]Front-Controller 패턴 (0) | 2022.02.09 |
[JSP]MVC2 모델 (0) | 2022.02.08 |
[JSP] EL문과 JSTL (0) | 2022.02.04 |