Button Struts2后退按钮和链接
我使用Struts 2.1.6和Dojo插件,整个应用程序都有ajax链接(sx:a) 有人成功地实现了后退按钮功能和链接到特定内容吗 有没有人有过如何实施的经验?我计划实施(如果已经没有好的解决方案)类似的方案:Button Struts2后退按钮和链接,button,dojo,struts2,hyperlink,back,Button,Dojo,Struts2,Hyperlink,Back,我使用Struts 2.1.6和Dojo插件,整个应用程序都有ajax链接(sx:a) 有人成功地实现了后退按钮功能和链接到特定内容吗 有没有人有过如何实施的经验?我计划实施(如果已经没有好的解决方案)类似的方案: 使用js更改地址栏链接(添加参数),然后我可以读取并获取适当的内容,然后使用notifyTopics发布 或者我应该把整个应用程序改成使用jQuery插件吗?jQuery对于ajax页面上的后退按钮和链接有很好的解决方案吗?我不知道Struts,但是你看过dojo.undo(0.
- 使用js更改地址栏链接(添加参数),然后我可以读取并获取适当的内容,然后使用notifyTopics发布
或者我应该把整个应用程序改成使用jQuery插件吗?jQuery对于ajax页面上的后退按钮和链接有很好的解决方案吗?我不知道Struts,但是你看过dojo.undo(0.4.3)吗?我可以想出两种简单的方法:
<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>
或
如果已经有查询字符串参数:
<a href="#" onclick="javascript.window=document.referrer;">Back</a>
或
我曾尝试将Struts 2与dojo结合使用,并实现back按钮。您已经远远超过了Struts2的ajax实现。他们主要使用和编写它来编写简单、快速的ajax函数调用,但不太适合更广泛的使用。另外,当您使用s:head-theme='ajax'标记时;struts将导入您“可能”需要的每个ajax js文件,这会减少加载时间
我建议两种选择之一。学习dojo并使用独立于struts 2的库。或2。在获取jQuery时,我能够实现一个相对简单的后退按钮功能(比Struts2Theme='ajax'更简单) 我的所有链接都通过一个操作来查找参数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)。如果为true(已按下后退/前进按钮)调用函数'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>
注意:如果通过一个参数将所有内容连接起来,这是一种特殊情况,但是可以使用其他参数轻松扩展它,从而发布其他目标。我将尝试使它足够通用,以便在某个地方发布它,但(我想)这是一个很长的路:)
如果您有任何问题,请发布。您使用的是哪个版本的Dojo?上次我听说,Struts从0.4开始就没有更新Dojo插件(现在已经有几年了)。是的,Dojo插件从2.0.6版本开始就被弃用了。Dojo的最新版本还有很多。只是,不幸的是,你所看到的在当时甚至是非常陈旧的。我看了这个,尝试实现(没有任何成功),但我还没有找到任何与Struts2兼容的解决方案。最大的问题是如何“填充”历史动态内容。我做了一些类似于gmail的东西。这是一个好主意,但在这之后,你必须找到一个解决方案来发布不同的目标。
Integer menuId = null;
if(request.getParameter("menuId") != null) {
menuId = Integer.valueOf(request.getParameter("menuId"));
} else {
menuId = getIntCookie("hiddenMenuId");
}
<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>