java - Wicket 口中的导航 - AjaxPagingNavigator

标签 java wicket

我遇到了 AjaxPagingNavigator 的问题。问题是,当我按“转到下一页”或“转到上一页”而不是移至下一页或上一页时,它会跳转一页。例如,如果我在第 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>

最佳答案

此问题 Not Acceptable 以下答案。请参阅更新部分以获得正确答案。

我在迁移到 Wicket 7 时遇到了这个问题。迁移的代码没有任何更改,但无法正常工作。不仅存在上述问题。如果我单击任何导航页面链接 - 就会出现“访问被拒绝”页面。经过一些研究,我意识到,单击某个链接时会发送两个相同的事件,因此您将页面递增两次,或者转到页面,然后链接,被单击的链接消失,第二个请求尝试访问该消失的链接,因此出现“访问被拒绝”页面。

我真的不知道这是一个错误,还是我做错了什么,但我还没有找到有关此问题的任何信息。因此,我实现了一种分页链接的解决方法。

如果您在页面呈现后查看 AjaxPagingNavigationIncrementLinkAjaxPagingNavigationLink 标记 - 您会发现,此类组件具有类似于 href="./?3-8.ILinkListener-..." 的内容,它调用链接监听器。如果我们删除这个 href 源,那么组件将正常工作并且只执行一个 ajax 请求。因此,使用以下代码重写所有出现的 AjaxPagingNavigationIncrementLinkAjaxPagingNavigationLinkonComponentTag 方法:

/**
 * 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 生命周期中创建一次。因此您也可以删除此缓存。

关于java - Wicket 口中的导航 - AjaxPagingNavigator,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25905132/

相关文章:

java - 使用 iBeacon 或类似技术传输数据

java - Spring Boot 中的自定义 PropertySource 会阻止某些属性加载

java - 连接java和sql。错误

java - 从 S3 并行读取多个文件(Spark、Java)

wicket - 如何将 Spring Rest 与 Apache Wicket Web 应用程序集成

java - wicket 是否执行 session 序列化?

java - Wicket 将 img 元素包裹在链接中

java - 通过 iCalendar vEvent 禁用 outlook "propose new time"按钮

wicket - 我可以在不刷新 RepeatingView 的情况下将元素添加到 RepeatingView 吗?

java - 使用 Wicket 进行 URL 分解