Struts2后退按钮和链接

时间:2009-12-03 18:35:48

标签: button dojo struts2 hyperlink back

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

是否有人成功实现了后退按钮功能并链接到某些内容?

有没有人有经验如何实施?我打算实施(如果没有好的解决方案)这样的事情:

  • 使用js更改地址栏链接(添加参数),然后我可以阅读并获取正确的内容,然后使用notifyTopics发布。

或者我应该改变整个应用程序来使用jQuery插件? jQuery是否有很好的后退按钮和链接在ajax页面上的解决方案?

4 个答案:

答案 0 :(得分: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;"/>

答案 1 :(得分:1)

我尝试使用带有dojo的Struts 2并实现后退按钮。你已经超越了Struts 2的ajax实现。他们主要使用和编写它来编写简单快速的ajax函数调用,并不太适合更广泛的用途。另外当你做s:head theme ='ajax'标签; struts将导入你可能需要的每个ajax js文件,这会导致加载时间。

我建议1.学习dojo并使用独立于struts 2的库。或者2.获取jQuery,我能够实现相对简单的后退按钮功能(更多的是struts 2 theme ='ajax')。

答案 2 :(得分:0)

不知道Struts,但你看过dojo.undo(0.4.3)吗?

答案 3 :(得分:0)

我的所有链接都会通过一个动作来查找参数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'制作的内容。

在动作类(这是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>

注意:如果您通过一个参数连接了所有内容,这是一种特殊情况,但可以使用发布其他目标的其他参数轻松扩展。我将尝试使它足够通用以在某处发布它,但这是(我猜)还有很长的路要走:))

如果您有任何疑问,请发布。