Wicket:覆盖browserinfopage

时间:2013-06-13 13:38:09

标签: wicket

我正在启用wicket来收集浏览器信息

getRequestCycleSettings().setGatherExtendedBrowserInfo(true);

因此我看到一个带有标准消息的BrowserInfoPage。我想阻止用户看到此消息。

我正在尝试覆盖BrowserInfoPage,并希望将其留空,如下所示:http://markmail.org/message/fqbunzoddmh3dplx

我收到了nex错误

Unexpected RuntimeException Last cause: The component(s) below failed to render. 
A common problem is that you have added a component in code but forgot to reference 
it in the markup (thus the component will never be rendered).

来自原始BrowserInfoPage的组件列表。我明白,它从超类中抓取那些组件。但是我怎么能摆脱这一切呢?

3 个答案:

答案 0 :(得分:1)

创建您自己的自定义浏览器信息页面:

import org.apache.wicket.markup.html.pages.BrowserInfoPage;

public class CustomBrowserInfoPage extends BrowserInfoPage {
private static final long serialVersionUID = 1L;
}

覆盖newBrowserInfoPage课程中的Session

protected WebPage newBrowserInfoPage()
{
    return new CustomBrowserInfoPage();
}

然后从BrowserInfoPage.html中的org.apache.wicket.markup.html.pages复制wicket-core.jar文件并对其进行自定义...它应与CustomBrowserInfoPage.java文件位于同一文件夹中。

答案 1 :(得分:0)

我猜你必须在CustomBrowserInfoPage.java旁边创建一个名为“CustomBrowserInfoPage.html”的空HTML文件,以便Wicket获取你的HTML文件而不是父类中的文件。

答案 2 :(得分:0)

你很可能会看到类似的东西:

Last cause: The component(s) below failed to render. Possible reasons could be that: 1) you have added a component in code but forgot to reference it in the markup (thus the component will never be rendered), 2) if your components were added in a parent container then make sure the markup for the child container includes them in <wicket:extend>.

1. [WebMarkupContainer [Component id = link]]
2. [BrowserInfoForm [Component id = postback]]
3. [Form [Component id = postback]]
4. [TextField [Component id = navigatorAppName]]
5. [TextField [Component id = navigatorAppVersion]]
6. [TextField [Component id = navigatorAppCodeName]]
7. [TextField [Component id = navigatorCookieEnabled]]
8. [TextField [Component id = navigatorJavaEnabled]]
9. [TextField [Component id = navigatorLanguage]]
10. [TextField [Component id = navigatorPlatform]]
11. [TextField [Component id = navigatorUserAgent]]
12. [TextField [Component id = screenWidth]]
13. [TextField [Component id = screenHeight]]
14. [TextField [Component id = screenColorDepth]]
15. [TextField [Component id = utcOffset]]
16. [TextField [Component id = utcDSTOffset]]
17. [TextField [Component id = browserWidth]]
18. [TextField [Component id = browserHeight]]
19. [TextField [Component id = hostname]]

这些组件中的大多数都在BrowserInfoForm中,并且实际上需要表单来收集信息。

“link”和“postback”组件位于BrowserInfoPage中,因此如果您将其子类化,则必须位于html标记中。

BrowserInfoPage标记可能因wicket版本略有不同(但可能不多)。我的是:

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html xmlns:wicket="http://wicket.apache.org">
    <head>
        <meta wicket:id="meta" http-equiv="refresh" />
    </head>
    <body onload="javascript:submitform();">
        If you see this, it means that both javascript and meta-refresh are not support by
        your browser configuration. Please click <a wicket:id="link" href="#">this link</a> to
        continue to the original destination.
        <div wicket:id="postback"></div>
    </body>
</html>

为了完成收集客户信息的工作,您的标记需要包含<body onload="javascript:submitform();">以及“回发”部分中的表单本身。

您所看到的可能是“如果您看到这个......”的消息。在我尝试重现您的问题时,我从未见过这个,但我怀疑它可能会在刷新/重定向到原始目标之前显示一段时间。您可以通过在“CustomBrowserInfoPage.html”中使用类似的东西来消除它:

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html xmlns:wicket="http://wicket.apache.org">
<head>
    <meta wicket:id="meta" http-equiv="refresh" />
</head>
<body onload="javascript:submitform();">
<a wicket:id="link" href="#"></a>
<div wicket:id="postback"></div>
</body>
</html>

如果BrowserInfoForm中的任何字段可见,隐藏它们会更加混乱。但我认为他们无论如何也不会表现出来。

请注意,如果您执行此操作,禁用JavaScript的人将看到一个空白页面,无法访问您的真实页面。这就是消息和“链接”的原因。