2010-07-29 12 views
6

estoy empezando a cabo una aplicación Spring MVC 3.0 y conseguir controladores y vistas que trabajan muy bien, lo único que ahora tengo que hacer es conseguir la navegación de trabajo. Por lo tanto, para cada vista que tengo, necesita saber qué elemento en la parte "menú" de la vista para resaltar y qué opciones de menú están disponibles para esa vista.favor recomendar lo que la estrategia de navegación a utilizar para Spring MVC 3.0

Una cosa en la que pensé fue hacer que el controlador dijera dónde estaba la vista, pero eso vinculaba la lógica de la vista al controlador. Mi menú de vistas es en sí mismo incluye que incluyo dentro de cada vista.

¿Cuáles son sus enfoques? Estoy pensando en usar fichas, hasta este punto solo he estado usando JSP y JSTL, ¿quizás esto ayude?

Respuesta

3

te recomiendan usar azulejos como un administrador de vista, y una viewNameTranslator así:

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

Así de esta manera se puede evitar especificando los nombres de vista de clase del controlador de regresar vacío.

más adelante en el azulejo-def.xml se define un punto de vista algo como esto:

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

De esta manera menu.jsp recibe un parámetro adicional highlightedView con la información que necesita.-

Espero que ayude.

+0

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

1

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.

+0

¿Cómo se ve el controlador? Nuestro menú realmente necesita enlaces a una subpágina actual del cliente y tiene el ID de cliente en la url. Solo está disponible cuando está dentro del módulo del cliente y se ha cargado un cliente específico. – dukethrash

Cuestiones relacionadas