Button Struts2后退按钮和链接

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.

我使用Struts 2.1.6和Dojo插件,整个应用程序都有ajax链接(sx:a)

有人成功地实现了后退按钮功能和链接到特定内容吗

有没有人有过如何实施的经验?我计划实施(如果已经没有好的解决方案)类似的方案:

  • 使用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>