现在,我的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代码中的后缀进行硬编码?
答案 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";
}