Spring MVC是否提供用于构建Web链接的任何Java API?

时间:2011-01-19 19:35:15

标签: java spring-mvc

现在,我的web.xml配置方式是Spring MVC将接管任何具有* .html后缀的内容。我有一些控制器可以根据当前用户状态生成Web链接。

例如,我有以下代码来确定“下一步”按钮应指向的内容:

if (nextSlide != null) {
    nextLink = String.format("/%s/module/%d/slide/%d.html", studyName, moduleId, nextSlide.getKey());
}
else {
    nextLink = String.format("/%s/module/all.html", studyName);
}

但是,我不喜欢这种方法,因为我将“.html”硬编码到这里的链接。我当然可以创建一个工厂,生成带有“.html”后缀的链接以隐藏所有控制器代码,但这仍然需要我在我的Java代码中硬编码“.html”...不要太干。

我基本上希望Spring MVC有一些API允许我构建链接。如果这些API不存在,你是否像我在这里做的那样对Java代码中的后缀进行硬编码?

2 个答案:

答案 0 :(得分:1)

似乎构建URL应该在视图而不是控制器中处理。将其移动到视图将消除在Java中硬编码任何内容的需要。您还可以使用Spring的URL标记。来自Spring API文档:

<spring:url value="/url/path/{variableName}">
    <spring:param name="variableName" value="more than JSTL c:url" />
</spring:url>

// Results in: /currentApplicationContext/url/path/more%20than%20JSTL%20c%3Aurl

答案 1 :(得分:1)

没有。根据您目前的情况,您有三种选择。其中两个是你的选择,dwb的选择。另一种是创建自己的taglib

看起来你正在做某种向导功能(屏幕2依赖于屏幕1的点击)。如果是这种情况,我会调查Spring Webflow

另一种可能性是对某种决策方法执行AJAX调用,或者你可以使用JavaScript在客户端处理这一切。

另外,FWIW,我不认为编码.html会破坏DRY,但是如果你的servlet在这个后缀以外的东西上匹配,我会担心维护。你最有可能做的事情类似于下面的例子,只是基本上返回一个新的ModelAndView或者至少重定向到一个:

@RequestMapping("slide/{id}")
public String goToSlide(@PathParam("id") String id, ModelMap model) {
    model.adAttribute("slide", slideService.findById(id));
    return "slides/slide";
}

@RequestMapping("all")
public String getAllSlides() {
    return "slides/all";
}

@RequestMapping(value="slideshow/{id}", method=RequestMethod.GET)
public String getSlideshow(@PathParam("id") String slideshowId, ModelMap model) {
    model.attAttribute("slideshow", slideshowService.findById(slideshowId));
    return "slides/slideshow";
}

@RequestMapping(value="slideshow", method=RequestMethod.POST)
public String postSlideshow(@QueryParam("slideId") String slideId) {
    if(slideId != null) {
        return "slide/" + slideId;
    }
    return "redirect:all";
}