我正在映射网址/modules/tips/SOME_ID/small
以访问ID为SOME_ID的提示,并使用视图small.jsp
呈现它。以下代码适用于此,但我被迫在两个地方重复字符串modules/tips
。 Spring MVC似乎没有我可以确定的约定。除了使用常量之外,还有更好的方法来减少这种重复吗?
@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);
}
}
答案 0 :(得分:1)
您认为名称映射逻辑看起来太“自定义”,因此Spring几乎无法为其提供一些内置支持。
Hovewer,作为理论上的可能性,您可以实现自定义ModelAndViewResolver
并在AnnotationMethodHandlerAdapter
答案 1 :(得分:0)
只要您的观看次数与您的网址相符,您就可以通过简单地省略视图名称来执行您要执行的操作。如果您不提供视图名称,Spring将使用RequestToViewNameTranslator来尝试找出视图名称。您可以查看该类的源代码,以确切了解它的工作原理。以下是文档中的一句好话:
“...'http://localhost/registration.html'的请求URL将导致DefaultRequestToViewNameTranslator生成逻辑视图名称'registration'。此逻辑视图名称将被解析为'/ WEB-INF /jsp/registration.jsp'由InternalResourceViewResolver bean查看。“
因此,它可以,例如,使得处理“/ modules / tips”的控制器方法默认尝试使用名为“modules / tips”的视图,可能你会在“/ WEB-”处有一个JSP INF / JSP /模块/ tips.jsp”。
编辑:我刚刚注意到你说你试图省略视图名称,看起来似乎没有用。您始终可以编写自己的RequestToViewNameTranslator实现,并将DefaultRequestToViewNameTranslator替换为您自己的自定义实现。检查文档,了解如何注入自己的翻译器。答案 2 :(得分:0)
如果您将web.xml中的<url-pattern>
元素更改为包含modules/tips
,则可以从所有Spring绑定配置中有效地省略它:
<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);
}
答案 3 :(得分:-1)
您可以在班级上添加@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);
}
}