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

Posted

技术标签:

【中文标题】请推荐用于 Spring MVC 3.0 的导航策略【英文标题】:Please recommend what navigation strategy to use for Spring MVC 3.0 【发布时间】:2011-03-22 15:30:23 【问题描述】:

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

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

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

【问题讨论】:

【参考方案1】:

我建议您使用磁贴作为视图管理器,以及像这样的 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 会收到一个附加参数 highlightedView,其中包含您需要的信息。-

希望对你有帮助。

【讨论】:

这是一个很好的解决方案 ejmarino,谢谢。我已经在使用瓷砖了,所以这很简单。这确实意味着在我的 menu.jsp 中我必须放置很多 &lt;c:test/&gt; 块来确定该类是否应该应用于该 li,尽管这可以通过一小段 javascript 来简化。再次感谢,很好的答案。【参考方案2】:

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

首先,我打算用一个简单的无请求 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 控制它来加载菜单文件和启动等,然后通过任何视图呈现。

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

【讨论】:

那么控制器长什么样子呢?我们的菜单实际上需要指向当前客户端子页面的链接,并且在 url 中有 clientId。它仅在客户端模块中并且已加载特定客户端时可用。

以上是关于请推荐用于 Spring MVC 3.0 的导航策略的主要内容,如果未能解决你的问题,请参考以下文章

springmvc 3.0啥时间发部

在 Spring MVC 中导航 HTML 页面后,是不是有任何方法可以检查用户会话?

Spring MVC 从 2.5 到 3.0

关于spring mvc 3.0注解,注入失败的问题

Spring 3.0 MVC 绑定枚举大小写敏感

Java EE - Servlet 3.0 和 Spring MVC