在wicket中导航 - AjaxPagingNavigator

时间:2014-09-18 05:55:06

标签: java wicket

我遇到了AjaxPagingNavigator的问题。问题是当我按下"转到下一个"或者"转到上一个"而不是移动到下一页或上一页,它跳转1页。例如,如果我在第5页并按"转到下一个"而不是移动到第6页,它跳到第7页。你能协助我解决这个问题。哪里出错了?提前谢谢。

以下是代码:

public class OnlineBankAjaxPagingNavigator extends AjaxPagingNavigator {
    PagingNavigation currentNavigation = null;
    Map<String, Link<?>> firstLastMap = new HashMap();
    Map<String, Link<?>> prevNextMap = new HashMap();

    public OnlineBankAjaxPagingNavigator(String id, IPageable pageable) {
        super (id, pageable);
    }

    public OnlineBankAjaxPagingNavigator(String id, IPageable pageable, IPagingLabelProvider labelProvider) {
        super (id, pageable, labelProvider);
    }

    // forming navigation pages "first", "last"
    protected Link<?> newPagingNavigationLink(String id, IPageable pageable, int pageNumber)
    {
        Link<?> ret = null;
        if (firstLastMap.containsKey(id))
            ret = firstLastMap.get(id);
        else {
            AjaxPagingNavigationLink navCont = new AjaxPagingNavigationLink(id + "Cont", pageable, pageNumber);

            // add css for enable/disable link
            long pageIndex = pageable.getCurrentPage() + pageNumber;
            navCont.add(new AttributeModifier("class", new OnlineBankAjaxPageLinkCssModel(pageable,pageIndex, "navigator_bg")));

            navCont.add(new AjaxPagingNavigationLink(id, pageable, pageNumber));
            ret = navCont;
            firstLastMap.put(id,ret);
        }
        return ret;
    }

    // forming navigation pages "prev", "next"
    protected Link<?> newPagingNavigationIncrementLink(String id, IPageable pageable, int increment)
    {
        Link<?> ret = null;
        if (prevNextMap.containsKey(id))
            ret = prevNextMap.get(id);
        else {
            AjaxPagingNavigationIncrementLink navCont = new AjaxPagingNavigationIncrementLink(id+ "Cont", pageable, increment);

            // add css for enable/disable link
            long pageIndex = pageable.getCurrentPage() + increment;
            navCont.add(new AttributeModifier("class",
               new OnlineBankAjaxPageLinkIncrementCssModel(pageable, pageIndex)));

            // change original wicket-link, so that it always generates href
            navCont.add(new AjaxPagingNavigationIncrementLink(id, pageable, increment));
            prevNextMap.put(id, navCont);
            ret = navCont;
        }
        return ret;
    }

    // forming navigation pages - 1,2,3 ...
    protected PagingNavigation newNavigation(IPageable pageable, IPagingLabelProvider labelProvider) {
        PagingNavigation tmp;
        String id;

        if (currentNavigation==null) {
            tmp = super.newNavigation(pageable, labelProvider);
            id = tmp.getId();
            tmp = null;

            currentNavigation =  new AjaxPagingNavigation (id, pageable, labelProvider) {
                @Override
                protected LoopItem newItem(int iteration) {
                    LoopItem item = super.newItem(iteration);

                    // add css for enable/disable link
                    long pageIndex = getStartIndex() + iteration;
                    item.add(new AttributeModifier("class",
                        new OnlineBankAjaxPageLinkCssModel(pageable,
                                pageIndex, "navigator_active")));
                    return item;
                }
            };
        }

        return currentNavigation;
    }
};

html看起来像这样:

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html xmlns:wicket="http://wicket.apache.org">
<head>
    <title></title>
</head>
<body>
<wicket:panel>
    <style>

        .navigator_bg {
            font-family: Verdana, Tahoma Arial;
            font-style: normal;
            color: #FFFFFF;
            border: 1px solid black;
            background-color: #00395D;
        }

        .navigatorBgDigit{
            font-family: Verdana, Tahoma Arial;
            color: #FFFFFF;
            border: 1px solid black;
            background-color: #00395D;
        }

        .navigator_active{
            font-family: Verdana, Tahoma Arial;
            font-style: normal;
            background-color: #236B98;
            color: #AFEEEE;
        }

        a.navigatorLink:link {
            font-family: Verdana, Tahoma, Arial;
            color: #FFFFFF;
            text-decoration: none;
            background-color: #00395D;
        }

        a.navigatorLink:visited {
            font-family: Verdana, Tahoma, Arial;
            color: #ffffff;
            text-decoration: none;
            background-color: #00395D;
        }

        a.navigatorLink:hover {
            font-family: Verdana, Tahoma, Arial;
            color: #FFFFFF;
            text-decoration: none;
            background-color: #00395D;
        }

        a.navigatorLink:active {
            font-family: Verdana, Tahoma, Arial;
            color: red;
            text-decoration: none;
            background-color: #00395D;
        }

    </style>
    <table border='0'>
    <tr class="navigator_bg">
        <td width="18px" height="18px" align="center" valign="middle" wicket:id="firstCont" class="navigator_bg">&nbsp;<a class="navigatorLink" wicket:id="first" href="#">&lt;&lt;</a>&nbsp;</td>
        <td width="18px" height="18px" align="center" valign="middle" wicket:id="prevCont" class="navigator_bg">&nbsp;<a class="navigatorLink" wicket:id="prev" href="#">&lt;</a>&nbsp;</td>
        <td width="18px" height="18px" align="center" valign="middle" wicket:id="navigation" class="navigatorBgDigit"><a wicket:id="pageLink" href="#" class="navigatorLink"><span wicket:id="pageNumber">1</span></a></td>
        <td width="18px" height="18px" align="center" valign="middle" wicket:id="nextCont" class="navigator_bg">&nbsp;<a class="navigatorLink" wicket:id="next" href="#">&gt;</a>&nbsp;</td>
        <td width="18px" height="18px" align="center" valign="middle" wicket:id="lastCont" class="navigator_bg">&nbsp;<a class="navigatorLink" wicket:id="last" href="#">&gt;&gt;</a>&nbsp;</td>
    </tr>
    </table>
</wicket:panel>
</body>
</html>

1 个答案:

答案 0 :(得分:1)

此问题无法接受以下回答。请参阅更新部分以获得正确答案。

我在迁移到Wicket 7时遇到了这个问题。迁移的代码没有任何变化,但没有正常工作。不仅存在上述问题。如果我点击任何导航页面链接 - &#34;访问被拒绝&#34;页面出现了。经过一些研究,我已经意识到,当点击一些链接时,有两个相同的事件发送,所以你递增页面两次,或者转到页面,然后链接,点击消息和第二个请求试图访问这个消失的链接,所以&#34;访问被拒绝&#34;页面出现了。

我真的不知道这是一个错误,还是我做错了什么,但我没有找到有关此问题的任何信息。因此,我已经为寻呼链接提供了一种解决方法。

如果您在呈现页面后查看AjaxPagingNavigationIncrementLinkAjaxPagingNavigationLink标记 - 您会看到,此类组件具有调用链接侦听器的href="./?3-8.ILinkListener-..."之类的内容。如果我们删除此href源,那么组件将正常工作并仅执行一个ajax请求。因此,使用此类代码覆盖onComponentTagAjaxPagingNavigationIncrementLink所有出现的AjaxPagingNavigationLink方法:

/**
 * Overridden to workaround wicket 7 behavior, which proccessed an error, when ajax navigation is used.
 */
@Override
protected void onComponentTag ( final ComponentTag tag )
{
    super.onComponentTag ( tag );
    if ( !Strings.isEmpty ( tag.getAttribute ( "href" ) ) ) // checking if href is not null or empty with org.apache.wicket.util.string.Strings class.
    {
        tag.put ( "href", "" ); //removing any contents of the href option.
    }
}

注意,AjaxPagingNavigation也有方法newPagingNavigationLink(...)

注意2,在Wicket 6链接中也有href选项,它可以正常工作。

无论如何,希望这会有所帮助,wicket开发人员会评论这个答案以便更好地理解:)。

更新

不幸的是,事实证明这个答案没有问题:)。

问题在于newPagingNavigationLinknewPagingNavigationIncrementLink方法的实施。

在这种方法中,您将一个链接放置到另一个,这会产生您的奇怪行为。所以,你必须摆脱它并返回简单的AjaxPagingNavigationLink和增量链接。您可以将您的行为添加到此链接。

我认为您希望通过OnlineBankAjaxPageLinkIncrementCssModel更新容器样式,但不能将此类链接放在任何容器中(因为实际上已经添加到PagingNavigator#onInitialize方法中)。因此,您只能使用此行为更新此链接,或使用javascript。还有另一个选项可以执行您想要的操作,但这是另一个问题(提示:您必须覆盖onInitializeadd方法。)

另外,为什么要决定将链接缓存到HashMap?这样做没有任何好处,因为此类链接仅在OnlineBankAjaxPagingNavigator生命周期中创建一次。所以你也可以删除这个缓存。