2010-07-29 8 views
6

Zaczynam pracę w aplikacji Spring MVC 3.0 i ładowanie kontrolerów i widoków, jedyną rzeczą, którą muszę teraz zrobić, to sprawić, aby nawigacja działała. Tak więc dla każdego widoku, jaki mam, musi on wiedzieć, który element w części "menu" należy podświetlić, a jakie opcje menu są dostępne dla tego widoku.Proszę polecić jaką strategię nawigacji użyć dla Spring MVC 3.0

Jedną rzeczą, o której pomyślałem, było zmusić kontrolera, aby poinformował o miejscu, w którym się znajduje, ale jest to wiążąca logika widoku do kontrolera. Moje menu widoków zawiera własne uwzględnienie w każdym widoku.

Jakie są Twoje podejścia? Zastanawiam się nad użyciem płytek, do tego momentu korzystałem tylko z JSP i JSTL, może to pomoże?

Odpowiedz

3

polecam Ci użyć płytki jako kierownik widoku, a viewNameTranslator tak:

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

więc w ten sposób można uniknąć widoku specifing nazwiska w klasie kontrolera powrocie nieważne.

później dachówka-def.xml zdefiniować widok coś takiego:

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

ten sposób menu.jsp odbiera aditional parametr highlightedView z potrzebnych informacji.-

Mam nadzieję, że to pomaga.

+0

To wspaniałe rozwiązanie ejmarino, dziękuję. Używam już płytek, więc było to całkiem proste. To znaczy, że w moim menu.jsp muszę wstawić wiele bloków '', aby określić, czy klasa powinna być zastosowana do tego 'li', choć może to zostać uproszczone za pomocą małego fragmentu JavaScript. Jeszcze raz dziękuję, świetna odpowiedź. –

1

Wygląda na to, że widzisz tumbleweeds. Dałem mi problem, ale nie znalazłem żadnych realistycznych rozwiązań, więc wymyśliłem implementację idei, którą mam, publikuję to dla twoich komentarzy, powiedz mi, jeśli uważasz, że to jest * * t pomysł, jeśli uważasz, że jest warta, opublikuję wynikowy kod.

Po pierwsze, mam zamiar rozwiązać ten problem za pomocą prostego serwletu bez żądań, który ładuje zasoby plików menu XML (początkowo tylko jeden, ale obsługa więcej). Menu obejmuje wtedy menu załadowane i renderowane w dowolny sposób, jaki chce użytkownik, domyślnym celem jest prosta nieuporządkowana lista, która jest dość powszechna.

Po pierwsze, moje menu może wyglądać następująco, jest przewidziane dla ról bezpieczeństwa, ale to może być coś "dodatkowego", tworząc dwie wersje: SimpleMenuServlet i SpringSecurityMenuServlet lub coś podobnego.

<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> 

UWAGA: nie ma „Text” attibute w menu tak jak to mają być zwrócone z wiązek zasobów.

Renderowanie można teraz wykonać za pomocą useBean z serwletu lub za pomocą niestandardowej biblioteki znaczników, co moim zdaniem nie jest konieczne, ale kto wie.

<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> 

Więc teraz moje rozumowanie jest to, że mogę JAR serwletu i menu fasolę się, kontrolować go poprzez web.xml w odniesieniu do plików menu ładowania i uruchamiania etc, a następnie renderowanie dowolnym widoku.

Jak widać, rdzeń menu działa według wzorów ścieżek określających obszar, w którym się znajdujesz, nie obsługuje łączenia stron tak jak twarze, ale to nie jest to, co zamierzam, szukam statyczne, konfigurowalne, możliwe do utrzymania menu, którego ani moje widoki, ani moi kontrolerzy nie muszą posiadać dużej wiedzy.

+0

Jak wygląda kontroler? Nasze menu faktycznie potrzebuje linków do aktualnej podstrony klienta i ma identyfikatorklienta w adresie URL. Jest dostępny tylko wtedy, gdy w module klienta i określonego klienta został załadowany. – dukethrash

Powiązane problemy