有关类型级通配符请求映射和从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中定义。希望能让事情更清楚......
答案 0 :(得分:0)
如果我理解正确,你的list方法被设置为响应GET of / collections,你想利用默认的视图名称解析,但想要一个与默认解析的视图名称不同的视图名称 -
默认解析基于发送请求的http路径(在您的情况下为/collections
),视图为collections
,而是将GET请求发送到{{ 1}},您的视图名称应为/collections/list
。您可以查看DefaultRequestToViewNameTranslator的API以获取有关规则的更多信息。
但是,在您的情况下,您希望将发送到collections/list
的请求解析为/collections
视图名称。
我只能看到一种方法 - 从方法collections/list
显式返回视图名称
您可以尝试编写自定义的RequestToViewNameTranslator,但传递给的参数是httprequest,并且您无法从中获取太多内容,以构建您正在寻找的内容。