본문 바로가기

Spring 2.5

SPRING 2.5 - 컨트롤러 종류별 예제, annotation

 


 

 

dispatcher-servlet.xml

- viewResolver : view를 관리하는 애 
return '/board/created.jsp'; => return 'board/created'

<bean id="viewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver">
    <property name="prefix" value="/" /> 
    <property name="suffix" value=".jsp" /> 
</bean>

 

1. BeanNameUrlHandlerMapping 

- DispatcherServlet이 사용하는 기본 DI 객체
- 핸들러 매핑 : BeanNameUrlHandlerMapping
- 명시적으로 지정된 HandlerMaping이 없으면 별도의 설정 없이 자동으로 사용

- 바로 컨트롤러의 위치로 가라고 알려줌. 직관적임.

<bean id="beanNameUrlMapping"
class="org.springframework.web.servlet.handler.BeanNameUrlHandlerMapping"/>
<bean name="/test/msg.action" class="com.test.TestController"></bean>

 

2. SimpleUrlHandlerMapping

<!-- order=1 의 의미 : 우선순위가 여기다. (어노테이션보다 우선순위) -->
<bean id="SimpleHandlerMapping"
class="org.springframework.web.servlet.handler.SimpleUrlHandlerMapping">

	<property name="order" value="1" />

	<!-- alwaysUseFullPath: 중간주소부터 쓰겠다 /test/write.action 
    이게 없으면  /write.action 이렇게만 써도 됨 -->
	<property name="alwaysUseFullPath" value="true" />
	<property name="mappings">
		<props>
			<prop key="/test/write.action">listFormController</prop> <!--사용자 정의, 앞글자 소문자-->
			<prop key="/test/write_ok.action">listController</prop>
			<prop key="/test1/login.action">testLoginController</prop>
			<prop key="/test2/mem.action">testMemController</prop>
			<prop key="/multi/*.action">multiTestController</prop>
		</props>
	</property>
	
</bean>	

<!-- 컨트롤러.java를 쓰려면 객체생성을 해야하니깐 -->
<bean name="listFormController"	class="com.test.ListFormController"/>
<bean name="listController" class="com.test.ListController"/>	

 


컨트롤러 종류
1. AbstractCommandController
2. SimpleFormController
3. AbstractWizardFormController
4. MultiActionController

1. AbstractCommandController  

[흐름] 주소창에 /spring/test/write.action 입력 ->  dispatcher-servlet.xml -> SimpleUrlHandlerMapping을통해ListFormController.java->write.jsp 화면 띄워줌

 

ListFormController.java

package com.test;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.springframework.web.servlet.ModelAndView;
import org.springframework.web.servlet.mvc.Controller;

public class ListFormController implements Controller{

	@Override
	public ModelAndView handleRequest(
			HttpServletRequest request, 
			HttpServletResponse response) throws Exception {
						
		return new ModelAndView("test/write");
		// dispatcher-servlet의 viewResolver 때문에 이렇게 표기 가능한 것(/test/write.jsp)
		}	
}

 

write.jsp

<%@ page contentType="text/html; charset=UTF-8"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<%
	request.setCharacterEncoding("UTF-8"); 
	String cp = request.getContextPath(); 
%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
</head>
<body>

<form action="<%=cp %>/test/write_ok.action" method="post">

아이디: <input type="text" name="userId"/><br/>
이름: <input type="text" name="userName"/><br/>

<input type="submit" value="전송하기"/>

</form>
</body>
</html>

 

ListCommand.java

package com.test;

//DTO (String 에서 DTO를 Command라 함 . Command라는 controller를 쓰기 때문
public class ListCommand {

	public String userId;
	public String userName;
	
	public String getUserId() {
		return userId;
	}
	public void setUserId(String userId) {
		this.userId = userId;
	}
	public String getUserName() {
		return userName;
	}
	public void setUserName(String userName) {
		this.userName = userName;
	}
		
}

ListController.java

package com.test;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.springframework.validation.BindException;
import org.springframework.web.servlet.ModelAndView;
import org.springframework.web.servlet.mvc.AbstractCommandController;

public class ListController extends AbstractCommandController{
	
	// 생성자
	public ListController() {
		
		//ListCommand listCommand = new ListCommand(); 이 말임.
		//Spring이 input값으로 받은 userId,userPwd를 알아서 Object command 에 넣어줌 
		// Spring이 어떤 값을 줄지 모르니깐 Object형으로 받은 것
		setCommandClass(ListCommand.class);
		setCommandName("listCommand"); // 사용자 정의		
	}
			
	@Override
	protected ModelAndView handle(HttpServletRequest request, 
			HttpServletResponse response, Object command, 
			BindException error)
			throws Exception {
		
		// 사용자가 입력한 데이터를 담기
		// Object command로 들어왔으므로 downcast
		ListCommand vo = (ListCommand)command;		
		
		// Model 만들기
		String message = "이름: " + vo.getUserName();
		message += ", 아이디: " + vo.getUserId();
			
		request.setAttribute("message", message);
		
		return new ModelAndView("test/write_ok");
	}		

}

write_ok.jsp

<%@ page contentType="text/html; charset=UTF-8"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<%
	request.setCharacterEncoding("UTF-8"); 
	String cp = request.getContextPath(); 
%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
</head>
<body>

${message }

</body>
</html>

2. SimpleFormController & Exception

- Exception 처리는 웹에서도 구현이 가능하다. SimpleFormController를 이용하여 MVC 패턴을 실습해보자

SimpleFormController는 ... 

- Get 요청이 들어오면 showForm() 메소드를 호출하여 입력 폼 출력을 위한 ModelAndView 객체를 리턴
- Post 요청이 들어오면 입력 폼 검증을 위한 onSubmit() 메소드를 호출하여 클라이언트의 요청을 처리 

0. FrontController 설정 
1. command 클래스 생성 
2. Exception 클래스 생성
3. Authenticator 인터페이스 생성
4. Authenticator를 구현한 클래스 생성
5. Controller 생성
6. View 생성
7. FrontController 설정

0. FrontController 설정 - dispatcher-servlet.xml 

- Authenticator.java를 쓰기 위해  객체 생성 (제어의역전, 의존성주입)

*setter명 주는법: 예) setAuthenticator에서 앞의 글자 set만 빼고 소문자로 바꿈 => "authenticator"

- LoginController.java의 setter에다가 넣어주기

- 담을 객체 생성하기(Command) 사용자가 데이터를 건네받으려면 객체(dto)가 있어야함 그래야 spring이 거기다가 데이터를 넣어줌 

<bean name="authenticator-ref" class="com.test1.LoginAuthenticatorImpl"/>
	
<bean name="testLoginController" class="com.test1.LoginController">	
	<property name="authenticator" ref = "authenticator-ref"/>
	<property name="commandName" value="testLoginCommand"/>	
	<property name="commandClass" value= "com.test1.LoginCommand"/>
</bean>		

위에서 객체생성 다하고 데이터 가지고 login.jsp로 가는 것!

 

1. Command 클래스 생성

package com.test1;

public class LoginCommand { 
	
	private String userId;
	private String userPwd;
	private String loginType;
    
    // getter, setter 생성
    
    }

 

2. Exception 클래스 생성

package com.test1;

//사용자정의 예외처리 
public class UserException extends Exception{
	
	public UserException(String str) {
		super(str);
	}	

}

 

3. Authenticator 인터페이스 생성

package com.test1;

public interface Authenticator {	
	
	public void authen(String userId, String userPwd) 
			throws UserException; // 예외처리는 사용자정의 UserException이 해줄것임	
	
}

 

4. Authenticator를 구현한 클래스 생성

package com.test1;

public class LoginAuthenticatorImpl implements Authenticator{

	@Override
	public void authen(String userId, String userPwd) throws UserException {
		
		// DB에서 가져왔다고 가정하고
		if(!userId.equals("suzi") || !userPwd.equals("123")) {
			
			throw new UserException("입력 오류!!" + userId);
			
		}		
		
	}

}

 

5. Controller 생성

package com.test1;

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.web.servlet.ModelAndView;
import org.springframework.web.servlet.mvc.SimpleFormController;

public class LoginController extends SimpleFormController{
	
	// Authenticator authenticator = new LoginAuthenticatorImpl();
	
	//인터페이스 선언 (의존성주입(아래 메소드를통해서)할 것임)
	private Authenticator authenticator;
	
	public void setAuthenticator(Authenticator authenticator) {
		this.authenticator = authenticator;
	}

	
	//submit이 클릭되면 무조건 onSubmit을 찾아옴 (Post방식이니깐)
	//input 데이터도 넘어옴
	@Override
	protected ModelAndView onSubmit(HttpServletRequest request, HttpServletResponse response, Object command,
			BindException errors) throws Exception {
		
		LoginCommand login = (LoginCommand)command; 
		//downcasting해서 값 받아내고 
		
		try {
			
			authenticator.authen(login.getUserId(), 
					login.getUserPwd()); 
            // 에러가 난다면, 여기로 옴
			// => 로그인창을 아이디,비번form 초기화시키고 사용자가 다시 입력하게끔 해준다
			// => 에러나면 아래 catch로 감
			
			String message = "id: " + login.getUserId();
			message += ", pwd: " + login.getUserPwd();
			message += ", type" + login.getLoginType(); 
			
			request.setAttribute("message", message);
			
			// 예외가 안나면 login_ok로 보내준다
			return new ModelAndView("test1/login_ok");
			
			
		} catch (Exception e) {
			// 입력창을 다시 보여줌 (reloading)
			return showForm(request,response,errors);
		}				
	}

	
	
	// 입력창을 띄우기 전에 특정 데이터를 입력창에 미리 보냄
	// 예: 수정창 띄울 때 (미리 이 창에 데이터를 집어 넣고 싶을때 그 역할을 해주는 메소드)
	// DB에서 한명의 데이터 읽어내는 코딩을 여기다 해놓으면 편함.
	@Override
	protected Map<String,List<String>> referenceData(HttpServletRequest request) throws Exception {
		// loginType : 일반회원,vip회원 선택할 수 있는 창
		// select에 들어갈 내용 (창에서 고를 수 있는 박스)
		List<String> loginTypes = new ArrayList<>();
		loginTypes.add("일반회원");
		loginTypes.add("기업회원");
		loginTypes.add("특별회원");
		
		Map<String, List<String>> map = 
					new HashMap<String, List<String>>();
		
		map.put("loginTypes", loginTypes);
				
		return map;
	} 

}

 

6. View 생성 

dispatcher-servlet.xml 설정 (SimpleUrlHandlerMapping)

			<prop key="/test1/login.action">testLoginController</prop>
<bean name="testLoginController" class="com.test1.LoginController">

 

login.jsp

타입을 submit으로 설정해둬야 컨트롤러의 onSubmit 메소드가 실행된다

로그인 타입을 referenceData 메소드를 통해 전달받아 출력할 것이므로 <c:forEach> 태그를 사용하였다

단, items의 변수명과 보내는 데이터명이 동일해야한다 (loginTypes)

<%@ page contentType="text/html; charset=UTF-8"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<%
	request.setCharacterEncoding("UTF-8"); 
	String cp = request.getContextPath(); 
%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
</head>
<body>

<form action="<%=cp %>/test1/login.action" method="post">

아이디:<input type="text" name="userId"/><br/>
패스워드:<input type="password" name="userPwd"/><br/>
로그인타입:
<select name="loginType">

	<c:forEach var="type" items="${loginTypes }">
		<option value="${type }">${type }</option>		
	</c:forEach>

</select>
<br/>

<input type="submit" value="로그인"/>

</form>
</body>
</html>

login_ok.jsp

<%@ page contentType="text/html; charset=UTF-8"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<%
	request.setCharacterEncoding("UTF-8"); 
	String cp = request.getContextPath(); 
%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
</head>
<body>

${message }

</body>
</html>

 

실행화면

 


3. AbstractWizardFormController

dispatcher-servlet.xml - 매핑정보

<bean id="SimpleHandlerMapping"
class="org.springframework.web.servlet.handler.SimpleUrlHandlerMapping">
	<property name="order" value="2" />
	<property name="alwaysUseFullPath" value="true" />
	<property name="mappings">
		<props>
			<prop key="/test/write.action">listFormController</prop>
			<prop key="/test/write_ok.action">listController</prop>
			<prop key="/test1/login.action">testLoginController</prop>
			<prop key="/test2/mem.action">testMemController</prop>
			<prop key="/multi/*.action">multiTestController</prop>
		</props>
	</property>
</bean>	

화면 뜨는 순서 mem1 -> mem2 -> mem3 (주소는 mem.action으로 하나이다)  
대신 page==1일때만 처리 값을 설정해놨으므로 mem1과 mem2의 자리를 바꾸면 값은 안넘어간다

<bean id="testMemController" class="com.test2.MemController">
	<property name="pages">
		<list> 
			<value>test2/mem1</value> <!-- 자동으로 인덱스 0 매겨짐 (이거 자체가 page가 됨)-->
			<value>test2/mem2</value> <!-- 인덱스 1 -->
			<value>test2/mem3</value> <!--  인덱스 2 -->
		</list>	
	</property>
</bean>

 

1. MemCommand 클래스 생성

package com.test2;

public class MemCommand { //DTO
	
	private String name;
	private String ssn;
	private String type;
	private String id;
	private String pwd;
	private String tel;
	private String message;
    
   	getter, setter 생성
    }

 

2. JSP 페이지 생성

submit form의 name값들은 사용자정의가 아니다. 지정된 값임!

_target1, _target0, _target2, _finish, _cancel 

mem1.jsp

<%@ page contentType="text/html; charset=UTF-8"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<%
	request.setCharacterEncoding("UTF-8"); 
	String cp = request.getContextPath(); 
%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>회원여부체크</title>
</head>
<body>

<form action="<%=cp %>/test2/mem.action" method="post">
이름:<input type="text" name="name"/><br/>
주민:<input type="text" name="ssn"/><br/>
<input type="submit" name="_target0" value="다시입력"/>
<input type="submit" name="_target1" value="다음단계"/>

<!-- _target0,1 명은 절대 바꾸면 안됨! (사용자정의X) -->
</form>

<!-- 이미 있는 주민번호면 에러 처리 -->
${info.message }

</body>
</html>

 

mem2.jsp

<%@ page contentType="text/html; charset=UTF-8"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<%
	request.setCharacterEncoding("UTF-8"); 
	String cp = request.getContextPath(); 
%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
</head>
<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>
</html>

 

mem3.jsp

<%@ page contentType="text/html; charset=UTF-8"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<%
	request.setCharacterEncoding("UTF-8"); 
	String cp = request.getContextPath(); 
%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
</head>
<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>
</html>

 

mem_ok.jsp - 회원가입 완료 시 페이지

<%@ page contentType="text/html; charset=UTF-8"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<%
	request.setCharacterEncoding("UTF-8"); 
	String cp = request.getContextPath(); 
%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
</head>
<body>

회 원 가 입 이  완료되었습니다 :)

</body>
</html>

 

mem_cancel.jsp - 회원가입 취소 시 페이지

<%@ page contentType="text/html; charset=UTF-8"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<%
	request.setCharacterEncoding("UTF-8"); 
	String cp = request.getContextPath(); 
%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
</head>
<body>

회 원 가 입을 취소하였습니다 :)

</body>
</html>

 

3. AbstractWizardFormController를 상속받은 컨트롤러 생성

① referenceData() 메소드

뷰를 출력할 때 옵션 목록과 같이 추가적으로 필요한 정보가 있을 경우 사용.

page 파라미터는 데이터가 전달 될 뷰 페이지 번호를 의미한다. (page번호는 0부터 시작)

 

② postProcessPage() 메소드

각 페이지에서 폼을 전송하면 HttpSession에 저장된 커맨드 객체에 전송 받은 파라미터 값을 저장한 뒤 postProcessPage() 메소드를 호출하여 후처리를 수행 

 

③ processFinish() 메소드

최종 처리를 요청할 때 실행되며 마지막 폼 전송을 요청할 때 호출된다 ( SimpleFormController 클래스의 OnSubmit() 메소드와 비슷한 역할 수행)

 

④ processCancel() 메소드

페이지 처리 과정을 취소할 경우 processCancel() 메소드를 이용하여 취소를 위해 필요한 과정을 구현하며 processCancel() 메소드를 이용하여 취소 과정을 수행 하려면 submit 버튼의 name 속성에 "_cancel"로 지정한다

 

 

MemController.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;

public class MemController extends AbstractWizardFormController{
	
	// 생성자, setter
	public MemController() {
		
		setCommandClass(MemCommand.class);
		setCommandName("info");
		
	}		
	
	@Override
	protected void postProcessPage(HttpServletRequest request,
			Object command, Errors errors, int page)
			throws Exception {
		
		//각 페이지에서 submit한 경우, 
		//넘어오는 dto downcast
		MemCommand mem = (MemCommand)command;
		
		//mem1,mem2,mem3 무엇으로 온건지 구분
		if(page==0) {
			//주민번호 비교
			if(mem.getSsn().equals("1234")) {
				
				String str = mem.getName() + "님 이미 가입 되셨습니다";
				
				//에러코드 넘기고 mem1.jsp 페이지에 멈춰있어야 함
				errors.rejectValue("message", str);
				
				//데이터는 만들어서 넘겨주는데 화면은 그대로
				mem.setMessage(str);
				
			}
			
		} 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());
		
	}

	// 준비작업하는 메소드 (미리)
	@Override
	protected Map referenceData(HttpServletRequest request, 
			Object command, Errors errors, int page) throws Exception {
	
		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;
			
		}
		
		// else if (page==2) ... 생략		
		// 어떤 if문에도 속하지 않으면 null값 반환
		return null;
	}


	@Override
	protected ModelAndView processFinish
	(HttpServletRequest request, HttpServletResponse response, Object command,
			BindException errors) throws Exception {
				
		//회원가입 처리 ....
				
		return new ModelAndView("test2/mem_ok");			
	
	}	

}

 


4. MultiActionController

dispatcher-servlet.xml -> SimpleHandlerMapping

<bean id="SimpleHandlerMapping"
class="org.springframework.web.servlet.handler.SimpleUrlHandlerMapping">
	<property name="order" value="2" />
	<property name="alwaysUseFullPath" value="true" />
	<property name="mappings">
		<props>
			<prop key="/test/write.action">listFormController</prop>
			<prop key="/test/write_ok.action">listController</prop>
			<prop key="/test1/login.action">testLoginController</prop>
			<prop key="/test2/mem.action">testMemController</prop>
			<prop key="/multi/*.action">multiTestController</prop>
		</props>
	</property>
</bean>	

 

주소창에 /multi/*.action이 와서 컨트롤러로 찾아갈 때, 어떨 때 list와 view 메소드로 찾아가는지 적어줘야함

methodNameResolver는 사용자정의X

<bean id="multiTestController" 	class="com.test3.MultiTestController">
	<property name="methodNameResolver" ref="propsResolver"></property>
</bean>

->  IOC가 일어남

<bean id="propsResolver" class="org.springframework.web.servlet.mvc.multiaction.PropertiesMethodNameResolver">
	<property name="mappings">
		<props>
			<prop key="/multi/a.action">list</prop>
			<prop key="/multi/b.action">view</prop>
		</props>	
	</property>
</bean>

* NameResolver : 이름을 분해해주는 애 

 

 

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{
	
	// 지금 예제들은 띄엄띄엄 주요예제만 보여주고 넘어가는것
	
	//사용자 정의 메소드
	// SPRING에게 request, response 요구
	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");
			
	}	

}

 

 

JSP 페이지 - testList.jsp, testView.jsp

<%@ page contentType="text/html; charset=UTF-8"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<%
	request.setCharacterEncoding("UTF-8"); 
	String cp = request.getContextPath(); 
%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
</head>
<body>

${message }

</body>
</html>

 

실행화면 

 

 

 

 


Annotation을 이용한 매핑방법

dispatcher-servlet.xml

<!-- 어노테이션 사용 -->
<context:component-scan base-package="*" scoped-proxy="no"/>

<!-- 어노테이션을 이용한 컨트롤러 등록 -->
<bean class="org.springframework.web.servlet.mvc.annotation.DefaultAnnotationHandlerMapping"
	p:alwaysUseFullPath="true"> 
	<property name="order" value="1"/>
</bean>

* alwaysUseFullPath란?

spring/ ... / a.action  => 이런 주소라고 쳤을 때 ... 부분 : 즉 중간주소까지 다 입력하겠다 하면 true (대부분 true이다)

 

 

dispatcher-servlet.xml에서 일일이 bean객체 생성, 또는 주소창에 대해 mapping 시켜주던 작업을 하지 않고, annotation을 이용해보자

mapping작업 -> @RequestMapping 로 대체

클래스 객체 생성 -> @Controller 로 대체

 

MainController.java

package com.anno;

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;

// 충돌이 일어날 수도 있으므로 보통 이렇게 작성
// @Controller("main.mainController") 패키지명.mainController  
@Controller 
@RequestMapping(value="/main.action")
public class MainController{
	// 주소창에 /main.action 이 오면 MainController로 와라
	
	//get? post? 어떤 방식으로 온건지 검사해서 GET방식일 때 method()를 실행
	@RequestMapping(method=RequestMethod.GET)
	public String method() {
		
		//main.jsp 띄워라
		return "/main"; 
	}
	
}

 

 

'Spring 2.5' 카테고리의 다른 글

JDK 버전 바꾸기  (0) 2019.12.16
[Spring] 파일 업로드/다운로드  (0) 2019.10.29