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.
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ź. –