2011-01-19 50 views
2

現在,我的web.xml被配置爲Spring MVC將接管任何具有* .html後綴的內容。我有幾個控制器根據當前用戶狀態生成Web鏈接。Spring MVC是否提供用於構建Web鏈接的任何Java API?

舉例來說,我有以下的代碼,以確定哪些「下一步」按鈕應指向:

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代碼中的後綴進行硬編碼?

回答

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"; 
} 
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 
+0

我同意你的看法,但我之所以這樣做是在Java端我的當前項目,因爲它需要大量的計算才能確定下一個鏈接。如果我在視圖中這樣做,最終會有很多變量被傳遞到模型中,並且視圖中有很多邏輯來構建鏈接,這並不是很漂亮。 – limc 2011-01-19 20:45:21