Make Struts为不同的角色显示不同的JSP

时间:2009-05-08 12:23:53

标签: java jsp struts roles

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

这种天真的方法是在每个jsp中使用if / elses:

<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键来确定要检查的目录?

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

2 个答案:

答案 0 :(得分:1)

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

答案 1 :(得分:1)

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