코딩항해기
[JSP] alert창 띄우고 페이지 전환하기 본문
과거 글에서도 다뤘듯이 alert창을 띄우고, 또는 다른 스크립트 행동을 시킨 뒤 바로 페이지 이동이 있으면 해당 기능이 제대로 실행되지 못하고 페이지를 이동해버리는 문제가 있다.
과거에는 if else문을 통해 이를 해결했었는데, 이제 V와 C구분이 더욱 확실해진만큼 다시 정리해보고자 한다.
[추가되는 기능]
로그인을 시도했을 때 로그인에 실패한다면 alert창으로 로그인 실패를 안내하고 로그인페이지로 돌아오고자 한다.
[기존 방식]
C: 받아온 정보를 확인해 로그인 실패시 스크립트로 alert창을 띄우고 페이지 이동을 실행하기
V: 로그인 정보 받아 넘겨주기
[문제발생]
이렇게 설계해 기능을 추가하게 되면 일단 가장 큰 문제가 하나 생긴다.
바로 alert창이 뜨지 않고 바로 페이지 전환이 이뤄지는 문제다.
이 문제는 기존 게시글에 정리했던 내용과 같은 맥락으로 바로 페이지 이동이 이뤄지며 script가 정상적으로 동작할 시간이 주어지지 않은 것이다. 그러나 이제 C에서 바로 location.href를 사용하여 이동하는 방식을 취할 수 없고, Actionforward를 반환해 페이지를 이동해야하기 때문에 기존의 해결방법을 사용할 수 없다.
그리고, 한 가지 더 문제가 있다. 스크립트는 View파트인데 Controller가 작업을 하고 있다. 이는 MVC파트 구분이 명확하지 않다.
[해결]
이를 해결하기 위해서는 View에서 alert창만을 위한 페이지를 따로 개설해 해당 페이지에서 alert창과 location.href 스트립트를 실행하는 방법이 있다.
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>안내 페이지</title>
</head>
<body>
<script>
alert('로그인실패실패');
location.href='login.do';
</script>
</body>
</html>
이런 경우 Controller는 실행 경우에 따라 알맞은 스크립트를 실행할 수 있는 페이지로 보내기만하면 각자 페이지에서 alert창을 띄우고, 새로운 요청을 보내게 된다. 두 가지 문제 모두 해결된 것을 확인할 수 있다.
[새로운 문제]
이대로 끝을 내도 좋지만, 이 경우에도 새로운 두 가지 문제가 있다.
먼저, 모든 alert창이 뜨는 경우의 수만큼 페이지가 만들어져야한다.
alert창이 뜨는 모든 경우의 수 만큼 V는 C와 소통해 어느 요청을 넣어야하는지 알아야한다.
[해결과 발전]
이를 해결하기 위해 함수(메서드)를 떠올려 볼 수 있다.
값은 달라지지만 구조(기능)이 같을 경우 함수화해 매개변수로 달라지는 값만 지정했었다.
이 방식을 그대로 적용하면 된다.
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>안내 페이지</title>
</head>
<body>
<script>
alert('${msg}');
location.href='${path}';
</script>
</body>
</html>
요청으로 넘어온 값을 넣어 일종의 함수처럼 실행시키면 모든 경우의 수만큼 페이지를 개설하거나 어떤 경로, 어떤 내용을 띄워줘야하는지 V파트에서 알지 않아도 된다. 어떤 내용을 띄우고, 어떤 경로로 가는지 알고 있는 C가 해당 내용을 요청으로 직접 전달해주기 때문이다.
이제 C는 요청에 담아 띄울 메세지와 경로를 전달해주기만 하면 된다.
public class LoginAction implements Action {
@Override
public ActionForward execute(HttpServletRequest request, HttpServletResponse response) {
MemberDAO memberDAO=new MemberDAO();
MemberDTO memberDTO=new MemberDTO();
memberDTO.setMid(request.getParameter("mid")); //입력된 id
memberDTO.setPassword(request.getParameter("password")); //입력된 pw
memberDTO.setCondition("CHECKMID"); //컨디션
memberDTO = memberDAO.selectOne(memberDTO); //해당하는 유저가 있는지 확인
ActionForward forward=new ActionForward();
if(memberDTO != null) { // 로그인 성공
HttpSession session=request.getSession(); //세션 개설
session.setAttribute("loginInfo", memberDTO.getMid()); //세션에 로그인정보저장
forward.setPath("main.do"); //페인페이지
forward.setRedirect(true); //리다이렉트
}
else {
//로그인 실패
request.setAttribute("msg", "로그인 실패..."); //메세지
request.setAttribute("path", "loginPage.do"); //경로
forward.setPath("info.jsp"); //alert창 띄우고 이동하는 페이지
forward.setRedirect(false);//포워드
}
return forward;
}
}
'JSP' 카테고리의 다른 글
[JSP] JDBC - 필터 검색 (Model 파트/HashMap 사용) (0) | 2024.09.08 |
---|---|
[JSP] Servlet - 필터 Filter (0) | 2024.09.05 |
[JSP] Servlet - 리스너 Listener (0) | 2024.09.02 |
[JSP] DB에 있는 게시글 화면에 보여주기 (1) | 2024.08.31 |
[JSP] JDBC - DAO 템플릿 정리 (0) | 2024.08.29 |