package org.example.demo10;
import jakarta.servlet.ServletConfig;
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 org.example.demo10.core.ComponentScan;
import org.example.demo10.core.RequestMapping;
import org.example.demo10.core.ViewResolver;
import java.io.IOException;
import java.lang.reflect.Method;
import java.util.Set;
@WebServlet("*.do")
public class DispatcherServlet extends HttpServlet {
private Set<Object> controllers;
@Override
public void init(ServletConfig config) throws ServletException {
// 1. 컴포넌트 스캔
ComponentScan componentScan = new ComponentScan(config.getServletContext());
controllers = componentScan.scanClass("org.example.demo10.controller");
//System.out.println(controllers.size());
}
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
// localhost:8080/user.do?path=join
String path = req.getParameter("path");
// 2. 라우팅
String templatePath = route(path);
// 3. 리다이렉션
if (templatePath.contains("redirect:")) {
String redirectPath = templatePath.replace("redirect:", "");
// resp.setStatus(302);
// resp.setHeader("Location", "?path=" + redirectPath);
resp.sendRedirect("?path=" + redirectPath);
// 이 코드는 위에 두 줄을 내장하고 있음 302세팅
return;
}
// 4. 이동
if (templatePath == null) {
resp.setStatus(404);
resp.getWriter().println("<h1>404 Not Found</h1>");
} else {
req.getRequestDispatcher(ViewResolver.viewName(templatePath)).forward(req, resp);
}
}
private String route(String path) {
for (Object instance : controllers) {
Method[] methods = instance.getClass().getMethods();
for (Method method : methods) {
RequestMapping rm = method.getAnnotation(RequestMapping.class);
if (rm == null) continue; // 다음 for문으로 바로 넘어감
if (rm.value().equals(path)) {
try {
return (String) method.invoke(instance);
} catch (Exception e) {
throw new RuntimeException(e);
}
}
}
}
return null;
}
}
package org.example.demo10.controller;
import org.example.demo10.core.Controller;
import org.example.demo10.core.RequestMapping;
@Controller
public class UserController {
@RequestMapping("join")
public String join() {
System.out.println("UserController join");
return "join";
}
@RequestMapping("login")
public String login() {
System.out.println("UserController login");
return "redirect:home";
}
}
package org.example.demo10.controller;
import org.example.demo10.core.Controller;
import org.example.demo10.core.RequestMapping;
@Controller
public class BoardController {
@RequestMapping("home")
public String home() {
return "home";
}
}
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>Title</title>
</head>
<body>
<h1>home page</h1>
</body>
</html>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>Title</title>
</head>
<body>
<h1>join page</h1>
</body>
</html>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>Title</title>
</head>
<body>
<h1>login page</h1>
</body>
</html>
리다이렉트와 포워딩을 지원 (
redirect:home
)Spring MVC - 간단한 회원가입 및 페이지 이동 예제

프로젝트 생성



BoardController
package org.example.hello.controller;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;
@Controller
public class BoardController {
// localhost:8080/detail (GET) detail.mustache
@GetMapping("/detail")
public String detail() {
return "detail";
}
// localhost:8080/home
@GetMapping("/home")
public String home() {
return "home";
}
}
UserController
package org.example.hello.controller;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
@Controller
public class UserController {
// localhost:8080/join
// body : username=ssar
// header : Content-Type : application/x-www-form-urlencoded
// 줄게 -> 회원가입 정보
@PostMapping("/join")
public String join(String username) {
// 1. DB insert
System.out.println("username : " + username);
// 2. 응답
return "redirect:/home";
}
// 줘 -> 회원가입 페이지
@GetMapping("/join-form")
public String joinForm() {
return "join-form";
}
}
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<h1>회원가입 페이지 - 폼태그, 인풋</h1>
<form action="/join" method="post">
<input type="text" name="username" placeholder="Enter username">
<button type="submit">회원가입</button>
</form>
</body>
</html>
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<h1>홈 페이지</h1>
</body>
</html>
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<h1>디테일 페이지 입니다.</h1>
</body>
</html>



- 회원가입 페이지 (
join-form
)
/join-form
으로 GET 요청을 보내면join-form.html
을 보여줌.
- HTML에는
input
과submit
버튼이 있음.
- 사용자가 입력하고 "회원가입" 버튼을 누르면
/join
으로 POST 요청이 감.
- 회원가입 요청 (
join
) - 사용자가
username
을 입력하면/join
으로 요청을 보냄. join(String username)
메서드가 실행됨.System.out.println()
을 통해서 입력값을 출력함.- 완료되면
redirect:/home
으로 이동해서 홈 화면을 보여줌.
- 홈 화면 (
home
) /home
으로 GET 요청을 보내면home.html
이 보여짐.
- 디테일 페이지 (
detail
) /detail
로 요청을 보내면detail.html
을 보여줌.
Share article