무작정 개발.Vlog

[Spring 2.5] AbstractWizardFormController, MultiTestController

by 무작정 개발
반응형
2022.03.22(61일 차_화요일)
 - 스프링(Spring) 2일 차

 

여기서는 스프링의 데이터 전송 방식, 스프링의 컨트롤러인 AbstractWizardFormController, MultiActionController

에 대해 정리할 것이다.

 

A -> B -> C 순으로 각각 데이터를 받아 넘기기
- AbstractWizardFormController

 

1. MemCommand 클래스 생성

  • 스프링의 DTO 역할
package com.test2;
//Command는 스프링의 DTO
public class MemCommand {
	
	private String name;
	private String ssn;
	private String type;
	private String id;
	private String pwd;
	private String tel;
	private String message;
    
    // getter/setter 생성
}

 

2. mem1.jsp 페이지 생성

<body>

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

이름: <input type="text" name="name"/><br/>
주민번호: <input type="text" name="ssn"/><br/>

<!-- 여기 name은 정해진 것 -->
<input type="submit" name="_target0" value="다시입력"/>
<input type="submit" name="_target1" value="다음단계"/>
<!--  AbstractWizardFormController의 문법 : _  -->
</form>

${info.message }

</body>

 

 

3. mem2.jsp 페이지 생성

<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>

 

4. mem3.jsp 페이지 생성

  • 데이터 확인 및 회원가입 & 취소 작성
  • 값을 info로 받음
<body>
<form action="<%=cp%>/test2/mem.action" method="post">

이름 : ${info.name }<br/>
주민번호 : ${info.ssn }<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>

 

 

5. mem_ok.jsp 페이지 생성

  • 회원가입 시 보여줄 페이지
<body>

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

</body>

 

6. mem_cancel.jsp 페이지 생성

  • 회원가입 취소 시 보여줄 페이지
<body>

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

</body>

 

7. MemController 클래스 생성

  • AbstractWizardFormController 상속(extends)

▶ processCancel() 메서드

    - mem3.jsp페이지에서 취소 버튼(_cancel)을 누르면 실행

 

▶processFinsh() 메서드

   - mem3.jsp페이지에서 회원가입 버튼(_finsh)을 누르면 실행

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;

//컨트롤러 역할을 하기 위해  AbstractWizardFormController상속
public class MemController extends AbstractWizardFormController {
	
	//MemberCommand 객체 생성
	public MemController() {
		setCommandClass(MemCommand.class);
		setCommandName("info"); // ${info. ~ }
		//MemCommand info = new MemCommand();
	}

	@Override //각 페이지(mem1,2,3)에서 submit한 경우 여기와서 postProcessPage메서드 실행
	protected void postProcessPage(HttpServletRequest request,
			Object command, Errors errors, int page)
			throws Exception {
		
		//각 페이지에서 submit한 경우 
		MemCommand mem = (MemCommand)command;
		
		//mem1,2,3 어떤 페이지에서 왔는지 알아야함
		if(page==0) {
			
			if(mem.getSsn().equals("123")) { //mem.getSsn()는 사용자가 입력한 주민번호
				
				String str = mem.getName() + "님 이미 가입 되어있습니다.";
				
				//이미 가입되어있으면 men1.jsp에서 멈춰야한다. -> 다음페이지로 못넘어감
				errors.rejectValue("message", str); //에러 코드를 저장
				
				//에러 코드를 담아서 setMessage에 str을 담는다.
				mem.setMessage(str); //mem에 다시 넣는다
			}
			
		}else if(page==1) {
			
		}
		
		
	}

	@Override
	protected ModelAndView processCancel(HttpServletRequest request, 
			HttpServletResponse response, Object command,
			BindException errors) throws Exception {
		
		//회원가입을 취소한 경우
		
		
		return new ModelAndView("test2/mem_cancel", errors.getModel()); //넘어갈때 errors의 getModel()를 가져간다.
	}

	@Override
	protected ModelAndView processFinish(HttpServletRequest request, 
			HttpServletResponse response, Object command,
			BindException errors) throws Exception {
		
		// 데이터 입력이 정상적일 떄
		//회원가입 처리 - (DB가 있으면 DB에 insert한다)
		
		return new ModelAndView("test2/mem_ok");
	}

	@Override //referenceData는 미리 준비하는 곳
	protected Map<String, List<String>> referenceData(HttpServletRequest request, 
			Object command, Errors errors, int page) throws Exception {
		
		
		//여기서도 page가 넘어온다,
		if(page==1) {
			
			List<String> types = new ArrayList<>();
			types.add("일반회원");
			types.add("기업회원");
			types.add("특별회원");
			
			Map<String, List<String>> map = new HashMap<String, List<String>>();
			map.put("types", types);
			
			return map;
			
		}
		
		return null; //1페이지가 아닌 경우는 null반환 - (일단 지금 2,3페이지를 안쓸거기때문)
		//다 만들었으면 움직이게하기위해 dispatcher-servlet 작성
	}

}

 

 

8. dispatcher-servlet.xml 작성

  • 사용 컨트롤러 : AbstractWizardFormController
  • memController에서 page 설정
<!-- 예제2 - 자동으로 mem1은 index번호0/mem2는 1/mem3는 2가된다. -->
<bean name="memController" class="com.test2.MemController">
	<property name="pages">
		<list>
			<value>test2/mem1</value>
			<value>test2/mem2</value>
			<value>test2/mem3</value>
		</list>
	</property>
</bean>

 

 

실행 화면

실행 화면 1
실행 화면 1
실행 화면 2
실행 화면 2
실행 화면 3
실행 화면 3
4. 회원가입 버튼 클릭 시
4. 회원가입 버튼 클릭 시
5. 가입 취소 버튼 클릭 시
5. 가입 취소 버튼 클릭 시


 

MultiActionController

 

팀 프로젝트를 진행하면 각각 컨트롤러를 만들어 사용하는데 코드를 합치면 컨트롤러의 개수가 많아진다.

Struts의 Action을 한 곳으로 모으는 역할을 하는 컨트롤러가 존재하는데 이게  MultiActionController이다.

 

(1) MultiTestController 클래스 생성

package com.test3;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.springframework.web.servlet.ModelAndView;
import org.springframework.web.servlet.mvc.multiaction.MultiActionController;

public class MultiTestController extends MultiActionController {//액션을 여러 개 수행하는 컨트롤러
	
	
	public ModelAndView list(HttpServletRequest request, //메서드 단위로 넘어감
			HttpServletResponse response) throws Exception {
		
		request.setAttribute("message", "list 페이지");//문자 하나 넣은것
		
		
		return new ModelAndView("test3/testList");
				
	}
	
	public ModelAndView view(HttpServletRequest request,
			HttpServletResponse response) throws Exception {
		
		request.setAttribute("message", "view 페이지");//문자 하나 넣은것
		
		
		return new ModelAndView("test3/testView");
				
	}

}

 

(2) testList.jsp 페이지 생성

<body>

${message }

</body>

(3) testView.jsp 페이지 생성

<body>

${message }

</body>

 

(4) dispatcher-servlet.xml 작성

<bean id="simpleUrlMapping" class="org.springframework.web.servlet.handler.SimpleUrlHandlerMapping">
	<property name="order" value="1"/> <!-- Spring은 어노테이션으로 쓸수있는데  수동적인 주소 어떤걸 우선할것인가 , value = 1  얘를 먼저 실행해라 -->
	<property name="alwaysUseFullPath" value="true"/> 
	<property name="mappings">
		<props>
        	<!-- .action앞에 어떤것이든 오면 multiTestController 찾는다. -->
			<prop key="/multi/*.action">multiTestController</prop> 
		</props>
	</property>
</bean>

<!-- IOC 제어의 역전 -->
<bean name="multiTestController" class="com.test3.MultiTestController">
	<property name="methodNameResolver" ref="propsResolver"/>
</bean>

 

반응형

블로그의 정보

무작정 개발

무작정 개발

활동하기