在Spring 3.0 MVC Restful映射中不重复两次路径
我正在映射url /modules/tips/SOME_ID/small
以访问ID为SOME_ID的提示并使用视图small.jsp
来呈现它。下面的代码对此很好,但是我不得不在两个地方重复字符串modules/tips
。 Spring MVC似乎没有一个我可以确定的约定。除了使用常数之外,是否有更好的方法来减少这种重复?在Spring 3.0 MVC Restful映射中不重复两次路径
@Controller
public class TipsController{
@RequestMapping(value="/modules/tips/{tipId}/{viewName}",method=RequestMethod.GET)
public ModelAndView get(
@PathVariable String tipId,
@PathVariable String viewName) {
Tip tip = findTip(tipId);
return new ModelAndView("modules/tips/" + viewName,"tip",tip);
}
}
您可以在您的课堂上添加@requestMappings注释。在方法的注释@RequestMapping然后相对于此:
@Controller
@RequestMapping(value="/modules/tips")
public class TipsController{
@RequestMapping(value="{tipId}/{viewName}",method=RequestMethod.GET)
public ModelAndView get(
@PathVariable String tipId,
@PathVariable String viewName) {
Tip tip = findTip(tipId);
return new ModelAndView("modules/tips/" + viewName,"tip",tip);
}
}
该解决方案不会减少重复字符串“模块/提示”两次的需要。这只会减少需求,如果我有多个方法,我不在这个例子中 – davetron5000 2010-01-19 22:59:02
您查看名称映射逻辑看起来太“定制”,所以春天几乎可以提供一些内建对它的支持。 Hovewer,作为一个理论上的可能性,可以实现自定义ModelAndViewResolver
和注册它的AnnotationMethodHandlerAdapter
最初,我省略了{viewName}并让我的方法返回void。 Spring然后使用未映射的最后一个路径元素作为视图名称,但是它在我的JSP层次结构的根目录中查找,这对我来说没有意义。我想这是我真正的问题;我想要一个路径和视图位置之间的并行结构(如果可能的话) – davetron5000 2010-01-19 23:00:20
Spring不提供这些功能,但我支持axtavt – 2010-01-20 21:22:18
你可以做你正在尝试通过简单地省略视图名,只要你的意见一致了做什么你网址。如果您没有提供视图名称,Spring将使用RequestToViewNameTranslator尝试找出视图名称。您可以查看该课程的源代码,以查看它的工作原理。以下是文档中的一个很好的引用:
“...'http://localhost/registration.html'的请求URL将导致由DefaultRequestToViewNameTranslator生成的'registration'的逻辑视图名称,然后该逻辑视图名称将被解析为'/WEB-INF/jsp/registration.jsp'由InternalResourceViewResolver bean查看。“因此,它可以使得处理“/ modules/tips”的控制器方法在默认情况下尝试使用名为“modules/tips”的视图,假设您将在“/ WEB -INF/JSP /模块/ tips.jsp”。
编辑:我只注意到你说你试过省略视图名称,它似乎并没有这样的工作。您始终可以编写自己的RequestToViewNameTranslator实现,并将DefaultRequestToViewNameTranslator替换为您自己的自定义实现。检查文档以了解如何注入您自己的翻译器。
如果您改变<url-pattern>
元素在web.xml中包括modules/tips
,可以有效地从所有的春绑定配置的忽略它:
<servlet-mapping>
<servlet-name>spring-mvc</servlet-name>
<url-pattern>/myapp/modules/tips/*</url-pattern>
</servlet-mapping>
@RequestMapping(value="/{tipId}/{viewName}",method=RequestMethod.GET)
public ModelAndView get(
@PathVariable String tipId,
@PathVariable String viewName) {
Tip tip = findTip(tipId);
return new ModelAndView(viewName,"tip",tip);
}
大问题,我来到这里寻找同样的事情。对我来说,请求映射和RequestToViewNameTranslator完全脱离另一个是很奇怪的。 – 2010-11-30 18:17:43