我正在启用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的组件列表。我明白,它从超类中抓取那些组件。但是我怎么能摆脱这一切呢?
答案 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的人将看到一个空白页面,无法访问您的真实页面。这就是消息和“链接”的原因。