예제 4 : A와 B에서 각각 데이터를 받아 C로 넘기기
다음 dispatcher-servlet.xml 에서 저장한다.
mem1.jsp -> _target0
mem2.jsp -> _target1
mem3.jsp -> _target2
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. mem1.jsp
입력폼 작성
<body>
<!-- action의 주소는 사용자 정의 편의상 같게 한것 -->
<from action="<%=cp%>/test2/mem.action" method="post">
이름 : <input type="text" name="name"><br/>
주민 : <input type="text" name="jumin"><br/>
<!-- 여기 name 은 정해진것 -->
<input type="submit" name="_target0" value="다시입력">
<input type="submit" name="_target1" value="다음단계">
</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="_target1" 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.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="_cencel" value="가입취소">
</form>
</body>
5. mem_ok.jsp
회원가입시 보여줄페이지이다.
<body>
<h1>회원가입완료</h1>
<hr/><br/>
</body>
6. mem_cancel.jsp
회원가입 취소시 보여줄 페이지
<body>
<h1>회원가입이 취소되었습니다</h1>
</hr>
</body>
7. memController.java
processCancel 메소드
작업을 하다 취소버튼 누르면 실행
페이지(mem3.jsp)에서 취소버튼 누르면 실행
페이지(mem3.jsp)에서 취소버튼 (_cancel)을 누르면 실행
processFinish 메소드
정확하게 가입을 했을때 진행됨
페이지(mem3.jsp)에서 회원가입버튼(_finish)을 누르게되면 실행
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() {
// 객체를 생성하면 dto의 객체가 info라는 이름으로 생성
setCommandClass(MemCommand.class);
setCommandName("info"); // ${info}
// MemCommand info = new MemCommand();
}
// postProcessPage : 각각의 페이지에서 진행될 작업들
// page : 각각의 페이지 번호가 들어온다.
@Override // 각 페이지(mem1,2,3)에서 submit한 경우 여기와서 postProcessPage메서드 실행
protected void postProcessPage(HttpServletRequest request, Object command, Errors errors, int page)
throws Exception {
// 각 페이지에서 submit한 경우 무조건 postProcessPage로 오게된다.
MemCommand mem = (MemCommand)command; // command를 받아냄 , mem1 ,mem2 ,mem3
if(page==0) { // mem1 이 왜 0페이지? dispatcher-servlet.xml 에서 세팅할것이다.
if(mem.getSsn().equals("123")) { // 사용자가 입력한 ssn을 읽어서 사용자가 입력한 데이터랑 비교
String str = mem.getName() + "님 이미 가입 되어있습니다."; // ${info.message } 에 띄운다.
// 이미 가입이 되어있으면 다음페이지로 넘어가지 못한다.
errors.rejectValue("message", 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 arg2,
BindException errors) throws Exception {
// 회원가입 정상적으로 데이터 입력이 정상적일때
// 회원가입처리 코딩 , 돌아가는 곳은 mem_ok -> 이 페이지는 Controller 분배기 역할
// 회원가입 처리 - (DB가 있으면 DB에 insert 한다)
return new ModelAndView("test2/mem_ok");
}
// referenceData메소드는 미리 준비하는곳이다.
@Override
protected Map<String , List<String>> referenceData(HttpServletRequest request, Object command, Errors errors, int page) throws Exception {
// 각각의 페이지에 띄울곳
// 1페이지가 넘어올시
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 설정한다.
mem1.jsp = page 0
mem2.jsp = page 1
mem3.jsp = page 2
<!--자동으로 mem1은 index번호 0/ mem2는 1 / mem3은 2가된다.
<bean name="memberController" class="com.test2.MemController">
<property name="pages">
<list>
<value>test2/mem1</value>
<value>test2/mem2</value>
<value>test2/mem3</value>
</list>
</property>
</bean>
MultiActionController : action들을 모아놓았다.
프로젝트를 하면 각각 컨트롤러를 만들어 사용하는데 코드를 합치게 되면 컨트롤러의 개수가 훨씬 더 많아지게 된다.
Struts의 Action을 한곳으로 모으는 역할을 하는 컨트롤러가 있는데 이게 MultiActionController 이다.
1. MultiTestController 클래스 생성
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"></property>
<!-- spring은 어노테이션으로 쓸수있는데 수동적인 주소 어떤걸 우선할것인가 value = 1 먼저 실행 -->
<property name="alwaysUseFullPath" value="true"></property>
<property name="mappings">
<props>
<prop key="/multi/*.action">multiTestController</prop>
<!-- .action 앞에 어떤것이든 오면 multiTestController 를 찾는다 -->
</props>
</property>
</bean>
<!-- 제어의 역전이다 -->
<bean name="multiTestController" class="com.test3.MultiTestController">
<!-- prosResolver사용하기 위해 작성 -->
<property name="methodNameResolver" ref="prosResolver"/>
</bean>
'BACKEND > 스프링 Spring' 카테고리의 다른 글
[spring2.5] 게시판 만들기 (0) | 2022.03.23 |
---|---|
[spring2.5] 스프링 Annotation (0) | 2022.03.23 |
[spring2.5] 스프링 간단한 예제 (0) | 2022.03.23 |
[Spring2.5] 스프링 2.5 환경 설정 (0) | 2022.03.22 |
[spring2.5]스프링 프레임워크 시작 (0) | 2022.03.22 |