무작정 개발.Vlog

[Spring 2.5] AbstractWizardFormController, MultiTestController

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

 

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

에 대해 정리할 것이다.

 

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

 

1. MemCommand 클래스 생성

  • 스프링의 DTO 역할
java
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 페이지 생성

html
<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 페이지 생성

html
<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로 받음
html
<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 페이지 생성

  • 회원가입 시 보여줄 페이지
html
<body>
<h1>회원가입이 되었습니다.</h1>
</body>

 

6. mem_cancel.jsp 페이지 생성

  • 회원가입 취소 시 보여줄 페이지
html
<body>
<h1>회원가입이 취소되었습니다</h1>
</body>

 

7. MemController 클래스 생성

  • AbstractWizardFormController 상속(extends)

▶ processCancel() 메서드

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

 

▶processFinsh() 메서드

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

java
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 설정
html
<!-- 예제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 클래스 생성

java
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 페이지 생성

html
<body>
${message }
</body>

(3) testView.jsp 페이지 생성

html
<body>
${message }
</body>

 

(4) dispatcher-servlet.xml 작성

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

 

블로그의 프로필 사진

블로그의 정보

무작정 개발

무작정 개발

활동하기