请推荐用于Spring MVC 3.0的导航策略

时间:2010-07-29 10:19:44

标签: java spring-mvc navigation

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

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

你的方法是什么?我正在考虑使用磁贴,到目前为止我只使用JSP和JSTL,这可能有用吗?

2 个答案:

答案 0 :(得分:3)

我建议你使用tile作为视图管理器,并使用这样的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>   

这样 menu.jsp 会收到一个aditional参数 highlightView 以及您需要的信息.-

希望它有所帮助。

答案 1 :(得分:1)

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

首先,我打算用一个简单的无需请求的servlet解决这个问题,这个servlet加载XML菜单文件资源(最初只有一个,但稍后会支持更多)。菜单包括然后useBean加载菜单并以用户希望的任何方式呈现,默认目标是一个简单的无序列表,这是相当普遍的。

首先,我的菜单可能如下所示,它已经为安全角色提供了条件,但通过创建两个版本SimpleMenuServletSpringSecurityMenuServlet或类似的东西,这可能是“增加额外”的内容

<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控制它加载菜单文件和启动等,然后通过任何视图进行渲染。

正如你所看到的,菜单的核心是通过路径模式来确定你所在的区域,它不会像面孔一样处理页面链接,但这不是我想要的,我正在寻找一个静态,可配置,可维护的菜单,我的观点和我的控制器都不必具备很多知识。