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:多个提交按钮

如何使用 Struts2 和 Hibernate 删除和修改数据

如何从无提交按钮调用 Struts2 操作

Struts2:<s:submit> 按钮中的方法属性不起作用

struts2与spring整合问题,访问struts2链接时,spring会负责创建Action

Struts2中通过超链接传参数要注意的问题