용도에 따른 Controller 클래스 분류
AbstractController 를 이용한 컨트롤러 구현
AbstractCommandController 를 이용한 파라미터 처리
요청 파라미터를 특정한 객체에 담고 싶을 때 사용된다. AbstractCommentController 는 지정한 커맨드 클래스의 객체를
생성한 뒤, 커맨드 객체의 프로퍼티 이름과 일치하는 이름을 갖는 파라미터 값을 프로퍼티로 설정한다.
http://localhost:9090/springmvc/list.do?bbsId=utsman&pageNo=2&keyword=hi 와 같이 호출한다고 하면,
지정한 ListCommand 클래스에 파라미터가 매핑되어서 출력되는 결과를 볼 수 있다.
단순처리: Controller / AbstractController
별도 기능을 제공하지 않는 컨트롤러, 요청 파라미터 처리 등의 작업을 직접 구현해 주어야 한다.
파라미터 매핑: AbstractCommandController
요청 파라미터를 객체에 저장해주며, 파라미터 값 검증 기능을 제공한다.
입력 폼 처리: SimpleFormController
폼을 출력하고 폼에 입력한 데이터를 처리할 때 사용된다.
다중 페이지 입력 폼 처리: AbstractWizardFormController
여러 페이지에 걸쳐서 데이터를 입력하는 경우, 입력 폼의 흐름을 제어하고 입력한 데이터를 처리할 때 사용된다.
정적 뷰 매핑: ParameterizableViewController / UrlFileNameViewController
컨트롤러에서 어떤 기능도 수행하지 않고, 단순히 클라이언트의 요청을 뷰로 전달할때 사용한다.
다중 액션: MultiActionController
연관되거나 비슷한 로직을 수행하는 다수의 기능을 하나의 컨트롤러에서 구현할 때 사용한다.
별도 기능을 제공하지 않는 컨트롤러, 요청 파라미터 처리 등의 작업을 직접 구현해 주어야 한다.
파라미터 매핑: AbstractCommandController
요청 파라미터를 객체에 저장해주며, 파라미터 값 검증 기능을 제공한다.
입력 폼 처리: SimpleFormController
폼을 출력하고 폼에 입력한 데이터를 처리할 때 사용된다.
다중 페이지 입력 폼 처리: AbstractWizardFormController
여러 페이지에 걸쳐서 데이터를 입력하는 경우, 입력 폼의 흐름을 제어하고 입력한 데이터를 처리할 때 사용된다.
정적 뷰 매핑: ParameterizableViewController / UrlFileNameViewController
컨트롤러에서 어떤 기능도 수행하지 않고, 단순히 클라이언트의 요청을 뷰로 전달할때 사용한다.
다중 액션: MultiActionController
연관되거나 비슷한 로직을 수행하는 다수의 기능을 하나의 컨트롤러에서 구현할 때 사용한다.
AbstractController 를 이용한 컨트롤러 구현
public class SomeController extends AbstractController{
@Override
protected ModelAndView handleRequestInternal(HttpServletRequest request, HttpServletResponse response) throws Exception {
ModelAndView mav = new ModelAndView();
mav.setViewName("some");
// mav.addObject(...);
return mav;
}
}
@Override
protected ModelAndView handleRequestInternal(HttpServletRequest request, HttpServletResponse response) throws Exception {
ModelAndView mav = new ModelAndView();
mav.setViewName("some");
// mav.addObject(...);
return mav;
}
}
AbstractCommandController 를 이용한 파라미터 처리
요청 파라미터를 특정한 객체에 담고 싶을 때 사용된다. AbstractCommentController 는 지정한 커맨드 클래스의 객체를
생성한 뒤, 커맨드 객체의 프로퍼티 이름과 일치하는 이름을 갖는 파라미터 값을 프로퍼티로 설정한다.
dispatcher-servlet.xml
<bean id="viewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<property name="prefix" value="/WEB-INF/view/"></property>
<property name="suffix" value=".jsp"></property>
</bean>
<bean name="/list.do" class="net.utsman.spring.controller.ListController"/>
<bean id="viewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<property name="prefix" value="/WEB-INF/view/"></property>
<property name="suffix" value=".jsp"></property>
</bean>
<bean name="/list.do" class="net.utsman.spring.controller.ListController"/>
ListController.java
public class ListController extends AbstractCommandController {
public ListController() {
// TODO Auto-generated constructor stub
setCommandClass(ListCommand.class);
setCommandName("listCommand");
}
@Override
protected ModelAndView handle(HttpServletRequest request,
HttpServletResponse response, Object command, BindException errors)
throws Exception {
ListCommand listCommand = (ListCommand)command;
ModelAndView mav = new ModelAndView();
mav.setViewName("list");
mav.addObject("listCommand", listCommand);
return mav;
}
}
public class ListController extends AbstractCommandController {
public ListController() {
// TODO Auto-generated constructor stub
setCommandClass(ListCommand.class);
setCommandName("listCommand");
}
@Override
protected ModelAndView handle(HttpServletRequest request,
HttpServletResponse response, Object command, BindException errors)
throws Exception {
ListCommand listCommand = (ListCommand)command;
ModelAndView mav = new ModelAndView();
mav.setViewName("list");
mav.addObject("listCommand", listCommand);
return mav;
}
}
ListCommand.java
public class ListCommand {
private String bbsId;
private int pageNo;
private String keyword;
public String getBbsId() {
return bbsId;
}
public void setBbsId(String bbsId) {
this.bbsId = bbsId;
}
public int getPageNo() {
return pageNo;
}
public void setPageNo(int pageNo) {
this.pageNo = pageNo;
}
public String getKeyword() {
return keyword;
}
public void setKeyword(String keyword) {
this.keyword = keyword;
}
}
public class ListCommand {
private String bbsId;
private int pageNo;
private String keyword;
public String getBbsId() {
return bbsId;
}
public void setBbsId(String bbsId) {
this.bbsId = bbsId;
}
public int getPageNo() {
return pageNo;
}
public void setPageNo(int pageNo) {
this.pageNo = pageNo;
}
public String getKeyword() {
return keyword;
}
public void setKeyword(String keyword) {
this.keyword = keyword;
}
}
list.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"%>
bbsId[${listCommand.bbsId }]<br/>
pageNo[${listCommand.pageNo }]<br/>
keyword[${listCommand.keyword }]<br/>
<%@ page language="java" contentType="text/html; charset=UTF-8"%>
bbsId[${listCommand.bbsId }]<br/>
pageNo[${listCommand.pageNo }]<br/>
keyword[${listCommand.keyword }]<br/>
http://localhost:9090/springmvc/list.do?bbsId=utsman&pageNo=2&keyword=hi 와 같이 호출한다고 하면,
지정한 ListCommand 클래스에 파라미터가 매핑되어서 출력되는 결과를 볼 수 있다.
포스팅에 사용된 예제 소스 보기[서브 버전]
http://zeehastory.googlecode.com/svn/trunk/springmvc
참고 문헌 (공부를 목적으로 책의 내용과 거의 동일하게 옮김을 밝힙니다.)
http://static.springframework.org/spring/docs/2.5.x/reference/introduction.html
최범균의 Spring 2.5 프로그래밍