CV 패턴

Jan 25, 2024
CV 패턴

남은 문제 ) 공통 로직 처리를 못함

⇒ 단일 Front Servlet을 만들 것임 / jsp 파일로 만들어도 되고 Servlet으로 만들어서 해도 됨
 
  • 화면을 리턴하지 않기 때문에 Servlet으로 하는게 좋음
FrontController(=Dispatche)r에서 Redirection 시킬것
'/*'하면 Redirection 요청도 다 들어오기에 또 로직이 필요함
http://localhost:8080/a.do?smd=join 쿼리 스트링(?이하)을 이용
 
  • 파싱하는 방법
바디로 들어오든 쿼리스트링으로 들어오면 파싱하는 방법은 동일
request.getParameter(" "); //파싱하는 방법
 
  • CV패턴 : FrontController 를 통해 view를 찾는 패턴
  • 순서
1. v뷰를 찾아가는 방식 → Servlet을 찾는다.
2. cv 컨트롤을 통해서 Servlet을 찾는다.
3. mvc 데이터를 통해서 Servlet을 찾는다.
package com.example.userapp.config; import jakarta.servlet.ServletException; import jakarta.servlet.annotation.WebServlet; import jakarta.servlet.http.HttpServlet; import jakarta.servlet.http.HttpServletRequest; import jakarta.servlet.http.HttpServletResponse; import java.io.IOException; @WebServlet("*.do") // '/*'하면 리다이렉션 요청도 다 들어오기에 또 로직이 필요함 //FrontController와 동일 = Dispatcher public class DispatcherServlet extends HttpServlet { // 단일 진입점 // http://localhost:8080/a.do?smd=join 쿼리 스트링을 이용 @Override protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { //1. 공통 로직 System.out.println("시간 출력~~~~~"); resp.setHeader("Content-type", "text/html; charset=utf-8"); // 한글 깨짐 해결 // 2. 분기 // cmd를 받아야 함 or join.do로 해서 해도 됨 String uri = req.getRequestURI(); // 끝에 있는 값 받기 System.out.println(uri); if (uri.equals("/join-form.do")) { resp.sendRedirect("/user/join-form.jsp"); } else if (uri.equals("/join.do")) { resp.sendRedirect("/user/join.jsp"); } else if (uri.equals("/main.do")) { resp.sendRedirect("/board/main.jsp"); } else { resp.setStatus(404); resp.getWriter().println("잘못된 페이지를 요청하셨어요."); } } }
notion image
notion image
notion image
 

현 상황) 공통 로직 처리가 안되어 강제성 부여가 안됨

  • WEB-INF 폴더로 이동
외부에서 찾을 수 없음 → 리다이렉트도 외부 요청이라 거절
  • 리다이렉트는 리쿼스트가 두 번 만들어짐 / 디스패처에 요청
요청 시마다 만들어지기에 두번째 요청 시 최조의 데이터가 사라지고 없음
notion image
notion image
 

내부적으로 재귀요청을 하는 방법

  • 내부에서 찾아서 응답할 수 있음
  • stateless 통신이라 응답할 때는 데이터를 날려버림
  • 구조 노출을 안 할 수 있음
 
내부적 포워딩 webinf막혀 문지기한테 통과하면 re,rq만들어지고
내부적으로 inip 찾아 식별자로만 다시 때림
다시 때릴 때 re,rq가 두번 만들어졌지만 내용 덮어짐. 이게 포워딩
그게 다시 가니까 한 번 한 것처럼 됨.
notion image
package com.example.userapp.config; import jakarta.servlet.ServletException; import jakarta.servlet.annotation.WebServlet; import jakarta.servlet.http.HttpServlet; import jakarta.servlet.http.HttpServletRequest; import jakarta.servlet.http.HttpServletResponse; import java.io.IOException; @WebServlet("*.do") // '/*'하면 리다이렉션 요청도 다 들어오기에 또 로직이 필요함 //FrontController와 동일 = Dispatcher public class DispatcherServlet extends HttpServlet { // 단일 진입점 // http://localhost:8080/a.do?smd=join 쿼리 스트링을 이용 @Override protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { //1. 공통 로직 System.out.println("시간 출력~~~~~"); resp.setHeader("Content-type", "text/html; charset=utf-8"); // 한글 깨짐 해결 // 2. 분기 // cmd를 받아야 함 or join.do로 해서 해도 됨 String uri = req.getRequestURI(); // 끝에 있는 값 받기 System.out.println(uri); if (uri.equals("/join-form.do")) { // resp.sendRedirect("/WEB-INF/user/join-form.jsp"); req.getRequestDispatcher("/WEB-INF/user/join-form.jsp").forward(req, resp); } else if (uri.equals("/join.do")) { //resp.sendRedirect("/WEB-INF//user/join.jsp"); req.getRequestDispatcher("/WEB-INF//user/join.jsp").forward(req, resp); } else if (uri.equals("/main.do")) { //resp.sendRedirect("/WEB-INF//board/main.jsp"); req.getRequestDispatcher("/WEB-INF//board/main.jsp").forward(req, resp); } else { resp.setStatus(404); resp.getWriter().println("잘못된 페이지를 요청하셨어요."); } } }
원래는 join과 main이 같이 떴었음
notion image
내부적으로 처리해서 join이 안뜸
notion image
notion image
 
최종 코드
<%@ page contentType="text/html;charset=UTF-8" language="java" %> <% // 템플릿 엔진에는 이름이 정해져 있음 response.setHeader("Content-type", "text/html; charset=utf-8"); // 헤더에 바디를 설명 // 1. 파싱 쉽게 하기 -> 커퍼에 키값을 찾아줌 String username = request.getParameter("username"); String password = request.getParameter("password"); String email = request.getParameter("email"); System.out.println("username : " + username); System.out.println("password : " + password); System.out.println("email : " + email); // 2. 유효성 검사(1000줄 정도 됨...) if(username.length() < 3 || username.length() > 10) { // 필터링으로 사용 response.getWriter().println("<h1>username 글자수가 3~10 사이여야 합니다."); return; } // 3. DB연결 -> DAO에 연결하기 위함 // 4. DAO의 insert 메서드를 회출 // 5. 메인 페이지 그리기 // 6. 리다이렉트 : 내가 요청한 주소를 자기 안에 있는 다른 것을 응답해주는 것 //resp.sendRedirect("/main"); // 톰캣이 만들어준 메서드 response.setStatus(302); response.setHeader("Location", "/main.do"); // 헤더에 정보 담기 response.setHeader("clock", "12pm"); // 프로토콜이 없어서 안뜸 %>
<%@ page import="java.time.LocalDateTime" %> <%@ page contentType="text/html;charset=UTF-8" language="java" %> <% LocalDateTime now = LocalDateTime.now(); %> <html> <head> <title>Title</title> </head> <body> <h1>회원가입 페이지<%=now%></h1> <hr> <form action="/join.do" method=post"> <input type="text" placeholder="username" name="username"> <input type="text" placeholder="password" name="password"> <input type="text" placeholder="email" name="email"> <button>회원가입</button> </form> </body> </html>
 
 
Share article

vosw1