Java 在Spring 3.0 MVC Restful映射中不重复路径两次

Java 在Spring 3.0 MVC Restful映射中不重复路径两次,java,rest,spring-mvc,Java,Rest,Spring Mvc,我正在映射url/modules/tips/SOME_ID/small,以使用ID SOME_ID访问tip,并使用view small.jsp呈现它。下面的代码对此非常有用,但是我不得不在两个地方重复字符串模块/提示。SpringMVC似乎没有一个我可以确定的惯例。除了使用常数,还有更好的方法来减少这种重复吗 @Controller public class TipsController{ @RequestMapping(value="/modules/tips/{tipId}/{vie

我正在映射url/modules/tips/SOME_ID/small,以使用ID SOME_ID访问tip,并使用view small.jsp呈现它。下面的代码对此非常有用,但是我不得不在两个地方重复字符串模块/提示。SpringMVC似乎没有一个我可以确定的惯例。除了使用常数,还有更好的方法来减少这种重复吗

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

您可以在类上放置@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);
    }
}

视图名称映射逻辑看起来过于自定义,因此Spring很难提供一些内置支持。
但是,从理论上讲,您可以实现一个定制并将其注册到AnnotationMethodHandlerAdapter中,因为您查看的名称映射逻辑看起来过于定制,所以Spring很难为它提供一些内置支持。
作为一种理论上的可能性,您可以实现一个定制并将其注册到AnnotationMethodHandlerAdapter中,只要您的视图与URL匹配,您就可以通过省略视图名称来完成您想要做的事情。如果不提供视图名称,Spring将使用RequestToViewNameTranslator来尝试找出视图名称。您可以查看该类的源代码,以了解它是如何工作的。这里有一个很好的引用文件:

。。。的请求URL将导致DefaultRequestToViewNameTranslator生成逻辑视图名称“registration”。然后,InternalResourceViewResolver bean将此逻辑视图名称解析为“/WEB-INF/jsp/registration.jsp”视图

例如,它可以使处理/modules/tips的控制器方法在默认情况下尝试使用名为modules/tips的视图,假设您在/WEB-INF/JSP/modules/tips.JSP上有一个JSP


编辑:我刚注意到你说你试着省略视图名,但这似乎不起作用。您可以编写自己的RequestToViewNameTranslator实现,并用自己的自定义实现替换DefaultRequestToViewNameTranslator。查看文档以了解如何插入您自己的转换器。

只要您的视图与URL匹配,您就可以通过省略视图名称来完成您想要做的事情。如果不提供视图名称,Spring将使用RequestToViewNameTranslator来尝试找出视图名称。您可以查看该类的源代码,以了解它是如何工作的。这里有一个很好的引用文件:

。。。的请求URL将导致DefaultRequestToViewNameTranslator生成逻辑视图名称“registration”。然后,InternalResourceViewResolver bean将此逻辑视图名称解析为“/WEB-INF/jsp/registration.jsp”视图

例如,它可以使处理/modules/tips的控制器方法在默认情况下尝试使用名为modules/tips的视图,假设您在/WEB-INF/JSP/modules/tips.JSP上有一个JSP

编辑:我刚注意到你说你试着省略视图名,但这似乎不起作用。您可以编写自己的RequestToViewNameTranslator实现,并用自己的自定义实现替换DefaultRequestToViewNameTranslator。查看文档以了解如何插入您自己的转换器。

如果您将web.xml中的元素更改为包含模块/提示,您可以从所有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);
}
如果将web.xml中的元素更改为包含模块/提示,则可以从所有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);
}

此解决方案不会减少重复两次字符串模块/提示的需要。如果我有一个以上的方法,它只会减少需要,在本例中我没有这样做。该解决方案不会减少重复字符串模块/提示两次的需要。如果我有多个方法(在本例中没有),它只会减少需要。最初,我省略了{viewName},并让我的方法返回void。Spring然后使用最后一个未映射的path元素作为视图名,但是它看起来像是JSP层次结构的根,这对我来说毫无意义。我想这是我真正的问题;如果可能的话,我希望路径和视图位置之间有一个并行结构,但是我支持axtavt的想法。最初,我省略了{viewName},让我的方法返回void。Spring然后使用最后一个未映射的path元素作为视图名,但是它看起来像是JSP层次结构的根,这对我来说毫无意义。我想这是我真正的问题;如果可能的话,我希望路径和视图位置之间有一个并行结构,但是我支持AXTAVT的想法伟大的问题,我来这里是为了寻找
同样的事情。我觉得奇怪的是,请求映射和RequestToViewNameTranslator完全分开了。好问题,我来这里也是为了找同样的东西。我觉得奇怪的是,请求映射和RequestToViewNameTranslator完全分离。