Spring 3.1 Type Level RequestMapping和逻辑视图名称

时间:2012-05-14 11:30:27

标签: java spring-mvc

有关类型级通配符请求映射和从void和域对象返回派生的Springs逻辑视图名称的问题。说我有以下

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

我对Springs逻辑视图名称生成的理解是上面的控制器将“/”映射到逻辑视图名称“index”,然后我可以使用Apache Tiles来匹配适当的jsp视图。

同样,这证明了我对Springs逻辑视图名称创建的理解(但我想我错过了一些东西......)

@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);
    }
}

事实是,list方法永远不会被解析为集合的“索引”页面 - 相反,逻辑视图名称似乎是“集合”(我没有定义 - 我希望逻辑视图名称是“集合/列表”。“项目”方法有效 - 只是索引页面没有 - 对于模糊的问题感到抱歉 - 不知道如何设置它 -

如何根据类型级别的通配符网址从方法名称生成Springs逻辑视图名称,而不返回字符串来定义逻辑视图名称?以上不符合我的预期。我错过了什么?

更新:

@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;
    }
}

我的tiles文件夹结构是

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

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

其中VIEWNAME是一个视图名称(抱歉!),该视图名称的视图路径在该文件夹tiles.xml中定义。希望能让事情更清楚......

1 个答案:

答案 0 :(得分:0)

如果我理解正确,你的list方法被设置为响应GET of / collections,你想利用默认的视图名称解析,但想要一个与默认解析的视图名称不同的视图名称 -

默认解析基于发送请求的http路径(在您的情况下为/collections),视图为collections,而是将GET请求发送到{{ 1}},您的视图名称应为/collections/list。您可以查看DefaultRequestToViewNameTranslator的API以获取有关规则的更多信息。

但是,在您的情况下,您希望将发送到collections/list的请求解析为/collections视图名称。

我只能看到一种方法 - 从方法collections/list显式返回视图名称

您可以尝试编写自定义的RequestToViewNameTranslator,但传递给的参数是httprequest,并且您无法从中获取太多内容,以构建您正在寻找的内容。