[JSP] MVC, alert()
웹개발에서 알랏창은 매우 유용하다.
예를 들어, 어떤 사이트에서 로그인을 하는 도중에 아이디 혹은 비밀번호가 틀렸을 때, 아이디 혹은 비밀번호가 틀렸다는 안내창을 본 적이 있을 것이다. 이게 바로 알랏창의 대표적인 예시이다.
MVC 로 나눠서 로그인 페이지를 만드는 경우,
V(사용자가 아이디와 비밀번호를 입력)->
C(V에서 아이디와 비밀번호 값을 받아옴) ->
M(C에서 받아온 데이터를 DB에서 찾아봄) ->
C( DB에 일치하는 값이 있는지에 따라 로그인 성공/실패 에 따라 V 페이지 이동) ->
V(C에서 이동하라는 페이지 보여줌)
이런 식일 것이다.
그러면 C에서 로그인 성공/ 실패 알랏창을 띄워야하는가 ?
아래는 예시의 LoginAction.java 이다.
package controller.member;
import java.io.IOException;
import controller.common.Action;
import controller.common.ActionForward;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;
import jakarta.servlet.http.HttpSession;
import model.dao.MemberDAO;
import model.dto.MemberDTO;
public class LoginAction implements Action {
// Action 인터페이스에 의한 강제 오버라이딩
@Override
public ActionForward execute(HttpServletRequest request, HttpServletResponse response) {
// M으로 보낼 객체 생성
MemberDAO memberDAO=new MemberDAO();
MemberDTO memberDTO=new MemberDTO();
// V에서 가져온 아이디와 비밀번호 값 가져옴
memberDTO.setMid(request.getParameter("mid"));
memberDTO.setPassword(request.getParameter("password"));
// M에서 임의로 만든 아이디 중복검사를 위한 컨디션 값, CHECKMID
memberDTO.setCondition("CHECKMID");
memberDTO = memberDAO.selectOne(memberDTO);
if(memberDTO != null) { // 로그인에 성공했다면
HttpSession session=request.getSession();
session.setAttribute("loginInfo", memberDTO.getMid());
}
else { // 로그인에 실패했다면( 아이디/비밀번호가 DB의 값과 일치하지 않는다면)
try {
// 로그인 실패 알랏창 띄우기
response.getWriter().println("<script>alert('로그인 실패...';</script>");
System.out.println("로그");
} catch (IOException e) {
e.printStackTrace();
}
}
ActionForward forward=new ActionForward();
forward.setRedirect(true);
forward.setPath("main.do");
return forward;
}
}
위 코드를 실행하면, (response.getWriter().println("<script>alert('로그인 실패...';</script>");) 부분의 로그인 실패 알랏창은 뜨지 않지만, 그 아래줄의 로그는 보이게 된다.
실행이 안 된 것인가? 절대 그런 것이 아니다. 직접적으로 있는 단어는 아니지만, "페이지 주도권"이 없어서 그렇다.
스크립트의 동작 방식대로라면, main.do로 바로 이동하기 때문이다.
그렇다면, 코드를 어떻게 수정하면 로그인 실패 알랏창이 뜨게될까..?
일단, 스크립트 알랏창을 C에서 하면 안 된다는 생각이 든다.
위 LoginAction.java 를 조금 수정해서 실패시 V의 안내메시지 페이지로 이동하게 하게 하면 된다.
아래는 수정된 LoginAction.java이다.
package controller.member;
import controller.common.Action;
import controller.common.ActionForward;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;
import jakarta.servlet.http.HttpSession;
import model.dao.MemberDAO;
import model.dto.MemberDTO;
public class LoginAction implements Action {
// Action 인터페이스에 의한 강제 오버라이딩
@Override
public ActionForward execute(HttpServletRequest request, HttpServletResponse response) {
// M으로 보낼 객체 생성
MemberDAO memberDAO=new MemberDAO();
MemberDTO memberDTO=new MemberDTO();
// V에서 가져온 아이디와 비밀번호 값 가져오기
memberDTO.setMid(request.getParameter("mid"));
memberDTO.setPassword(request.getParameter("password"));
// M에서 임의로 만든 아이디 중복검사를 위한 컨디션 값, CHECKMID
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");
// info.jsp ->> 안내메시지(실패, 성공, 등등..)
forward.setPath("info.jsp");
forward.setRedirect(false);
}
return forward;
}
}
아래는 위 알랏창을 띄우기 위해 만들어진, V의 info.jsp 이다.
<%@ 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>
만약,
로그인 실패 페이지를 만들게 된다면, 코드 재사용성이 용이하지 않을 것이다.
예시 )
<%@ 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='loginPage.do';
</script>
</body>
</html>
나중에 또 안내메시지(알랏창)을 띄우도록 만들고 싶어질 수도 있다.
위 info.jsp를 재사용하면 유지보수가 용이해지고, 코드 재사용성이 증가할 것이기 때문에, info.jsp를 만들어보았다.