代码之家  ›  专栏  ›  技术社区  ›  Brett Ryan

请推荐SpringMVC 3.0的导航策略

  •  6
  • Brett Ryan  · 技术社区  · 14 年前

    我正在启动一个SpringMVC 3.0应用程序,让控制器和视图工作得很好,我现在需要做的一件事就是让导航工作正常。因此,对于我拥有的每个视图,它需要知道视图“菜单”部分中要突出显示的项目以及该视图可以使用哪些菜单选项。

    我想到的一件事是让控制器告诉视图它在哪里,但这就是将视图逻辑绑定到控制器中。我的视图菜单在它自己的include中,我在每个视图中都包含它。

    你的方法是什么?我正在考虑使用Tiles,到目前为止,我只使用JSP和JSTL,也许这会有所帮助?

    2 回复  |  直到 14 年前
        1
  •  3
  •   Emiliano    14 年前

    我建议您将tiles用作视图管理器,并使用如下的viewnametranslator:

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

    这样就可以避免在返回void的控制器类上指定视图名称。

    稍后,tile-def.xml 定义这样的视图:

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

    这种方式 MunuJSP 接收一个附加参数 高亮视图 你需要的信息。-

    希望它有帮助。

        2
  •  1
  •   Brett Ryan    14 年前

    看起来这个问题是看到了杂草。虽然我已经给出了很多问题,但还没有找到任何可行的解决方案,所以我认为我会写一个想法的实现,我在为你的评论发布这个,告诉我如果你认为这是一个**不想法,如果你认为它值得,我会发布结果代码。

    首先,我计划用一个简单的请求较少的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,或者通过一个定制的标签库,我认为这不是真正必要的,但是谁知道呢。

    <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和menu bean,通过 web.xml 关于加载菜单文件和启动等,然后由任何视图呈现。

    正如您所看到的,菜单的核心是通过路径模式来确定您所处的区域,它不像faces那样处理页面链接,但这不是我想要的,我正在寻找一个静态的、可配置的、可维护的菜单,我的视图和控制器都不需要大量的知识。