我有一个问题。我们有一个应用程序,它基本上是一组控制与用户交互的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序列,以便正确组织取消按钮?
答案 0 :(得分:1)
你所做的对我来说似乎是合理的。说实话,我现在无法想到解决您问题的设计模式,但我认为除了cancelStack
之外,您还要引用currentURL
,以便推送currentURL
只有当你没有进入取消页面时,你才能摆脱堆叠,你将摆脱惹恼你的额外pop
。
否则,您只需pop
cancelStack
的顶部
例如。在你的例子中:
假设我们有A和B页,A到B ...
currentUrl
是A.对A的操作未取消,因此currentUrl
即A
被推送到cancelStack
。然后,B
和currentURL
的操作为B
,但操作已取消,因此B
未放入堆叠中。因此cancelStack
的顶部是A
(而currentUrl
是B
)。因此,如果您pop
cancelStack
检索A
(无需额外pop
)