2

我们有一个 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 在我的操作中关闭属性以决定检查哪个目录?

还是有其他方法可以做到这一点?

4

2 回答 2

1

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

于 2009-05-08T12:36:12.410 回答
1

从问题中并不清楚这两种观点是否完全不同,或者客户是否有额外的东西,或者员工是否有额外的东西。如果一个角色有额外的东西,只需将常见的部分放在一个文件中,将不常见的部分放在他们自己的文件中,然后使用包含或拼贴(或类似的东西)来组合 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 以确定它们是否存在,但至少可以使操作代码保持简单。

于 2009-05-08T13:11:31.080 回答