2010-07-29 26 views
6

我開始使用Spring MVC 3.0應用程序並獲得控制器和視圖很好地工作,我現在需要做的一件事就是讓導航工作。因此,對於我擁有的每個視圖,需要知道視圖的「菜單」部分中的哪些項目以突出顯示以及該視圖可用的菜單選項。請推薦使用什麼導航策略來使用Spring MVC 3.0

我想到的一件事是讓控制器告訴視圖它在哪裏,但這是將視圖邏輯綁定到控制器中。我的視圖菜單包含在每個視圖中。

你的方法是什麼?我正在考慮使用瓷磚,至此我只使用JSP和JSTL,也許這會有所幫助?

回答

3

我建議你使用的瓷磚作爲視圖管理器,並且這樣的viewNameTranslator:

<bean id="viewNameTranslator" class="org.springframework.web.servlet.view.DefaultRequestToViewNameTranslator"> 
    <property name="separator" value="." /> 
</bean> 

所以這樣就可以避免在控制器類specifing視圖名稱返回void。

以後瓦def.xml 你定義視圖事端這樣的:

<definition name="newView" extends="baseView"> 
    <put name="menu" value="/pages/menu/menu.jsp?highlightedView=newView" /> 
    <put name="body" value="/pages/newStuff/content.jsp" /> 
</definition> 

這樣引入了menu.jsp收到aditional的參數highlightedView與您需要的信息。 -

希望它有幫助。

+0

這是一個很好的解決方案ejmarino,謝謝。我已經在使用瓷磚了,所以這很簡單。這意味着在我的menu.jsp中,我必須使用大量''塊來確定該類是否應該應用於'li',儘管這可以通過一小段JavaScript來簡化。再次感謝,很好的回答。 – 2010-09-01 08:41:37

1

看起來像這個問題是看到風滾草。我已經提出了很多問題,但沒有找到任何可行的解決方案,所以我想寫一個我有的想法的實現,我張貼這個爲您的意見,告訴我,如果你認爲它是* *想法,如果你認爲這是值得的,我會發布結果代碼。首先,我打算用加載XML菜單文件資源(最初只有一個,但稍後支持)的簡單無需請求的servlet來解決此問題。一個菜單包括然後useBean菜單以用戶希望的任何方式加載和呈現,默認目標是簡單的無序列表,這是相當常見的。因此,首先,我的菜單可能類似於以下內容,它提供了安全角色,但可能通過創建兩個版本SimpleMenuServletSpringSecurityMenuServlet或類似的東西來增加額外的功能。

<menus> 
    <menu id='home' path='/home'> 
     <paths> 
     <match pattern='/home'/> 
     </paths> 
    </menu> 
    <menu id='administration' path='/admin'> 
     <allowed-roles> 
     <role name='admin'/> 
     </allowed-roles> 
     <paths> 
     <match pattern='/admin/**'/> 
     </paths> 
    </menu> 
    <menu id='reports' path='/reports'> 
     <allowed-roles> 
     <role name='user'/> 
     <role name='admin'/> 
     </allowed-roles> 
     <paths> 
     <match pattern='/reports/**'/> 
     <match pattern='/item/*/reports/**'/> 
     </paths> 
    <menu> 
</menus> 

注:有上,因爲這是爲了從資源包返回菜單沒有「文本」 attibute。

現在可以使用來自servlet的useBean或通過自定義標記庫來完成渲染,我不認爲這是真的必要,但是誰知道。

<ul id="main-menu"> 
<c:forEach var="item" items="${menu-items}"> 
    <c:choose> 
     <c:when test="${item.selected && !found}"> 
     <c:set var="menuClass" value="selected"/> 
     <c:set var="found" value="selected"/> 
     </c:when> 
     <c:otherwise> 
     <c:set var="menuClass" value=""/> 
     </c:otherwise> 
    </c:choose> 
    <li id="${item.id}" class="${menuClass}"> 
     <!-- Using resource bundle to get text, this could be the 
      servlet/menu item that's responsible to get this instead --> 
     <a href="${item.path}"><fmt:message key="menu-${item.id}" /></a> 
    </li> 
</c:forEach> 
</ul> 

所以現在我的理由是,我的JAR的servlet和菜單豆了,對於控制它通過web.xml裝載菜單文件和啓動等,然後通過任何視圖渲染。

正如你所看到的菜單的核心工作的路徑模式決定你在哪個區域,它不處理頁面鏈接像面孔一樣,但這不是我想要的,我正在尋找一個靜態的,可配置的,可維護的菜單,我的觀點和我的控制器都不需要有大量的知識。

+0

那麼控制器是什麼樣的?我們的菜單實際上需要指向當前客戶端子頁面的鏈接,並在url中包含clientId。它僅在客戶端模塊內和特定客戶端已加載時纔可用。 – dukethrash 2010-11-30 16:22:23

相關問題