Похоже, на этот вопрос видят перекаты.Я уже много раз решал эту проблему, но не нашел жизнеспособных решений, так что подумал, что напишу реализацию идеи, которая у меня есть, я публикую это для ваших комментариев, скажите, если вы думаете, что это ** t идея, если вы считаете это достойным, я опубликую результирующий код.
Во-первых, я планирую решить это с помощью простого сервлета без запросов, который загружает ресурсы файла меню XML (первоначально только один, но о поддержке позже).Включение меню может затем useBean
загружать и отображать меню любым способом, который пожелает пользователь. Целью по умолчанию является простой неупорядоченный список, который довольно распространен.
Итак, во-первых, мое меню может выглядеть следующим образом:в нем предусмотрены роли безопасности, но это может быть что-то вроде «дополнительного», создав две версии SimpleMenuServlet
и SpringSecurityMenuServlet
или что-то подобное.
<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>
ПРИМЕЧАНИЕ: нетАтрибут «Текст» в меню, поскольку он предназначен для возврата из комплектов ресурсов.
Теперь рендеринг можно выполнять с помощью 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-сервлет и меню bean вверх, управлять им через web.xml
в отношении загрузки файлов меню и запускаи т. д., затем выполните рендеринг в любом представлении.
Как вы можете видеть, ядро меню работает по шаблонам контуров, определяющим, в какой области вы находитесь, оно не обрабатывает ссылки на страницы, как это делают лица, bно это не то, что я намереваюсь, я ищу статичное, настраиваемое, обслуживаемое меню, о котором ни мои представления, ни мои контроллеры не должны иметь большого знания.