[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>
실행 화면
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>
반응형
'Back-End > Spring Legacy' 카테고리의 다른 글
[Spring 2.5] 게시판 CRUD 만들기 (0) | 2022.03.23 |
---|---|
[Spring 2.5] Annotation (어노테이션) (0) | 2022.03.23 |
[Spring 2.5] SimpleFormController (0) | 2022.03.22 |
[Spring 2.5] DI, IoC 란? (0) | 2022.03.21 |
[Spring 2.5] spring2.5 설치&초기 세팅, JRE(JDK) 변경 방법 (0) | 2022.03.21 |
블로그의 정보
무작정 개발
무작정 개발