2011-12-01 11 views
6

Studiuję Spring 3 i używam go w prostej aplikacji internetowej.Zakodowany na stałe @RequestMapping URL w Spring MVC Controller

Teraz wdrażam Spring Controller MVC za pomocą adnotacji i zastanawiam się: Czy jest jakaś najlepsza praktyka przy użyciu adnotacji @RequestMapping?

mam na myśli: Widziałem, że zwykle URL odwzorowywane w tej adnotacji jest ustalony w klasie ...
Czy istnieje sposób, aby przekazać URL w „sposób luźno” (w celu uzyskania bardziej klasa wielokrotnego użytku)?

Wiem, że istnieje kilka dzikie karty, które mogą być używane, ale myślę, że to nie jest rozwiązanie ... Czy jestem w błędzie?

EDIT:

dodam przykład, aby lepiej wyjaśnić moje wątpliwości.

Załóżmy, że chcę, aby mój kontroler był uruchamiany przez żądanie do /foo/bar/baz/mypage.htm, w moim kontrolerze metoda obsługi będzie opatrzona przypisami z @RequestMapping("/foo/bar/baz/mypage").

Teraz decyduję się zmienić adres URL wyzwalający mój kontroler na /foo/bar/otherpage.htm, więc muszę edytować moją klasę, umieścić @RequestMapping("/foo/bar/otherpage") na mojej metodzie obsługi, ponownie skompilować projekt i wdrożyć go ponownie.

Wydaje mi nie tak praktyczne ...

+0

Co oznacza adres dynamiczny? Zbudowany w czasie wykonywania? W twoim kodzie java? – soulcheck

+0

@soulcheck Przepraszam ... "Dynamiczny" to nie jest właściwe słowo ... Mam na myśli przekazanie adresu URL do adnotacji bez zakodowania go w klasie. Mogę powiedzieć w sposób "luźno sprzężony". (Edytowałem wpis) – davioooh

+0

@David C .: Dlaczego chcesz to zrobić. - "Czy jest jakaś najlepsza praktyka ..." Zapytałem, ponieważ najlepsza praktyka jest zawsze umotywowana z konkretnego powodu. – Ralph

Odpowiedz

5

Obecnie adnotacją kontrolery nie są bardzo konfigurowalny.

O ile mi wiadomo, jedynym możliwym podejściem do tego problemu jest użycie alternatywy HandlerMappings w celu skonfigurowania "podstawowych adresów URL" kontrolerów. Na przykład:

// Note the absense of @Controller to prevent this controller 
// from being discovered by DefaultAnnotationHandlerMapping 
public class FooController { 
    @RequestMapping("/list") public String list(...) { ... } 
    @ReqeustMapping("/save") public String save(...) { ... } 
} 

.

<bean 
    class = "org.springframework.web.servlet.mvc.support.ControllerBeanNameHandlerMapping" /> 

<bean name = "/foo" class = "FooController" /> 
<bean name = "/bar" class = "FooController" /> 

W tym przykładzie dwie instancje FooController obsługi /foo/list, /foo/save, /bar/list i /bar/save odpowiednio.

Nadchodzące Spring 3.1 będzie miało ulepszoną architekturę Spring 3.1 (Spring 3.1 M2: Spring MVC Enhancements), która wydaje się bardziej elastyczna, chociaż jeszcze jej nie sprawdziłem.

+0

Wiosna 3.1 M2: Ulepszenia Spring MVC - przeniesiono do https://spring.io/blog/2011/06/13/spring-3-1-m2-spring-mvc-plancements –

+0

Prawdopodobnie nie jest to wspierane od wiosny 3.1 –

0

Uważam, że nie jest to najlepsza praktyka, ale czy wypróbowałeś adnotacje @PathVariable?

@RequestMapping(value="/path/{word}", method=RequestMethod.GET) 
public ModelAndView myRestMethod(@PathVariable String word) { 
    ... 
} 
+0

Dziękuję za sugestie, ale to nie pasuje do mojego problemu ... :) – davioooh

1

Myślę, że próbujesz rozwiązać zły problem. Jeśli chcesz zmienić strony, które pasowały do ​​kontrolera, musisz gdzieś zmienić plik. Czy wolisz zmienić plik z podanym poniżej kodem, lub wolisz pracować z plikami XML, które określają adres URL i klasę, a następnie musisz się martwić, że plik jest we właściwym miejscu w czasie wykonywania?

Tak jak powinno być almost no code in your controller, powinieneś pomyśleć o swoich kontrolerach jako kompilowanych plikach konfiguracyjnych.Ponadto, jeśli używasz systemu kompilacji, takiego jak Maven lub Ant i nie kompilujesz pojedynczych plików ręcznie przy użyciu Javac, to czas kompilacji nie powinien być problemem. Jeśli to się stanie, prawdopodobnie nadszedł czas, aby podzielić projekt na podprojekty.

Myślę, że powinieneś to po prostu zaakceptować i zobaczyć, że prawdopodobnie nie jest to problem, który Twoim zdaniem jest. Czy wiesz, że kontrolery mogą pasować do wyrażeń, a nie tylko literałów? To daje ci pewną elastyczność w nazewnictwie.

Jeśli naprawdę chcesz, możesz po prostu wrócić do Spring 2.0 style XML configuration, ale nie sądzę, że ktoś by to polecił.

Powiązane problemy