회원가입화면으로 이동하는 Servlet 과 회원가입 로직을 처리하는 Servlet, 회원목록을 보여주는 Servlet을 생성한다.

 

아래는 예시로 회원가입 로직을 처리하는 Servlet 과 JSP의 소스이다.

package hello.servlet.web.servletmvc;

import hello.servlet.domain.member.Member;
import hello.servlet.domain.member.MemberRepository;
import jakarta.servlet.RequestDispatcher;
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(name="mvcMemberSaveServlet",urlPatterns = "/servlet-mvc/members/save")
public class MvcMemberSaveServlet extends HttpServlet {

    private MemberRepository memberRepository = MemberRepository.getInstance();

    @Override
    protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        String username = req.getParameter("username");
        int age = Integer.parseInt(req.getParameter("age"));

        Member member = new Member(username,age);
        memberRepository.save(member);

        //Model에 데이터를 보관한다.
        req.setAttribute("member",member);

        String viewPath = "/WEB-INF/views/save-result.jsp";
        RequestDispatcher dispatcher = req.getRequestDispatcher(viewPath);
        dispatcher.forward(req,resp);
    }
}
<%@ page import="hello.servlet.domain.member.Member" %>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <meta charset="UTF-8">
</head>
<body>
성공
<ul>
    <li>id=${member.id}</li>
    <li>username=${member.username}</li>
    <li>age=${member.age}</li>
</ul>
<a href="/index.html">메인</a>
</body>
</html>

 

dispatcher.foward()

 

이 메소드는 클라이언트의 요청을 한 서블릿에서 다른 서블릿이나 JSP(JavaServer Pages) 페이지로 전달할 때 사용된다.

클라이언트가 서블릿에 요청을 보내면, 서블릿은 dispatcher.forward()를 사용하여 현재 서블릿에서 처리 중인 요청과 응답 객체를 전달할 서블릿이나 JSP의 URL을 지정하여 전달할 수 있다.

이는 한 서블릿이 처리를 수행한 후 요청을 다른 서블릿이나 JSP에게 넘기는 데 유용하다.

dispatcher.forward()를 사용하여 요청을 전달하는 경우, 요청과 응답 객체의 컨텍스트 경로와 URL이 변경될 수 있으므로 주의해야 한다. 또한, dispatcher.forward()는 요청을 완전히 처리한 후 반환하지 않기 때문에, 다음에 실행되는 코드에서 dispatcher.forward() 이후에 작성한 코드가 실행되지 않을 수 있다는 점에 유의해야 한다.


redirect vs forward

 

dispatcher.forward()와 redirect는 모두 서버 측에서 클라이언트의 요청을 다른 페이지로 전달하는 데 사용되지만, 사용 방식과 결과에 차이가 있다.

dispatcher.forward()는 클라이언트의 요청을 다른 서블릿이나 JSP 페이지로 전달하는 것이며, 전달된 페이지는 이전 페이지의 요청을 계속 처리한다. 따라서, forward()를 사용하면 전달된 페이지에서 이전 페이지에서 처리된 데이터나 객체를 그대로 사용할 수 있다. 또한, forward()를 사용하면 URL이 변경되지 않으므로, 클라이언트는 이전 URL을 유지한 채 다음 페이지를 볼 수 있다.

반면에, redirect는 클라이언트의 요청을 새로운 URL로 다시 보내는 것이다. 즉, 새로운 요청이 생성되며, 이전 페이지에서 생성된 데이터나 객체를 사용할 수 없다. 또한, redirect를 사용하면 새로운 URL로 이동하므로, 클라이언트는 새로운 URL을 보게 된다.

따라서, dispatcher.forward()는 요청을 전달하고 이전 페이지에서 처리된 데이터를 계속 사용할 수 있으며, URL이 변경되지 않는 반면, redirect는 요청을 다시 보내고 새로운 URL을 보여준다. 이러한 차이점을 고려하여, dispatcher.forward()는 이전 페이지에서 처리된 데이터나 객체를 그대로 사용하면서 다음 페이지로 이동할 때 사용하고, redirect는 새로운 요청과 URL이 필요할 때 사용한다.

 

 

Git : https://github.com/ShinHenry/Basic-Servlet-Project.git

 

GitHub - ShinHenry/Basic-Servlet-Project: SpringBoot 기반 Servlet 프로젝트

SpringBoot 기반 Servlet 프로젝트. Contribute to ShinHenry/Basic-Servlet-Project development by creating an account on GitHub.

github.com

 

 

 

출처 : 스프링 MVC 1편 - 백엔드 웹 개발 핵심 기술

+ Recent posts