2013-05-20 4 views
1

저는 상속 한 Spring 웹 애플리케이션을 가지고 있으며 현재 확장 중입니다. 나는 방대한 스프링 XML 파일과 리팩토링 프로세스를 통해 살았습니다. 결코 되돌아 오지 않을 시간입니다. 주석을 사용하여 새로운 컨트롤러 코드를 작성하기 시작했습니다.JSP에서 Spring MVC 매핑 (주석)을 참조하기위한 "우수 사례"가 있습니까?

RequestMappings이 주석으로 정의 된 컨트롤러가 있고 컨트롤러의 최종 정적으로 URL을 넣었으므로 코드의 다른 위치에서 반환 값으로 참조 할 수 있습니다. 그러나 JSP를 만들려고 할 때 모든 것이 벽에 부딪치게 보인다.

이렇게하려면 "가장 좋은"방법이 있습니까? (또는 어떤 식 으로든 전혀?) ...

는 ....

public class MyController { 
    /** 
    * Magic string that defines the base URL for this action 
    */ 
    public static final String BASE_URL = "/do_my_smart_action.do"; 
    /** 
    * Magic string defining parameter name 
    */ 
    public static final String PARAM_ID = "id"; 

... 

    @RequestMapping(value = BASE_URL, method = RequestMethod.GET) 
    public ModelAndView beginSmartAction(
     @RequestParam(required = false, value = PARAM_ID) Long id, 
     ModelMap model) { 

     // Do clever stuff 

     return new ModelAndView(TARGET_JSP_NAME, model); 
    } 

} 

을 설명하기 위해 및 URL 뭔가처럼 쓸 수 있도록 내 JSP에서 원하는

<a href="<${BASE_URL}?${PARAM_ID}=${object.id}">Do Smart Action</a> 

코드에서 BASE_URL의 정의를 변경하면 JSP의 링크가 "그냥 작동"하도록합니다.

기록을 위해 현재 Spring 3.0.6, Java 1.5 및 glassfish 3.1.2를 사용 중입니다. 전자는 비교적 쉽게 부딪 칠 수 있습니다. 자바 1.7로 이동하려고하면 이상한 일들이 코드와 함께 일어나는 것처럼 보이므로 이동이 더 문제가 될 수 있습니다.

감사의 말을 전합니다.

+0

내 자신의 질문에 부분적으로 대답 함 ... 자세한 조사 결과는 http://www.javaranch.com/journal/200601/Journal200601.jsp#a3이 보일만한 장소임을 나타냅니다. – Bignose

+0

1) @ Controller 주석을 사용하여 컨트롤러, XML 구성 필요 없음. 2)'ModelMap model'에서 key/value 쌍으로'BASE_URL'을 설정하지 않았습니다. 다른 ELparameters와 비슷하게 뷰에서 어떻게 접근 할 것으로 예상합니까? 항상 상수를 모델에 추가 할 메소드를 작성할 수 있습니다. 디자인 방법은 사용자에게 달려 있습니다. –

+0

1) 알고 있습니다. 저는 이것을 상속 받았으며 (다른 것들 사이에서) 주석을 사용하도록 efactoring했습니다. 2) 감사합니다. 여느 때와 마찬가지로, 핵심은 의문의 여지가 있습니다. 문제는 다른 사람이 주도하는 jsp에서이 컨트롤러를 연결하는 것입니다. 그래서 Bar 객체 집합을 포함하는 Foo 객체 (및 연관된 컨트롤러 및 JSP)가 있고 Foo JSP에서 Bar JSP로 연결하려고합니다.당신이 말한 바로는, _target_ 컨트롤러의 URL을 _source_ 컨트롤러의'ModelMap'에 추가하는 것입니다. – Bignose

답변

1

@ModelAttribute("baseUrl")으로 주석이 달린 메소드는 BASE_URL을 반환하며 ${baseUrl}으로 jsp에서 액세스 할 수있게 할 수 있습니다. 하지만이 컨트롤러를 통해 렌더링되는 페이지에서만 작동합니다. 다른 컨트롤러는 다른 ${baseUrl}을 가지므로 혼란스러워 할 것입니다.

나는 실제로 그렇게 할 필요가 없다고 생각합니다. URL을 JSP로 하드 코딩하는 것은 그다지 문제가되지 않습니다. 리펙토링하는 것이 쉽지는 않을 것입니다. (하지만 검색과 바꾸기는 여전히 쉽습니다.)

정말로 필요할 것 같으면 모든 URL 상수를 하나의 클래스로 추출 할 수 있습니다.이 클래스는 인터셉터 HandlerInterceptor이며 거기에서 모두 모델에 채울 수 있습니다. 예 :

public class ControllerUriPopulatingInterceptor implements HandlerInterceptor { 
    public void postHandle(
      HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView model) 
      throws Exception { 
    model.addAttribute("usersBaseUrl", USERS_BASE_URL); 
    model.addAttribute("articlesBaseUrl", ARTICLES_BASE_URL); 
    .... 

    } 

    ... 
} 

이 클래스에는 언젠가 수백 개의 상수가 포함됩니다. 장단점을 계산하고 필요 여부를 결정하십시오.