블로그 이미지
Max.

calendar

          1 2
3 4 5 6 7 8 9
10 11 12 13 14 15 16
17 18 19 20 21 22 23
24 25 26 27 28 29 30
31            

Notice

2008. 3. 10. 17:51 이전글(~2009)

Spring 2.5에서는 annotation이 강화 되었다. 특히 SpringMVC는 상당히 많은 변화가 있다.
(POJO 기반의 Controller작성이 가능한)  아래 예제처럼 말이다.

Controller

@Controller
public class ChargeTableController  {

 @Autowired
 public ChargeFacade chargeFacade;

 @RequestMapping("/charge/chargeTableList.do")
 public String chargeTableList(ModelMap model, HttpServletRequest request){
  int currentPage = ServletRequestUtils.getIntParameter(request, "currentPage", 0);
  int countPerPage = ServletRequestUtils.getIntParameter(request, "countPerPage", 10);
 
  ChargeTableResult result = chargeFacade.chargeTableList(currentPage, countPerPage);
  model.addAttribute("result", result );
return "/charge/chargeTableList";
 .......

그래서 본격적으로 프로젝트 기본 템플릿을 만들기로 했다. 그러나 템플릿 예제를 만들던중 문제가 생겼다.  문제는 이렇다.

보통 어떤 행위가 없는(텅빈) Controller를 만들어 SimpleUrlHandlerMapping에 매핑해야 할때가 있다. 요청하는 행위가 단순히  Spring DispatcherServlet통해서 html이나 jsp를 매핑만 시켜주는 행위만 필요하다면 편리하게 처리하는 방법이 있다. 바로 UrlFilenameViewController 이다. 보통 아래와 같이 사용한다.

    <bean id="urlFilenameViewController" class="org.springframework.web.servlet.mvc.UrlFilenameViewController" />

 <bean id="urlMapping" class="org.springframework.web.servlet.handler.SimpleUrlHandlerMapping">
  <property name="mappings">
       <props>
       <prop key="*.html">urlFilenameViewController</prop>     
       </props>
   </property>
 </bean>


이렇게 설정만 하면 수많은 html,jsp파일을 Controller없이 매핑 시킬수 있다.

그런데 Spring2.5의 Annotation기반으로 SpringMVC를 사용하면 위와 같은 설정이 안먹힌다.
포럼에도 이것 때문에 삽질한(나를포함) 사람들이 좀 있는것 같다.
왜그럴까? 하고 고민하고 학습 해야하는데 못했다.-_-;
그러나 해결방법은 간단하다. DefaultAnnotationHandlerMapping을 추가해 주면된다.

    <bean id="urlFilenameViewController" class="org.springframework.web.servlet.mvc.UrlFilenameViewController" />
 <bean id="annotationMapper" class="org.springframework.web.servlet.mvc.annotation.DefaultAnnotationHandlerMapping">
   <property name="order" value="2" />
</bean>
 <bean id="urlMapping" class="org.springframework.web.servlet.handler.SimpleUrlHandlerMapping">
  <property name="mappings">
       <props>
       <prop key="*.html">urlFilenameViewController</prop>     
       </props>
   </property>
  <property name="order" value="1" />
 </bean>

만약 Mapping 순서를 정하고 싶을때 order 속성으로 우선순위를 정할 수 있다.
posted by Max.

댓글을 달아 주세요

  1. 모든 HandlerMapping에는 순서를 정하는 것도 가능합니다. order 속성을 이용해서 순서를 지정하게 되면 지정한 순서에 따라서 Mapping을 합니다. 두개의 HandlerMapping을 사용하는 예제라 order 속성까지 포함되어 있으면 더 좋을거 같아서 말씀 드립니다.

    이미 알고 계실 듯..

  2. 전 그냥 더미 컨트롤을 만들었을겁니다.--;
    컨트롤에서도 어노테이션을 쓰셨는데, 구지 HttpServletRequest 를 받아서 쓰신 이유는 무얼까요? 저희는 그냥 예제대로 @RequestParam을 쓰는데요. 물론 대부분 @ModelAttribute로 처지하지만요. 요즘 생각에는 너무 편하게 쓰는게 아닌가 하는 생각도 들고 있습니다.

    • Favicon of http://yunsunghan.tistory.com BlogIcon Max 2008.03.13 08:43  Addr Edit/Del

      소내기님 말씀처럼
      너무 편해지는게 좋기도 하지만, 약간 두렵기도 하네요.
      그래서 기초를 강조하고, 원리나 철학을 먼저 이해하라는 말이 나오나 봅니다. ^^*
      반갑습니다. 소내기님!

  3. 답글달아주셔서 감사. 꾸준히 구독하고 있는 독자였습니다~~~~

    • Favicon of http://yunsunghan.tistory.com BlogIcon Max 2008.03.14 09:02  Addr Edit/Del

      네.. 반가워요~
      언제 한번 Offline으로 만나뵙고 싶어요..
      (말은 잘 안하지만, 사람 만나는걸 좋아합니다. ^^;; )

  4. Favicon of http://anarch.tistory.com BlogIcon anarch 2008.03.13 14:13  Addr Edit/Del Reply

    Ordered interface을 구현하는 객체는 아마 순서를 지정할수 있는 듯 하더군요. Handling말고도...
    좋은 글 잘 읽었습니다. :-)

    • Favicon of http://yunsunghan.tistory.com BlogIcon Max 2008.03.14 09:11  Addr Edit/Del

      anarch님 반갑습니다.(잘 읽었다니 감사하네요.)
      최근에 Annotation을 배울려고 노력하고 있는데 anarch님 블로그에 spring2.5에 관한 글이 있네요.
      앞으로 잘 볼께요 ^^*