2011-05-10 7 views
9

Bu, this question'a benzer, ancak durumum hakkında hala kafam karıştı. Bir kontrolör yöntemine bu karınca tarzı desen eşlemek istediğiniz: isSpring's @RequestMapping öğelerini joker karakterlerle kullanma

/results/** 

, ben www.hostname.com/MyServlet/results/123/abc/456/def/ gibi herhangi bir URL bu yönteme gitmek istiyorum. Ben:

<servlet-mapping> 
    <servlet-name>MyServlet</servlet-name> 
    <url-pattern>/results/*</url-pattern> 
</servlet-mapping> 

ve:

@RequestMapping(value="/**", method=RequestMethod.GET) 
public ModelAndView handleRequest() {...} 

Bu benim yöntemine isteği rehberlik çalışır, ancak beni götürür birkaç sorulara:

  1. Ne başka servlet eşleme eklerseniz, <url-pattern>/another-mapping/*</url-pattern> ??? Aynı zamanda bu yönteme eşlenecek! İkisini nasıl ayırabilirim?
  2. Neden /results/* url-pattern'i çalışıyor, /results/** ise çalışmıyor? Karınca stiline göre, ** iç içe geçmiş / karakterlerini içerirken, * sonraki / durur. Dolayısıyla, yalnızca /results/123, bot NOT /results/123/abc/ gibi bir URL'yi başarıyla eşleştirmelidir. Sağ?
+0

Sadece bu konuda bir ödül başlattı. İlk yanıttaki yorumlarıma bak ... –

cevap

5

Ne başka servlet eşleme, eklerseniz başka-haritalama/gibi/* ??? Aynı zamanda bu yönteme eşlenecek! İkisini nasıl ayırabilirim?

Geçerli yapılandırmanız ile yapamazsınız. DispatcherServlet'u birden çok URL modeliyle eşlemek ve aralarında ayrım yapmak isterseniz, DefaultAnnotationHandlerMapping numaralı telefonu alwaysUseFullPath = "true" ile bildirebilir ve @RequestMapping numaralı telefondan tam yolu kullanabilirsiniz.

Alternatif olarak, <url-pattern>/*</url-pattern> olarak DispatcherServlet harita ve DefaultAnnotationHandlerMapping yeniden yapılandırmadan @RequestMapping tam yolunu kullanabilir. Bu durumda, configre exclusions for static content'a ihtiyacınız olacak.

Neden url desenli/sonuçları/* iş, oysa/sonuçların/** değil ki? Karınca stiline göre, ** iç içe/karakterleri içerecek şekilde iken, * sonraki/sonraki satırlarda durur. Dolayısıyla, yalnızca/results/123, bot NOT/results/123/abc/gibi bir URL'yi başarıyla eşleştirmelidir. Sağ? Sadece .../* ve *.xxx joker kendilerine izin verilir, böylece web.xml yılında

URL modelleri, karınca tarzı desenler değildir.

+0

Tamam, bu yüzden DefaultAnnotationHandlerMapping bean'ma ekledim. @RequestMapping değeri ne olmalıdır? Üzgünüm, bu konuda yeniyim ... –

+0

@Tony: '/ results/**' olmalıdır. – axtavt

+0

Tamam, bunu denedim ve alıyorum: "Servlet isteği için eşleşen işleyici yöntemi bulunamadı: yol '/ abc/123'" –

6

Belki de sunucu haritalandırmanızda tüm trafiği '/ *' ye yönlendirmek isteyebilirsiniz. Bu şekilde, denetleyicinizde farklı @ RequestMapping'lerle hangi yöntemi kullanacağınızı ayırt edebilirsiniz.

<servlet-mapping> 
    <servlet-name>MyServlet</servlet-name> 
    <url-pattern>/*</url-pattern> 
</servlet-mapping> 

ve

@RequestMapping(value="/results/**", method=RequestMethod.GET) 
public ModelAndView handleResults() {...} 

@RequestMapping(value="/another-mapping/**", method=RequestMethod.GET) 
public ModelAndView handleAnotherMapping() {...} 

Umarım yukarıda Bildiğim kadarıyla 2 numara konusunda, gidip özellikle (eğer 'karınca tarzı' desen matchers kullanabilirsiniz sanmıyorum sayı 1 ile yardımcı olacaktır **) web.xml alan adı tanımlayıcınız.

+0

Hmm tamam, Ant stili kullandığını okumuştum sanıyordum, ama sanırım yanılmışım. So/* iç içe/abc/123/....... karşılık gelir. –