我遇到了 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"> <a class="navigatorLink" wicket:id="first" href="#"><<</a> </td>
<td width="18px" height="18px" align="center" valign="middle" wicket:id="prevCont" class="navigator_bg"> <a class="navigatorLink" wicket:id="prev" href="#"><</a> </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"> <a class="navigatorLink" wicket:id="next" href="#">></a> </td>
<td width="18px" height="18px" align="center" valign="middle" wicket:id="lastCont" class="navigator_bg"> <a class="navigatorLink" wicket:id="last" href="#">>></a> </td>
</tr>
</table>
</wicket:panel>
</body>
</html>
最佳答案
此问题 Not Acceptable 以下答案。请参阅更新部分以获得正确答案。
我在迁移到 Wicket 7 时遇到了这个问题。迁移的代码没有任何更改,但无法正常工作。不仅存在上述问题。如果我单击任何导航页面链接 - 就会出现“访问被拒绝”页面。经过一些研究,我意识到,单击某个链接时会发送两个相同的事件,因此您将页面递增两次,或者转到页面,然后链接,被单击的链接消失,第二个请求尝试访问该消失的链接,因此出现“访问被拒绝”页面。
我真的不知道这是一个错误,还是我做错了什么,但我还没有找到有关此问题的任何信息。因此,我实现了一种分页链接的解决方法。
如果您在页面呈现后查看 AjaxPagingNavigationIncrementLink
和 AjaxPagingNavigationLink
标记 - 您会发现,此类组件具有类似于 href="./?3-8.ILinkListener-..."
的内容,它调用链接监听器。如果我们删除这个 href
源,那么组件将正常工作并且只执行一个 ajax 请求。因此,使用以下代码重写所有出现的 AjaxPagingNavigationIncrementLink
和 AjaxPagingNavigationLink
的 onComponentTag
方法:
/**
* 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 开发人员会对此答案进行评论以更好地理解:)。
更新
不幸的是,事实证明这个答案与问题无关:)。
问题在于 newPagingNavigationLink
和 newPagingNavigationIncrementLink
方法的实现。
在这种方法中,您将一个链接放置到另一个链接,这会产生奇怪的行为。因此,您必须摆脱它并返回简单的 AjaxPagingNavigationLink 和增量链接。您可以将您的行为添加到此链接。
我认为您想通过OnlineBankAjaxPageLinkIncrementCssModel更新容器样式,但不能将此类链接放置在任何容器中(因为它们实际上添加在PagingNavigator#onInitialize
方法中)。因此,您可以仅使用此行为更新此链接,或使用 javascript。还有另一个选项可以执行您想要的操作,但它涉及另一个问题(提示:您必须重写 onInitialize
和 add
方法)。
此外,为什么您决定将链接缓存到 HashMap
中?这样做没有任何好处,因为此类链接仅在 OnlineBankAjaxPagingNavigator
生命周期中创建一次。因此您也可以删除此缓存。
关于java - Wicket 口中的导航 - AjaxPagingNavigator,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25905132/