[Spring 2.5] AbstractWizardFormController, MultiTestController
by 무작정 개발반응형
2022.03.22(61일 차_화요일)
- 스프링(Spring) 2일 차
여기서는 스프링의 데이터 전송 방식, 스프링의 컨트롤러인 AbstractWizardFormController, MultiActionController
에 대해 정리할 것이다.
A -> B -> C 순으로 각각 데이터를 받아 넘기기
- AbstractWizardFormController
1. MemCommand 클래스 생성
- 스프링의 DTO 역할
javapackage 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)을 누르면 실행
javapackage 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>
실행 화면





MultiActionController
팀 프로젝트를 진행하면 각각 컨트롤러를 만들어 사용하는데 코드를 합치면 컨트롤러의 개수가 많아진다.
Struts의 Action을 한 곳으로 모으는 역할을 하는 컨트롤러가 존재하는데 이게 MultiActionController이다.
(1) MultiTestController 클래스 생성
javapackage 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>
블로그의 정보
무작정 개발
무작정 개발