Dev/Spring

Spring2.5 MVC - AbstractWizardFormController

창문닦이 2019. 4. 5. 18:22

페이지 구조

돌아갈려면 0 다음단계로 넘어가면 1. AbstractWizardController를 상속받아서 구현할 것이다.


mem1 (_target0)

이름/주민번호

이미 가입된 정보라면

메세지를 띄운다.

mem2 (_target1)

아이디/패스워드/회원구분


mem3 (_target2)

회원가입완료정보 출력


mem_ok : 회원가입이 되었습니다.

mem_cancel : 회원가입이 취소 되었습니다.

회원 가입등 여러 페이지에 걸쳐서 값을 입력 받아 최종적으로 사용자의 요청을 처리해야 하는 경우 AbstractWizardFormController 클래스를 사용한다.


AbstractWizardFormController 클래스는 SimpleFormController 클래스와 마찬가지로 GET 요청이 들어오면 입력 폼을 처리한다.

차이점은 POST 요청이 들어 오면 순서에 맞춰서 입력폼을 출력하고 단계적으로 폼 전송을 받는다. 각 페이지에서는 POST로 폼 데이터를 컨트롤러에 전송하며, 컨트롤러는 커맨드객체에 파라미터를 저장한 뒤 다음 페이지를 출력한다. 마지막 요청 전송이 들어오면 최종 로직을 수행한 후 결과를 출력한다. 또한, SimpleFormController와 마찬가지로 컨트롤러 객체를 사용할 커맨드 클래스를 request 에 저장할 때 사용할 이름을 설정해주어야 한다.

1. MemCommand 클래스 생성

package com.test2;

public class MemCommand {

private String name;

private String jumin;

private String type;

private String id;

private String pwd;

private String tel;

private String message;

getter, setter 작성

}

2. JSP 페이지 생성


① mem1 - 회원여부체크

<%@ page contentType="text/html; charset=UTF-8"%>

<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>

<%

request.setCharacterEncoding("UTF-8");

String cp = request.getContextPath();

%>

<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">

<html>

<head>

<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">

<title>회원여부체크</title>

</head>

<body>

<form action="<%=cp %>/test2/mem.action" method="post">

이름: <input type="text" name="name"/><br/>

주민 : <input type="text" name="jumin"/><br/>

<input type="submit" name="_target0" value="다시입력"/>

<input type="submit" name="_target1" value="다음단계"/>

</form>

${info.message }

</body>

</html>

② mem2 - 회원정보등록

<%@ page contentType="text/html; charset=UTF-8"%>

<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>

<%

request.setCharacterEncoding("UTF-8");

String cp = request.getContextPath();

%>

<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">

<html>

<head>

<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">

<title>회원정보등록</title>

</head>

<body>

<form action="<%=cp%>/test2/mem.action" method="post">

아이디 : <input type="text" name="id"/><br/>

패스워드 : <input type="text" name="pwd"/><br/>

회원구분:

<select name="type">

<c:forEach var="type" items="${types }">

<option value="${type }">${type }</option>

</c:forEach>

</select>

<br>

<input type="submit" name="_target0" value="다시입력"/>

<input type="submit" name="_target2" value="다음단계"/>

</form>

</body>

</html>

③ mem3 - 회원정보확인 

<input type="submit" name="_finish" value="회원가입"/>

최종적으로 폼 입력을 끝낼때는 submit 버튼의 name 속성 값을 "_finish"로 지정

<input type="submit" name="_cancel" value="가입취소"/>

페이지 처리 과정을 취소할 경우 processCancel() 메소드를 이용하여 취소를 위해 필요한 과정을 구현

processCancel() 메소드를 이용하여 취소 과정을 수행 하려면 submit 버튼의 name 속성에 "_cancel"로 지정.


<%@ page contentType="text/html; charset=UTF-8"%>

<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>

<%

request.setCharacterEncoding("UTF-8");

String cp = request.getContextPath();

%>

<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">

<html>

<head>

<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">

<title>회원정보확인</title>

</head>

<body>

<form action="<%=cp%>/test2/mem.action" method="post">

이름:${info.name }<br>

주민:${info.jumin }<br>

아이디:${info.id }<br>

패스워드:${info.pwd }<br>

구분:${info.type }<br>

<input type="submit" name="_target1" value="이전입력"/>

<input type="submit" name="_finish" value="회원가입"/>

<input type="submit" name="_cancel" value="가입취소"/>

</form>

</body>

</html>

④ mem_cancel - 취소시 출력페이지

<%@ page contentType="text/html; charset=UTF-8"%>

<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>

<%

request.setCharacterEncoding("UTF-8");

String cp = request.getContextPath();

%>

<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">

<html>

<head>

<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">

<title>취소</title>

</head>

<body>

<h1>회원가입이 취소 되었습니다.</h1>

</body>

</html>

⑤ mem_ok - 완료시 출력페이지

<%@ page contentType="text/html; charset=UTF-8"%>

<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>

<%

request.setCharacterEncoding("UTF-8");

String cp = request.getContextPath();

%>

<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">

<html>

<head>

<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">

<title>완료</title>

</head>

<body>

<h1>회원가입이 되었습니다.</h1>

</body>

</html>

3. AbstractWizardFormController를 상속받은 컨트롤러 생성

① referenceData() 메소드
뷰를 출력할 때 옵션 목록과 같이 추가적으로 필요한 정보가 있을 경우 사용.
page 파라미터는 데이터가 전달 될 뷰 페이지 번호를 의미 한다.(page 번호는 0부터 시작)

② postProcessPage() 메소드
각 페이지에서 폼을 전송하면 HttpSession에 저장된 커맨드 객체에 전송 받은 파라미터 값을 저장한 뒤 postProcessPage() 메소드를 호출하여 후처리를 수행.

③ processFinish() 메소드
최종 처리를 요청할 때 실행되며 SimpleFormController 클래스의 OnSubmit() 메소드와 비슷한 역활을 수행한다. 즉, 마지막 폼 전송을 요청할 때 호출된다.

④ processCancel() 메소드
페이지 처리 과정을 취소할 경우 processCancel() 메소드를 이용하여 취소를 위해 필요한 과정을
구현하며 processCancel() 메소드를 이용하여 취소 과정을 수행 하려면 submit 버튼의 name 속성에 "_cancel"로 지정 한다.

package com.test2;

import java.util.ArrayList;

import java.util.HashMap;

import java.util.List;

import java.util.Map;

import javax.servlet.http.HttpServletRequest;

import javax.servlet.http.HttpServletResponse;

import org.springframework.validation.BindException;

import org.springframework.validation.Errors;

import org.springframework.web.servlet.ModelAndView;

import org.springframework.web.servlet.mvc.AbstractWizardFormController;

public class MemController extends AbstractWizardFormController {

//기본생성자

public MemController() {

//객체 생성

//MemCommand info = new MemCommand(); 와 동일하다.

setCommandClass(MemCommand.class);

setCommandName("info");

}


@Override //여기서 매개변수 page는 mem1,mem2,mem3에 해당하는 페이지 데이터

protected void postProcessPage(HttpServletRequest request, Object command,

Errors errors, int page) throws Exception {

MemCommand mem = (MemCommand)command;//형변환

if(page==0){

//0일 경우 mem1.jsp

if(mem.getJumin().equals("1234")){//사용자가 입력한 주민번호가 일치하는 경우면 이미 가입내역 존재

String str = mem.getName() +"님 이미 가입되셨습니다." ;

//errors 객체가 value가 존재한다면 다음페이지로 넘어가지 못한다.

errors.rejectValue("message",str);

mem.setMessage(str);

}

}else if(page==1){

//해당페이지에서 검증해야되는 코딩을 작성.

}

super.postProcessPage(request, command, errors, page);

}


@Override

protected ModelAndView processCancel(HttpServletRequest request,

HttpServletResponse response, Object command, BindException errors)

throws Exception {

//페이지에서 _cancel submit버튼을 눌렀을 때 실행

return new ModelAndView("test2/mem_cancel",errors.getModel());

}


@Override

protected ModelAndView processFinish(HttpServletRequest request,

HttpServletResponse response, Object command, BindException errors)

throws Exception {

//페이지에서 _finish submit버튼을 눌렀을 때 실행

//최종 요청을 처리(입력이 정상적일때 실행할 작업)

//회원가입 진행(dao생성하고 insert실행하는 소스가 들어가면 됨. 현재는 간단하게 완료페이지로 넘어가게 진행)

return new ModelAndView("test2/mem_ok");

}


@Override

protected Map<String, List<String>> referenceData(HttpServletRequest request, int page)

throws Exception {

//특정창이 실행되기 전에 반영되는 메소드

//어떤 jsp페이지가 페이지번호가 0,1,2인지 설정해주어야함(dispatcher-servlet에서 설정)

//그래서 매개변수로 page값이 int로 넘어오는 것

if(page==1){

List<String> types = new ArrayList<String>();

types.add("일반회원");

types.add("기업회원");

types.add("특별회원");

Map<String, List<String>> map = new HashMap<String, List<String>>();

map.put("types",types);

return map;

}

return null;

}

}

4. dispatcher-servlet.xml 셋팅

뷰 페이지 목록은 pages 프로퍼티로 설정이 가능하다.

5. 출력 페이지

기가입된 주민등록번호로 가입시 메세지 출력