Spring MVC:生成与控制器url模式匹配的链接

时间:2014-11-04 11:05:39

标签: java spring spring-mvc

我正在使用Spring 4.0编写一个Web应用程序。

我已经用我认为使用@RequestMapping注释定义控制器处理的url模式的正常方式编写了我的控制器。

下面的代码段为控制器显示了这一点,该控制器显示了一个推荐......

@Controller
@RequestMapping("/testimonialView")
public class TestimonialRequestController {
    @RequestMapping(value="/{testimonialName}", method=RequestMethod.GET)
    public ModelAndView testimonialRequest(@PathVariable String testimonialName, ModelAndView modelAndView) throws FileNotFoundException {
        Testimonial testimonial;

        . . .
    }
}

在我的应用程序的其他地方,我想生成一个链接栏,其中包含要包含在左手导航中的所有推荐。

目前,当我构建锚元素的href进入链接栏时,我正在硬编码网址,如下所示:

String href="/testimonialView/" + testimonialName;

这似乎不对。如果以后我想更改网址结构,我必须至少在两个地方更改它 - 可能更多。一旦传入的URL与控制器匹配,一次构建一个用户将单击以调用该URL的锚元素。

是否有处理此问题的最佳做法?它必须是一个普通的。是否像使用常量来表示URL并从不同的位置访问这些URL一样简单?我知道我的例子很简单,但我认为对于具有复杂URL结构的更大的Web应用程序必须存在问题,所以我想了解最佳实践是什么。

我希望这不是一个愚蠢的问题。我很想确保从一开始就实施最佳实践。我查看了Stackoverflow和Google,但没有完全回答这个具体问题。

感激不尽的任何帮助。

2 个答案:

答案 0 :(得分:2)

简短的回答是你不能动态地这样做,因为@RequestMapping在编译时将数据放入代码中。

然而,有几个选项可行。

  1. 您可以在单独的类中定义字符串常量 - 这样可以更轻松地更改URL的名称
  2. 您可以在Spring中运行时探索请求映射,因此可能会有一些代码找到您在其他位置编码的URL - 我这样做是为了确定URL何时是动态内容,而不是编码内容。
  3. 我的推荐是

    public class URLs {
    
         public static final String TESTIMONIAL_VIEW = "/testimonialView";
    }
    

    @RequestMapping(URLs.TESTIMONIAL_VIEW)
    

    String href= URLs.TESTIMONIAL_VIEW + "/" + testimonialName;
    

答案 1 :(得分:1)

对于这种事情,没有更好的做法。正如阿什利所说,你能做的最多就是使用常数。但与任何其他客户端 - 服务器情况(如Web)一样,如果更改合同(本例中为url),则必须为客户端(即链接)和服务器(控制器)执行此操作。映射)。

我还要提到你的控制器可以更通用,例如有一个" Testimonials"控制器和"查看/ {名称}"作为该控制器内的动作。 希望这有帮助