
남은 문제 ) 공통 로직 처리를 못함
⇒ 단일 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("잘못된 페이지를 요청하셨어요.");
}
}
}



현 상황) 공통 로직 처리가 안되어 강제성 부여가 안됨
- WEB-INF 폴더로 이동
외부에서 찾을 수 없음 → 리다이렉트도 외부 요청이라 거절
- 리다이렉트는 리쿼스트가 두 번 만들어짐 / 디스패처에 요청
요청 시마다 만들어지기에 두번째 요청 시 최조의 데이터가 사라지고 없음


내부적으로 재귀요청을 하는 방법
- 내부에서 찾아서 응답할 수 있음
- stateless 통신이라 응답할 때는 데이터를 날려버림
- 구조 노출을 안 할 수 있음
내부적 포워딩 webinf막혀 문지기한테 통과하면 re,rq만들어지고
내부적으로 inip 찾아 식별자로만 다시 때림
다시 때릴 때 re,rq가 두번 만들어졌지만 내용 덮어짐. 이게 포워딩
그게 다시 가니까 한 번 한 것처럼 됨.

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이 같이 떴었음

내부적으로 처리해서 join이 안뜸


최종 코드
<%@ 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