Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/spring/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java SpringMVC:生成与控制器url模式匹配的链接_Java_Spring_Spring Mvc - Fatal编程技术网

Java SpringMVC:生成与控制器url模式匹配的链接

Java SpringMVC:生成与控制器url模式匹配的链接,java,spring,spring-mvc,Java,Spring,Spring Mvc,我正在用Spring4.0编写一个web应用程序 我已经用我认为正常的方式编写了控制器,使用@RequestMapping注释来定义控制器处理的url模式 下面的代码片段说明了一个控制器的这一点,它显示了一个证明 @Controller @RequestMapping("/testimonialView") public class TestimonialRequestController { @RequestMapping(value="/{testimonialName}", met

我正在用Spring4.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以进入链接栏时,我正在硬编码url,如下所示:

String href="/testimonialView/" + testimonialName;
这似乎不对。如果以后我想改变url结构,我必须至少在两个地方改变它——可能更多。一次,传入URL与控制器匹配,一次构造锚元素,用户将单击该锚元素来调用该URL

有没有处理这个问题的最佳实践方法?它一定是一个普通的。它是否像使用常量表示URL并从不同位置访问这些URL那样简单?我知道我的例子很简单,但我假设这个问题一定存在于具有复杂URL结构的大型web应用程序中,所以我想了解什么是最佳实践

我希望这不是一个愚蠢的问题。我渴望确保从一开始就实施最佳实践。我已经浏览了Stackoverflow和Google,但没有什么能完全回答这个具体问题


感谢您的帮助。

简单的回答是,您不能动态地执行此操作,因为@RequestMapping在编译时将数据放入代码中

然而,有两种选择是可行的

您可以在单独的类中定义字符串常量-这将使您更容易更改URL的名称 您可以在Spring中的运行时探索请求映射,这样就可以有一些代码找到您在其他地方编码的URL——我这样做是为了确定URL是动态内容还是编码内容。 我的建议是

public class URLs {

     public static final String TESTIMONIAL_VIEW = "/testimonialView";
}


没有比这更好的练习了。正如Ashley所说,你能做的最多的就是使用常量。但是,与任何其他客户机-服务器情况(如Web)一样,如果您更改合同url,在这种情况下,您必须同时更改客户机(即链接)和服务器-控制器映射

我还要提到的是,您的控制器可以更通用,例如,有一个推荐控制器,并将/{name}作为该控制器中的一个操作进行查看。
希望这有帮助

感谢您的回复。当我想知道是否有更好的方法时,你建议的方法就是我开始做的——似乎没有。
@RequestMapping(URLs.TESTIMONIAL_VIEW)
String href= URLs.TESTIMONIAL_VIEW + "/" + testimonialName;