2010-01-19 7 views
2

URL /modules/tips/SOME_ID/small을 매핑하여 ID가 ​​SOME_ID 인 팁에 액세스하고 뷰 small.jsp을 사용하여 렌더링합니다. 다음 코드는 위와 같이 작동하지만 두 자리에서 modules/tips 문자열을 반복해야합니다. 스프링 MVC는 내가 결정할 수있는 컨벤션이없는 것 같다. 상수를 사용하는 것 외에는이 반복을 줄이는 더 좋은 방법이 있습니까?Spring 3.0에서 경로를 두 번 반복하지 않음 MVC 편안한 매핑

@Controller 
public class TipsController{ 

    @RequestMapping(value="/modules/tips/{tipId}/{viewName}",method=RequestMethod.GET) 
    public ModelAndView get(
    @PathVariable String tipId, 
    @PathVariable String viewName) { 
    Tip tip = findTip(tipId); 
    return new ModelAndView("modules/tips/" + viewName,"tip",tip); 
    } 
} 
+0

위대한 질문을, 나는 같은 일을 찾고 여기에왔다. 요청 매핑과 RequestToViewNameTranslator가 서로 완전히 분리되어 있다는 것이 기괴합니다. –

답변

-1

클래스에 @requestMappings 주석을 추가 할 수 있습니다. 방법에 @RequestMapping 주석이에 다음 기준으로합니다 :

@Controller 
@RequestMapping(value="/modules/tips") 
public class TipsController{ 

    @RequestMapping(value="{tipId}/{viewName}",method=RequestMethod.GET) 
    public ModelAndView get(
     @PathVariable String tipId, 
     @PathVariable String viewName) { 
     Tip tip = findTip(tipId); 
     return new ModelAndView("modules/tips/" + viewName,"tip",tip); 
    } 
} 
+0

이 솔루션은 문자열 "모듈/팁"을 두 번 반복하지 않아도됩니다. 이 예에서 두 가지 이상의 메서드가있는 경우에만 필요성을 줄일 수 있습니다. – davetron5000

1

당신은 봄이 거의 어떤 빌드에 대한 지원을 제공 할 수 있도록 이름 매핑 로직도 "사용자 정의"를 보이는 볼 수 있습니다. Hovewer, 이론적 인 가능성으로, 사용자 정의 ModelAndViewResolver을 구현할 수에를 등록 AnnotationMethodHandlerAdapter

+1

처음에는 {viewName}을 생략하고 내 메서드에서 void를 반환했습니다. 그런 다음 Spring은 뷰 이름으로 매핑되지 않은 마지막 경로 요소를 사용하지만 내 JSP 계층 구조의 루트를 보았습니다. 내 진짜 문제라고 생각해. 내가 경로 사이에 병렬 구조를 원한다면 모든 위치에서보기가 가능하다. – davetron5000

+0

스프링이 기능을 제공하지는 않지만 axtavt의 아이디어를 뒷받침한다. –

0

당신은 단순히 한 귀하의 의견과 함께 일치로, 뷰 이름을 생략 할 노력하고 무엇을 할 수 귀하 URL 뷰 이름을 제공하지 않으면 Spring은 RequestToViewNameTranslator를 사용하여 뷰 이름을 찾습니다. 해당 클래스의 소스를 보면 정확히 작동하는 방식을 볼 수 있습니다. 다음은 문서의 좋은 견적입니다.

"요청 URL이 'http://localhost/registration.html'이면 DefaultRequestToViewNameTranslator에 의해 생성 된 '등록'의 논리적 뷰 이름이됩니다.이 논리적 뷰 이름은 다음과 같이 해결됩니다. InternalResourceViewResolver bean에 의한 '/WEB-INF/jsp/registration.jsp'보기. "

예를 들어, "/ modules/tips"를 처리하는 컨트롤러 메소드가 기본적으로 "modules/tips"라는보기를 사용하도록 만들 수 있습니다. 아마도 "/ WEB" -INF/jsp/modules/tips.jsp "를 참조하십시오.

http://static.springsource.org/spring/docs/3.0.x/spring-framework-reference/html/mvc.html#mvc-coc-r2vnt

편집 : 난 그냥 당신이보기 이름을 생략하려 고 말했다 것으로 나타났습니다, 그리고 그 일을 것처럼 보이지 않았다. RequestToViewNameTranslator의 구현을 직접 작성하고 DefaultRequestToViewNameTranslator를 사용자 정의 구현으로 대체 할 수 있습니다. 자신의 번역사 삽입 방법에 대해 문서를 확인하십시오.

0

당신이 modules/tips을 포함하도록 web.xml 파일에 <url-pattern> 요소를 변경하는 경우, 당신은 효과적으로 봄 바인딩 구성 모두에서 생략 할 수 있습니다 :

<servlet-mapping> 
     <servlet-name>spring-mvc</servlet-name> 
     <url-pattern>/myapp/modules/tips/*</url-pattern> 
</servlet-mapping> 


@RequestMapping(value="/{tipId}/{viewName}",method=RequestMethod.GET) 
public ModelAndView get(
    @PathVariable String tipId, 
    @PathVariable String viewName) { 
    Tip tip = findTip(tipId); 
    return new ModelAndView(viewName,"tip",tip); 
} 
관련 문제