2012-05-14 27 views
1

有關類型級別通配符請求映射和從void和域對象返回派生的Springs邏輯視圖名稱的問題。說我有以下Spring 3.1類型級別RequestMapping和邏輯視圖名稱

@Controller 
class HomeController 
{ 
    @RequestMapping(value="/") 
    public void index() {} 
} 

我的如何泉邏輯視圖名稱生成的理解是,上述控制器將映射「/」到邏輯視圖名稱「索引」,我然後可以,例如,使用Apache瓷磚匹配一個適當的jsp視圖。

同樣,這說明我的溫泉邏輯視圖名稱創建的理解(但我覺得我失去了一些東西......)

@Controller 
@RequestMapping("/collection/*") 
class CollectionController 
{ 

    @Autowired 
    private SomeService someService; 

    @RequestMapping(method=RequestMethod.GET) 
    public List<Item> list() 
    { 
     // in my understanding 
     // itemList should be available in the model (via generated name), 
     // that the logical view name generated should be 
     // collection/list and that this method 
     // would intercept the url "/collection/" or "/collection" 
     return someService.getItems(); 
    } 

    @RequestMapping("/{itemId}") 
    public Item item (@PathVariable final String itemId) 
    { 
     // similiarly, item should be available in the 
     // model and the logical view name should be 
     // collection/item 
     return someService.getItem(itemId); 
    } 
} 

事情是,是該列表方法不會被解析爲「索引「集合的頁面 - 相反,邏輯視圖名稱似乎是」集合「(我沒有定義 - 我希望邏輯視圖名稱爲」集合/列表「。」項目「方法的作品 - 它只是索引頁沒有 - 爲模糊的問題感到抱歉 - 不知道該怎麼說 -

我如何利用Springs邏輯視圖名稱生成fr om方法名稱基於類型級別的通配符url而不返回字符串來定義邏輯視圖名稱?以上所述不符合我的預期。我錯過了什麼?

UPDATE:

@Configuration 
@EnableWebMvc 
public class WebConfig extends WebMvcConfigurerAdapter 
{ 

    static private String [] TILES_DEFINITIONS= new String [] { "/WEB-INF/layouts/tiles.xml", "/WEB-INF/views/**/tiles.xml"}; 

    /* static resource resolution */ 
    @Override 
    public void addResourceHandlers(ResourceHandlerRegistry registry) 
    { 
     registry.addResourceHandler("/resources/**").addResourceLocations("/resources/"); 
    } 

    /** 
    * ViewResolver configuration required to work with Tiles2-based views. 
    */ 
    @Bean 
    public ViewResolver viewResolver() 
    { 
     UrlBasedViewResolver viewResolver= new UrlBasedViewResolver(); 
     viewResolver.setViewClass(TilesView.class); 
     return viewResolver; 
    } 

    /** 
    * Configures Tiles at application startup. 
    */ 
    @Bean 
    public TilesConfigurer tilesConfigurer() 
    { 
     final TilesConfigurer configurer= new TilesConfigurer(); 
     configurer.setDefinitions(TILES_DEFINITIONS); 
     configurer.setCheckRefresh(true); 
     return configurer; 
    } 
} 

我的瓷磚文件夾結構

src/main/webapp/layouts (contains base page.jsp) 

src/main/webapp/views/[VIEWNAME]/tiles.xml 

viewname表示視圖名稱(對不起!),並查看的路徑該視圖名稱在該文件夾tiles.xml中定義。希望讓事情更清晰......

+0

能否請你告訴您如何配置視圖解析器來呈現你的看法。看到我能回答一些問題。 –

+0

你去日本了 - 希望有幫助,謝謝! – VLostBoy

回答

0

如果我的理解是否正確,您的列表法爲迴應能夠拿到的/集,並且要利用默認視圖名稱解析的,但希望有一個視圖名稱,其與默認解決方案不同 -

默認分辨率基於請求發送到的HTTP路徑(在您的情況下爲/collections),並且視圖將爲collections(如果GET請求已發送)到/collections/list,您的視圖名稱應該是collections/list。有關規則的更多信息,您可以查看DefaultRequestToViewNameTranslator的API。

但在您的情況下,您希望將發送到/collections的請求解析爲collections/list視圖名稱。

我只能看到一個這樣做的方式 - 明確地從該方法返回視圖名稱return "collections/list";

你可以嘗試編寫自定義RequestToViewNameTranslator,但傳遞給參數是HttpRequest中,你不能獲得很大從它,建立像你正在尋找的東西。

+0

謝謝Biju-我開始懷疑這麼多。僅僅爲了澄清,列表方法只是簡單地使用RequestMethod.GET註釋,將生成邏輯視圖名稱「campaigns」,方法名稱「list」不會影響邏輯視圖名稱,除非我明確返回字符串「collections /列表「或ModelAndView with viewName設置爲」collections/list「...對嗎? – VLostBoy

+0

是的,那是對的。該方法會響應GETS到'/ collections/*'('/ collections',''/ collections/list'等)。你可以返回一個'collections/list'字符串,就像你說的,或者一個ModelAndView和viewName設置爲'collections/list' –