堆栈的网址模式

时间:2012-07-02 08:22:30

标签: java jsp design-patterns servlets action

我有一个问题。我们有一个应用程序,它基本上是一组控制与用户交互的JSP和动作类。这些操作设置了页面正确显示所需的一些参数。系统中的网址始终包含事件的名称,该名称定义了我们接下来要访问的页面。

现在,几乎每个页面都有一个取消按钮,该按钮应该指向上一页。从一开始,每个取消按钮的URL都是严格定义的,但最终,随着系统变得越来越大,结果很难为这个按钮编写逻辑,这样它就能完全引导到前一页。

例如,假设我们有三个页面,A,B和C.页面A有一个指向页面B的链接,而B有一个指向C的链接。因此,C有一个甚至通向B的URL(也是它包含要在B)上显示的实体的键。但是,假设页面A已被修改,现在还有一个C上的链接。现在我们需要从那里检查C页面并设置适当的URL,逻辑变得非常复杂。

所以,我向我的团队提出了以下解决方案。用户会话应包含一个名为CancelStack的特殊对象。导致页面的每个操作都应该将其在URL中的url(包含事件和一些所需的其他数据)推送到其中。在每个页面上,取消按钮现在应该有一个引用特殊事件的URL,名为cancelStack。

cancelStack操作的作用是:

  • 从会话中检索取消堆栈。
  • 弹出最后一个网址,不要使用它。
  • 再次弹出网址并重定向到该网址。

为什么我们在不使用的情况下检索最后一个网址?假设我们有页面A和B,A通向B.对A的操作将其放置在堆栈中,这应该是B页面的取消URL。现在,B的动作将它的url放在堆栈中。因此我不使用弹出它,然后弹出第一个url,重定向到A动作,此动作再次将A url添加到堆栈中(因此堆栈大小仅减少1而不是减少2)。

这似乎是一个非常好的方案,但是看起来相当奇怪的是堆栈的顶部元素在不使用的情况下弹出。所以我有一个问题。是否有任何设计模式,以便在会话中存储URL序列,以便正确组织取消按钮?

1 个答案:

答案 0 :(得分:1)

你所做的对我来说似乎是合理的。说实话,我现在无法想到解决您问题的设计模式,但我认为除了cancelStack之外,您还要引用currentURL,以便推送currentURL只有当你没有进入取消页面时,你才能摆脱堆叠,你将摆脱惹恼你的额外pop
否则,您只需pop cancelStack的顶部 例如。在你的例子中:

  

假设我们有A和B页,A到B ...

currentUrl是A.对A的操作未取消,因此currentUrlA被推送到cancelStack。然后,BcurrentURL的操作为B,但操作已取消,因此B未放入堆叠中。因此cancelStack的顶部是A(而currentUrlB)。因此,如果您pop cancelStack检索A(无需额外pop