【问题标题】:Make Struts show different JSPs for different roles让 Struts 为不同的角色显示不同的 JSP
【发布时间】:2010-10-24 18:48:18
【问题描述】:

我们有一个 Struts 2 Web 应用程序,几乎每个员工都使用它来管理和配置我们服务器场的工作。我们正在制定一项为客户制作仪表板的计划,这样他们就可以看到自己的工作,并非常简单地显示其状态(“进行中”、“准备打样”、“完成”等)。客户可以看到的所有页面的信息都将比员工的视图少得多,并且无法编辑或更改任何内容。但归根结底,它们本质上是同一信息的两种不同视图:一种非常简单,一种更复杂且可控。

实现这一点的天真方法是在每个 jsp 中都有 if/else:

<s:if test="user.role == 'customer'">
    <!-- TODO - Display simple customer view -->
</s:if>
<s:else>
    <!-- TODO - Display complex employee view -->
</s:else>

有没有更简单的方法来做到这一点?我可以创建两个单独的 jsps 目录,一个名为“customer”,一个名为“employee”(或默认或其他),然后让 Struts 在我的操作中关闭属性以决定检查哪个目录?

或者还有其他方法可以做到这一点吗?

【问题讨论】:

    标签: java jsp struts roles


    【解决方案1】:

    我建议在您的控制器中管理它。为客户添加一个新视图,并检查用户在控制器中的角色并显示适当的视图。这将使您现有的视图保持不变,并增加为您的客户提供真正自定义视图的能力。

    【讨论】:

    • 对于每个操作,复制所有结果定义?这是一个很大的应用程序,可能有 50 个操作。 struts.xml 中有很多额外的东西,这让我觉得所有的重复都很难维护。
    • +1 我认为这是一个很好的解决方案,但我认为您应该查看stripesframework.org。就像没有 xml 的 struts。
    • 如果每个操作都重用相同的视图,那么是的,这将是 xml 中的大量代码重复;您可以改为创建一个新操作,并从您的控制器中调用它,而不是返回新的自定义响应。如果每个动作都需要一个独特的视图,那么这种重复是有意义的并且是必要的。
    【解决方案2】:

    从问题中并不清楚这两种观点是否完全不同,或者客户是否有额外的东西,或者员工是否有额外的东西。如果一个角色有额外的东西,只需将常见的部分放在一个文件中,将不常见的部分放在他们自己的文件中,然后使用包含或拼贴(或类似的东西)来组合 JSP 来制作页面。

    如果两个视图完全不同,它们应该是单独的 JSP,在这种情况下,动作可以根据角色转发到适当的视图,正如 Rich Kroll 所建议的那样。

    至于您关于复制结果定义的评论,当您有两个独立的互斥功能时,您需要两个代码路径。您能做的最好的事情就是将通用性分解到共享代码文件中。

    如果您经常使用这种模式,您可以简化操作代码的一种方法是选择与您所需的转发名称最匹配的 ActionForward。

    所以,如果你通常会这样做

    return mapping.findForward("success");
    

    你可以这样做

    ActionForward defaultMapping = mapping.findForward("success");
    ActionForward roleMapping = mapping.findForward(user.getRole() + "_success");
    if (roleMapping != null) {
      return roleMapping ;
    } else {
      return defaultMapping;
    }
    

    把它放在你的基类中的一个方法中,然后你的动作就不需要知道他们要去什么视图。那么你的 struts-config 可以是这样的:

    <action path="/home" class="HomeAction">
      <forward name="success" path="home.jsp"/>
    </action>
    <action path="/viewOrder" class="ViewOrderAction">
      <forward name="customer_success" path="customer_order.jsp"/>
      <forward name="employee_success" path="employee_order.jsp"/>
    </action>
    

    在这种情况下,您不会通过名称动态查找 jsps 以确定它们是否存在,但至少您可以使操作代码保持简单。

    【讨论】:

    • 我已经编辑了这个问题,以便更清楚地说明在几乎所有情况下,这些只是相同数据的两种不同视图。
    • 同一数据的两个不同视图,但这些视图的实现似乎非常不同。在这种情况下,我会为每个操作使用两个转发条目。
    • 这很好,但是有没有办法在 Struts 2 中进行这种搜索? ActionMapping 对象中不再有等效方法。
    • 遗憾的是,我们在这里被困在 Struts 1 上。我不知道 Struts 2。
    猜你喜欢
    • 2023-03-19
    • 1970-01-01
    • 2017-11-02
    • 1970-01-01
    • 1970-01-01
    • 2015-04-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多