BACKEND/스프링 Spring

[spring2.5] 스프링 간단한 예제(2)

꾸준히개발하자 2022. 3. 23. 02:40

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