看起来这个问题是看风滚草。虽然我已经给出了很多问题,但还没有找到任何可行的解决方案,所以我想我会写一个我有的想法的实现,我将这个发布给你的 cmets,告诉我你是否认为它是* *t idea,如果您认为值得,我会发布结果代码。
首先,我打算用一个简单的无请求 servlet 来解决这个问题,该 servlet 加载 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>
注意:菜单上没有“文本”属性,因为它旨在从资源包中返回。
现在可以使用 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 和菜单 bean,通过 web.xml 控制它来加载菜单文件和启动等,然后通过任何视图呈现。
您可以看到菜单的核心通过路径模式确定您所在的区域,它不像面孔那样处理页面链接,但这不是我想要的,我正在寻找一个静态的、可配置的、可维护的菜单,我的视图和控制器都不需要大量的知识。