Servlet Java 클래스를 통해 사용자(클라이언트) 요청을 받고
해당 요청에 맞는 Controller 영역을 호출한다
사용자 요청처리 를 제외한 나머지는 실행할 필요가 없다.
<title>Insert title here</title> </head> <body> <h1>회원가입 페이지</h1> <form action="/user/UserJoin.us" method="post"> <p> 아이디 <input type="text" name="userid"><br> </p> <p> 비밀번호 <input type="password" name="userpw"><br> </p> <p> 이름 <input type="text" name="username"><br> </p> <p> 전화번호 <input type="text" name="userphone"><br> </p> <p> 주소 <input type="text" name="useraddr"><br> </p> <p> <input type="submit" value="회원가입"><br> </p> </form> </body>
회원가입_View 영역으로 이동한 후,
회원가입에 필요한 데이터를 사용자에게 전달받고
"/user/UserJoin.us" 경로로 이동하여 ( JSP -> JAVA )
사용자의 회원가입 요청을 처리하기 위해
[ View -> Controller ] 영역으로 이동하기 전에,
Front Controller 로 이동하여 공통 로직을 담당
public class ActionForward { // Redirect 방식으로 할건지 유무 확인 변수 // 페이지 이동이 forward 인가? Redirect 인가? private boolean isRedirect; // 페이지 이동 경로 private String path; public ActionForward() {} public ActionForward( boolean isRedirect , String path) { super(); this.isRedirect = isRedirect; this.path = path; } public String getPath() { return path; } public void setPath(String path) { this.path = path; } public boolean isRedirect() { return isRedirect; } public void setRedirect(boolean isRedirect) { this.isRedirect = isRedirect; }; }
변수 1 - 이동방식이 forward 인지 Redirect 인지 구별하는 Boolean 타입 변수
변수 2 - 이동경로
public interface Action { public ActionForward execute(HttpServletRequest req , HttpServletResponse resp); }
모든 Controller 가 SQL문를 사용하기에 SQL문을 사용할 수있는
statement 객체 - execute 메소드를 호출하고
사용자 요청 , 서버 응답을 파라미터로 담는다
@WebServlet("*.us") public class UserFrontController extends HttpServlet{ @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); } public void doProcess( HttpServletRequest req , HttpServletResponse resp) throws ServletException, IOException { String requestURI = req.getRequestURI(); ActionForward forward = null ; if ( requestURI.equals("/user/UserJoin.us")) { System.out.println("프론트 컨트롤러 도착 "); forward = new UserJoinAction().execute( req, resp); // -> UserJoinAction.java 로 이동 } // 페이지 이동 일괄처리 if ( forward != null){ if ( forward.isRedirect()) { // isRedirect = true = redirect 페이지 이동 방식 resp.sendRedirect(forward.getPath()); } else { // 아니라면 forward 페이지 이동 방식 RequestDispatcher disp = req.getRequestDispatcher(forward.getPath()); disp.forward(req, resp); } } }
먼저 View 영역에서 입력한 사용자의 요청을
GET - POST 2가지 방식 모두 담을 수 있게
doProcess() 메소드 생성
String requestURI = req.getRequestURI(); ActionForward forward = null ;
사용자가 어떤 요청이 와도
필요한 Controller 영역에 이동할 수 있게 RequestURI 를
하나의 변수로 담는다
if ( requestURI.equals("/user/UserJoin.us")) { System.out.println("프론트 컨트롤러 도착 "); forward = new UserJoinAction().execute( req, resp); // -> UserJoinAction.java 로 이동 }
만약 사용자의 요청이 회원가입 요청이라면
생성했던 Action(.Interface*) 에서
공통로직 - statement 객체의 execute 메소드를 호출하여
처리한다.
public class UserJoinAction implements Action{ @Override public ActionForward execute(HttpServletRequest req, HttpServletResponse resp) { System.out.println("execute 도착"); // DB 접근 객체 DAO , 저장- 전송 객체 호출 DTO UserDAO udao = new UserDAO(); UserDTO udto = new UserDTO(); // 페이지 경로 설정 함수 호출 ActionForward forward = new ActionForward(); // view 영역의 파라미터 값을 udto ( 전송객체 ) 에 저장 udto.setUserid(req.getParameter("userid")); udto.setUserpw(req.getParameter("userpw")); udto.setUsername(req.getParameter("username")); udto.setUserphone(req.getParameter("userphone")); udto.setUseraddr(req.getParameter("useraddr")); if( udao.join(udto)) { // 회원가입 성공 -> redirect 방식으로 이동 -> app/user/login_view.jsp forward.setRedirect(true); forward.setPath("/app/user/loginview.jsp"); } else { // 회원가입 실패 -> redirect 방식으로 -> index.jsp forward.setRedirect(true); forward.setPath("/index.jsp"); } return forward; }
DB 접근 객체 - DAO
Data 저장 + 전송 객체 DTO 를 호출하고
사용자의 요청정보 를 -> DTO 에 담는다
담겨진 DTO 는 DAO 로 이동 ( DTO -> DAO)DAO 에서 DB(Mybatis = SQL ) 접근한 후
사용자의 요청을 SQL문으로 실행하여 DB에 저장
DB에 성공적으로 저장되어있으면 public boolean join() 메소드를 재전송이후 회원가입 결과에 따라
아래의 .jsp* 파일로 이동한다if( udao.join(udto)) { // 회원가입 성공 -> redirect 방식으로 이동 -> app/user/login_view.jsp forward.setRedirect(true); forward.setPath("/app/user/loginview.jsp"); } else { // 회원가입 실패 -> redirect 방식으로 -> index.jsp forward.setRedirect(true); forward.setPath("/index.jsp"); } return forward;
DAO
public class UserDAO { ` **SQL 연결 및 처리** SqlSessionFactory factory = SqlMapConfig.getFactory(); SqlSession sqlsession; ` public UserDAO() { sqlsession = factory.openSession(true); // true : auto commit } ` public boolean join(UserDTO udto) { boolean result = false; ` // ( User xml 객체에 , DTO 전송 ) // ( to , from ) ` // 결과값이 있다 = 회원가입 ok if( sqlsession.insert("User.join" , udto) != 0 ) { result = true; } ` return result; }
Mybatis - SQL
Java - Mybatis 에서 SQL 구문 실행
<mapper namespace="User"> <insert id="join" parameterType="userdto" > INSERT INTO "USER" VALUES (#{userid},#{userpw},#{username},#{userphone},#{useraddr} ) </insert> </mapper>
최종적으로 회원가입_Controller 처리에 따라
담겨진 이동경로 ( forward.path ) 와 ( forward.이동방식) 에 따라
사용자의 View 영역이 forward 담긴 변수에 맞춰서 이동한다.if ( forward != null){ if ( forward.isRedirect()) { // isRedirect = true = redirect 페이지 이동 방식 resp.sendRedirect(forward.getPath()); } else { // 아니라면 forward 페이지 이동 방식 RequestDispatcher disp = req.getRequestDispatcher(forward.getPath()); disp.forward(req, resp); } }