2

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

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

我对 Springs 逻辑视图名称生成方式的理解是,上面的控制器会将“/”映射到逻辑视图名称“索引”,然后我可以使用 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);
    }
}

问题是,列表方法永远不会被解析为集合的“索引”页面——相反,逻辑视图名称似乎是“集合”(我还没有定义——我希望逻辑视图名称是“集合/列表”。“项目”方法有效-只是索引页面没有-对含糊的问题感到抱歉-不知道该怎么说-

如何在类型级别上利用基于通配符 url 的方法名称生成 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;
    }
}

我的瓷砖文件夹结构是

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

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

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

4

1 回答 1

1

如果我理解正确,您的列表方法设置为响应 /collections 的 GET,并且您希望利用默认视图名称解析,但想要一个与默认解析的视图名称不同的视图名称 -

默认分辨率基于发送请求的 http 路径(在您的情况下/collections),并且视图将是collections,如果将 GET 请求发送到/collections/list,您的视图名称将是collections/list。您可以查看DefaultRequestToViewNameTranslator的 API 以了解有关规则的更多信息。

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

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

您可以尝试编写自定义 RequestToViewNameTranslator,但传递给的参数是 httprequest,您无法从中获得太多信息,以构建您正在寻找的东西。

于 2012-05-15T01:45:59.773 回答