본문 바로가기

nerv-team.co.kr

[Spring] nerv-team.co.kr "MutilActionController" CH03.특정파라미터값

전에 했던 것은 기본 Controller 을 구현 하는 것으로 썼는데.. 이번엔 MuiltiActionController 를 사용하여 써 보겠습니다.
갑자기 쌩뚱맞게 MultiActionController 쓰는 이유는 Antop 이 예전에
 http://주소:포트번호/응용프로그래명/주소.do 로 프로그램이 불뤼어 졌을때 뒤에 파라미터를 붙여서
http://주소:포트번호/응용프로그래명/주소.do?파미터타입=파라미터  이렇게 주어졌을때 각각 불뤼어 지는건 어떻게 하냐는 요청이 들어왔었기 때문에 요구사항을 접수하여 미리 포스팅 하도록 하겠습니다 ^^
 
http://host/aaa.do?mode=in
http://host/aaa.do?mode=out

위의 형태로 mode 값이 in 일때 불뤼는 메소드 따로, out 일때 불뤼는 메소드 따로 사용할지를 선택이 가능하도록 합니다.
이해가.. 되나요?~ ^^;;;


MultiActionController 에 대한 기본 지식 개념은 url 을 붙여 넣겠습니다. 참고하세요~
(url : http://openframework.or.kr/framework_reference/spring/ver1.2.2/html_single/#mvc-controller-multiaction )


MultiActionController

위의 박스내용과 같이 특정 파라미터 값에 따라서 다른 기능을 구현해야 할 때, MultiActionControlle 클래스를 상속받아 컨트롤러 클래스를 구현합니다. (상속받습니다!!! 상속! extends 입니다. Controller 처럼 implements 해서 쓰는것이 아니라, 상속!! 입니다 ^^) MuiltiActionController 클래스는 특정파라미터의 값이나 URL 등을 이용해서 다음과 같은 형식의 메서드를 호출해서 클라이언트의 요청을 처리합니다.

public [ModelAndView | Map | void ] 메서드이름 ( HttpServletRequest request, HttpServletResponse response)

public [ModelAndView | Map | void ] 메서드 이름
                      ( HttpServletRequest request, HttpServletResponse response
                         [HttpSession session | SomeCommand commandObject] )


********* 규칙 !!!!! **************
1. 리턴타입은 ModelAndView, Map, void 중의 하나여야 합니다.
2. 첫번째 파라미터와 두번째 파라미터는 반드시 request, response 여야 합니다.
3. 세번째 파라미터는 선택적으로 지정할 수 있으며 HttpSession 이거나 커맨드 객체로 사용할 클래스여야 한다
    (nerv 의 예전의 kdbrace 응용프로그램에선 command vo 라고 했었는데.. 기억 할랑가 모르겠네요 ^^ )
4. 세번째 파라미터가 HttpSession 인 경우에는 메서드가 호출될 때 반드시 request 와 관련된 HttpSession 인스턴스가 존재해야 합니다. 그렇지 않을경우 ServletException 을 발생시킵니다.



일단 http://joke00.tistory.com/107 에서 Shop.war 파일을 다운 받아 이클립스에 개발가능 하도록 합니다. 기존 되있던 것에서 메소드를 주어 바뀌는 것을 보여 드리겠습니다. ^^


전,
http://localhost:5555/Shop/index.do?method=list
http://localhost:5555/Shop/index.do?method=test

이렇게 2개를 해 보겠습니다. 여기서 method ParameterMethodNameResolver 의 paramName 의 value 이구요 (이 value 는 본인이 쓰고 싶은거 쓰시면 됩니다. 프로퍼티의 name 은 꼭 paramName 과 defaultMethodName 는 꼭 지켜주셔야 합니다) list 와 test 는 불뤼어질 메소드 이름입니다.

1. servlet.xml 파일 변경
* shop-servlet,xml

<!--  url  -->
 <bean id="bbsMethodNameResolver"  class="org.springframework.web.servlet.mvc.multiaction.ParameterMethodNameResolver">
  <property name="paramName" value="method"></property>
  <property name="defaultMethodName">
    <value>list</value>
  </property>
 </bean>


<!-- java bean mapping -->
 <bean id="indexController" class="controller.IndexController">
  <property name="itemCatalog"><ref bean="itemCatalog"/></property>
  <property name="methodNameResolver"><ref  local="bbsMethodNameResolver" /></property>
 </bean>

위와 같이 method 로 주게 되구요 defaulMethodName 으로 인하여 기본 적으로 파라미터 값이 없을때 불뤼어질 기본 parameter 를 설정해 줍니다. 이렇게 되면 http://localhost:5555/Shop/index.dohttp://localhost:5555/Shop/index.do?method=list 는 똑같은 것이 불뤼어 지게 되겠지요?! ^^

그리고  controller 에 맵핑 시켜 줍니다. property 의 name 은 반드시 methodNameResolver 로 써야 합니다. 아니면 에러를 뿜는답니다~ -0-/////


2. controller 변경

list 메소드와 test 메소드를 만듭니다. 단순 테스터라 간단하게만 페이지 전환으로 보여드리겠습니다.
list 로 파라미터 값이 불뤼어 졌을때엔 index.jsp 로 가게 될 것이고, test 로 불뤼어 지면 test.jsp 로 가게 되겠지요~ ^^

[New]- [Others..] 를 눌러 jsp 를 선택한 후 test.jsp 를 하나 생성하도록 합니다 ^^



* IndexController.java

package controller;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

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

import logic.Item;

import org.springframework.web.servlet.ModelAndView;
import org.springframework.web.servlet.mvc.multiaction.MultiActionController;

import service.ItemCatalog;

public class IndexController extends MultiActionController {
 private ItemCatalog itemCatalog;

 public void setItemCatalog(ItemCatalog itemCatalog) {
  this.itemCatalog = itemCatalog;
 }

 // public ModelAndView handleRequest(HttpServletRequest request,
 public ModelAndView list(HttpServletRequest request,
   HttpServletResponse response) throws Exception {
  System.out.println("---------- list ----------------------");
  // 상품리스트 정보 취득
  List<Item> itemList = this.itemCatalog.getItemList();
  // 모델작성
  Map model = new HashMap();
  model.put("itemList", itemList);
  // 반환값이 되는 ModelAndView 인스턴스작성
  ModelAndView mav = new ModelAndView();
  mav.setViewName("index");
  mav.addAllObjects(model);
  return mav;
 }

 public ModelAndView test(HttpServletRequest request,
   HttpServletResponse response) throws Exception {
  System.out.println("---------- testesteste----------------");
  ModelAndView mav = new ModelAndView();
  mav.setViewName("test");
  return mav;
 }
}




설정이 모두 끝났습니다. 이제 테스트를 해 보아야죠~

1. http://localhost:5555/Shop/index.do?method=list



 *** 콘솔에 찍힌 로그 입니다


2. http://localhost:5555/Shop/index.do?method=test



 *** 콘솔에 찍힌 로그입니다 ^^


테스트에 모두 성공 하셨나요? -0-
MultiActionContrller 를 이용할 경우엔 무분별한 Controller 남발이 없어서 편리하겠군요~ ^^
파라미터 값과 메소드 이름을 항상 일치시켜야 한다는 사실~ 잊지마세요!!!! ^-^
파라미터 값을 가지고 메소드를 찾으니깐요~

그럼 다음에도 또 보아요~


용자님께서는 알아서 테스트를~ ^^

db : oracle 10g
was : tomcat 6
java : jdk 1.6