Struts2 后退按钮和链接
Posted
技术标签:
【中文标题】Struts2 后退按钮和链接【英文标题】:Struts2 back button and linking 【发布时间】:2009-12-03 18:35:47 【问题描述】:我正在使用带有 Dojo 插件的 Struts 2.1.6,整个应用程序都有 ajax 链接 (sx:a)。
是否有人成功实现了后退按钮功能并链接到某些内容?
有没有人有经验如何实施?我计划实施(如果还没有好的解决方案)这样的事情:
使用 js 更改地址栏链接(添加参数),然后我可以读取并获取适当的内容,然后使用 notifyTopics 发布它。或者我应该将整个应用程序更改为使用 jQuery 插件吗? jQuery 对 ajax 页面上的后退按钮和链接有很好的解决方案吗?
【问题讨论】:
您使用的是哪个版本的 Dojo?上次我听说,Struts 从 0.4 开始就没有更新 Dojo 插件(现在已经有几年了) 是的,我认为 dojo-plugin 自 2.0.6 版以来已被弃用。 Dojo 有更新得多的版本。只是,不幸的是,你现在看到的东西在那个时候已经很老了。 【参考方案1】:我能想到两种简单的方法:
<s:form action="actionName">
<input type="hidden" value="<s:property value="someProperty"/>" name="someProperty"/>
<input type="hidden" value="<s:property value="someProperty2"/>" name="someProperty2"/>
<s:submit value="Back" />
</s:form>
或
<s:url name="backURL" action="actionName">
<s:param name="someProperty" value="someProperty"/>
<s:param name="someProperty2" value="someProperty2"/>
</s:url>
<a href="<s:property value="#backURL"/>">Back</a>
如果你已经有查询字符串参数:
<a href="#" onclick="javascript.window=document.referrer;">Back</a>
或
<input type="button" value="Back" onclick="javascript.window=document.referrer;"/>
【讨论】:
开始是个好主意,但在此之后,您必须找到发布不同目标的解决方案。【参考方案2】:我尝试将 Struts 2 与 dojo 一起使用并实现后退按钮。您已经超越了 Struts 2 的 ajax 实现。他们主要使用和编写它来编写简单快速的 ajax 函数调用,不太适合更广泛的用途。加上当你做 s:head theme='ajax' tag; struts 将导入您“可能”需要的每个 ajax js 文件,这会缩短加载时间。
我建议要么 1. 学习 dojo 并使用独立于 struts 的库 2. 要么 2. 获取 jQuery,我能够实现相对简单的后退按钮功能(更是如此 struts 2 theme='ajax')。
【讨论】:
我没有在我的解决方案中使用 Dojo,除了发布。我做了类似gmail的东西。【参考方案3】:不知道 Struts,但你看过 dojo.undo (0.4.3) 吗?
【讨论】:
我看了这个,尝试实现(没有任何成功),我还没有找到任何与 Struts2 兼容的解决方案。最大的问题是如何“填充”历史动态内容。【参考方案4】:我所有的链接都通过一个查找参数 menuId 的操作(当然是必须显示的菜单的 ID)。
通过此操作,在返回响应之前,我设置了一个要调用的 javascript 函数:
setBackMenuId(menuId,sometext)
MenuId 是 id,sometext 是该菜单的名称,因此浏览器日志记录更好。
function setBackMenuId(id,subtekst)
window.location.hash = "menuId="+id;
document.title = subtekst;
selectedHash = document.location.hash;
if(intervalHashSearch == '')
initializeHashSearch();
然后,其他需要的js函数:
function publishLinkTarget()
var param = window.location.hash;
if(param)
if(param.indexOf("menuId") > 0)
var id = param.split("=", 2);
if(id[1])
setCookie('backMenuId',id[1],1,false);
setTimeout('publishLayoutContent()', 100);
var selectedHash = '';
var intervalHashSearch = '';
function initializeHashSearch()
intervalHashSearch = window.setInterval('checkHash()', 500);
function stopHashSearch()
window.clearInterval(intervalHashSearch);
intervalHashSearch = '';
function checkHash()
var currentHash = document.location.hash;
if(selectedHash != currentHash)
selectedHash = currentHash;
publishLinkTarget();
function publishLayoutContent()
dojo.event.topic.publish("layoutContentTarget");
如果你看你会发现,它首先被称为'setBackMenuId',它向地址栏添加哈希和参数并更改标题,然后记住这个哈希,因此间隔哈希搜索可以找出差异。然后它初始化这个哈希搜索。
'checkHash' 每 500 毫秒运行一次,并检查哈希是否已更改(这意味着,按下后退按钮,而不是单击新链接(setBackMenuId 设置 selectedHash)。如果为真(按下后退/前进按钮) ) 函数 'publishLinkTarget' 被调用,它从哈希中读取参数,如果它们没问题,首先我设置一个 cookie,所以我可以从 HttpServletRequest 中读取它并找出哪个菜单 id 链接。如果我在这里意味着我还必须发布使用“publishLayoutContent”制作的内容。
在action类中(这里是MenuAction,方法视图,和发布的一样)只有这个很重要:
Integer menuId = null;
if(request.getParameter("menuId") != null)
menuId = Integer.valueOf(request.getParameter("menuId"));
else
menuId = getIntCookie("hiddenMenuId");
所以,如果我没有从参数(点击链接)中获取菜单 ID,我会从 cookie(后退/前进按钮)中获取。
和带有这个目标的 JSP:
<s:url var="layoutContentUrl" action="Menu-view" namespace="/public" />
<sx:div showLoadingText="false" indicator="ajaxIndicator"
id="layout-content" href="%layoutContentUrl" theme="ajax"
listenTopics="layoutContentTarget" preload="false"
afterNotifyTopics="/ajaxAfter">
</sx:div>
注意:这是一种特殊情况,如果您通过一个参数连接所有内容,但可以使用发布其他目标的其他参数轻松扩展它。我会尽量让它足够通用以在某个地方发布它,但这(我猜)还有很长的路要走:)
如果您有任何问题,请发布。
【讨论】:
以上是关于Struts2 后退按钮和链接的主要内容,如果未能解决你的问题,请参考以下文章
如何使用 Struts2 和 Hibernate 删除和修改数据
Struts2:<s:submit> 按钮中的方法属性不起作用