Parece que esta pregunta es ver tumbleweeds. Sin embargo, le he dado mucho al problema, no he encontrado ninguna solución viable, así que pensé en escribir una implementación de una idea que tengo, estoy publicando esto para sus comentarios, díganme si piensan que es como * * t idea, si crees que es digno, publicaré el código resultante.
En primer lugar, tengo la intención de resolver esto con un simple servlet de peticiones y menos que carga los recursos de archivo de menú XML (inicialmente sólo uno, pero el soporte para más tarde). Un menú incluye puede entonces useBean
los menús cargados y representa de cualquier forma que el usuario desee, el objetivo predeterminado es una lista desordenada simple, que es bastante común.
Así que, primero, mi menú puede tener un aspecto como el siguiente, que tiene la prestación de funciones de seguridad, pero que podría ser algo como un "extra añadido" mediante la creación de dos versiones SimpleMenuServlet
y SpringSecurityMenuServlet
o algo similar.
<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>
NOTA: no hay un "texto" attibute en los menús ya que esto se tenga intención de regresar de paquetes de recursos.
Rendering ahora se puede hacer con un useBean
del servlet, o por medio de una biblioteca de etiquetas personalizadas, que no creo que es realmente necesario, pero quién sabe.
<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>
Así que ahora mi razonamiento es que podría darse un servlet y los granos de menús arriba, controlarlo a través web.xml
con respecto a los archivos de menú de carga y puesta en marcha, etc, luego hacer por cualquier punto de vista.
Como puede ver, el núcleo del menú funciona según los patrones de ruta que determinan en qué área se encuentra, no maneja la vinculación de páginas como las caras, pero eso no es lo que intento, estoy buscando un menú estático, configurable y mantenible, que ni mis puntos de vista ni mis controladores tienen que tener un gran conocimiento.
Esa es una gran solución ejmarino, gracias. Ya estoy usando fichas, así que esto fue bastante simple de hacer. Significa que en mi menu.jsp tengo que poner un montón de bloques ' ' para determinar si la clase debe aplicarse a ese 'li', aunque esto podría simplificarse con un pequeño fragmento de JavaScript. Gracias de nuevo, excelente respuesta. –