- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
我正在构建一个 Wicket 网络应用程序,它必须处理大量并发请求。我已经设置了一个测试环境和一些 jmeter 脚本来进行负载测试,我注意到如果我使大多数页面无状态,我可以减少应用程序的 CPU 和内存占用。
我已将代码添加到最大页面的 onBeforeRender() 方法,以显示哪些组件导致我的页面处于有状态状态。这是我用于检测的代码:
@Override
protected void onBeforeRender() {
if (!getSession().isTemporary()) {
visitChildren(Component.class, new IVisitor<Component>() {
@Override
public Object component(Component component) {
String pageClassName = AbstractStatelessBasePage.this.getClass().getName();
if (!component.isStateless()) {
String msg = pageClassName+" is stateful because of stateful component " + component.getClass().getName() + " with id " + component.getId() + ".";
List<IBehavior> behaviourList = component.getBehaviors();
for (IBehavior iBehavior : behaviourList) {
if (!iBehavior.getStatelessHint(component)) {
msg += "\n\t" + "The component has stateful behaviour: " + iBehavior.getClass().getName();
}
}
LOG.error(msg);
}
checkedPages.add(pageClassName);
return CONTINUE_TRAVERSAL;
}
});
}
}
在输出中我看到有状态行为是由页面中一些现有组件使用的 AjaxLinks 引起的:
ERROR - AbstractStatelessBasePage$1.component(45) | HomePage is stateful because of stateful component InfoGrid$InfoButton with id infoButton.
The component has stateful behaviour: org.apache.wicket.ajax.markup.html.AjaxLink$1
我尝试在几个地方添加返回“true”的 getStatelessHint() 方法,但它似乎没有帮助。我还检查了 AjaxLink 的 Wicket 源代码、它的父类(super class)和一些周边代码,但我似乎无法发现为什么 AjaxLink 在所有情况下都需要有状态。
在我的例子中,AjaxLink 位于一个无状态页面中,并且链接不存储状态。我怎样才能让 Wicket 明白这个 AjaxLink 可以是无状态的?
感谢您的帮助,罗尔夫
编辑:已接受的答案适用于 Wicket 1.4.19。
在 maven pom.xml 中添加了以下内容:
<dependency>
<groupId>com.jolira</groupId>
<artifactId>wicket-stateless</artifactId>
<version>1.0.8</version>
</dependency>
将所有扩展“AjaxLink”的组件更改为扩展“StatelessAjaxFallbackLink”。
不要忘记将以下内容添加到您的 WicketApplication 类中,它将为您节省一些故障排除时间:
@Override
protected IRequestCycleProcessor newRequestCycleProcessor() {
return new StatelessWebRequestCycleProcessor();
}
请注意,出于某种原因,StatelessForm 和其他无状态的东西在转发器(如“ListView”)中不起作用。
最佳答案
当您向页面添加 Ajax 行为(AjaxLink 使用 AjaxEventBehavior)时,页面将变为有状态的。这是因为当您单击链接时,Wicket 会尝试在服务器上查找页面实例,然后在其中查找链接组件,最后执行其回调方法 - 例如点击()。如果不存储页面,就无法找到 ajax 行为实例并执行其回调方法。
您可以使用 Jolira 的 Ajax 行为和组件 (https://github.com/jolira/wicket-stateless)。它们的工作方式有点不同——当您单击 Jolira 的 AjaxLink 时,Ajax 调用会创建一个全新的页面实例,在其中找到新创建的 StatelessAjaxLink,执行其回调方法,最终使用 AjaxRequestTarget 为 Ajax 响应添加组件/javascript 和丢弃新创建的页面实例(它被垃圾收集)。下一个 Ajax 请求对一个全新的页面实例执行相同的操作。
有人会问“为什么 Jolira 的代码不在 Wicket 核心中?” - 因为它给出了部分解决方案。例如:点击 statelessAjaxLink1 创建一个新的 Page,在 PanelA 被 PanelB 替换的 StatelessAjaxLink 的新实例上执行 onClick(),并将这个面板(PanelB)添加到 AjaxRequestTarget。简而言之:单击此链接会替换页面中面板的主体。如果 PanelB 本身有一个 StatelessAjaxLink2,那么这个链接是找不到的。为什么 ?因为点击它会创建一个新的 Page 实例,而这个新实例将有 PanelA,而不是 PanelB,因此无法找到 StatelessAjaxLink2 来执行它的 onClick() 方法。
如果您的场景足够简单并且 Jolira 的组件涵盖了您的场景,那么请使用它们。请注意,更复杂的场景可能会失败。
关于java - 如何使 Wicket 的 "AjaxLink"无状态?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10582601/
过去,我为我的表单构建了如下标签: : 我还需要使用wicket:label吗?标签?我没有使用 wicket:label在 wicket 7 中,它似乎工作正常。我可能不理解使用 wicket:la
是否可以为 MarkupContainer 生成标记?动态地,即不为其存储 HTML 文件? 我考虑将标记作为纯字符串从数据库中读取,以提供类似 CMS 的功能。 最佳答案 有趣的问题,我不确定这是否
是否有适用于 Wicket 1.5 的有效、支持和维护的脚手架解决方案?我知道 Wicketopia 位于两个不同地点 sourceforge和 github但这仍然针对 wicket 1.4,带来了
我想了解一些关于 wicket 支持泛型模型的信息。我了解了模型、 Prop 模型和 Prop 复合模型。 但是 Model 类呢?如果我这样做会发生什么: Label label = new Lab
如何在 Wicket 中实现多选下拉。我能够使用 bootstrap 创建多选下拉 View ,但我无法获得如何将所选选项与下拉组件的 IModel 相关联? Wicket 有没有可能?我不想使用 L
我正在使用 wicket 1.4.9 并实现了 spring + wicket auth-role 并根据页面上的角色使用@AuthorizeInstantiation。我有多个自定义角色。 我已经按
如何在 Wicket 1.5 中执行以下操作? page.getRequestCycle().setRequestTarget(new RedirectRequestTarget("http://ww
我想用密码保护 Wicket 中的网页,以便用户只有在他/她登录后才能访问它。 我还希望该页面显示登录页面,然后在登录用户试图访问的原始页面后。 这是如何用 wicket 完成的?我已经创建了一个登录
我使用的是 wicket 1.5,但在 getClientInfo() 方法中看不到 (WebRequest)RequestCycle.get().getRequest() 我在另一个地方看到了这段代
我刚刚尝试了 Apache Wicket“Hello, world”应用程序,我注意到在呈现的 HTML 输出中,Wicket 暴露了它的内部属性。 这是呈现的 HTML 在浏览器的“查看源代码”中的
我找不到像 wicket:include 之类的 wicket 标签?谁能建议我什么?我想在 html 文件中包含/注入(inject)原始源代码?如果没有这样的实用程序,有什么建议来开发它吗? 更新
在页面中查找特定(已知 wicket id)Wicket 组件的方法是什么? 最佳答案 您的选择是: get()搜索一个组件的方法 特定路径上的组件。 安 iterator()在拥有他所有 child
我正在为 wicket 页面编写测试。我的页面上有三个下拉菜单。根据从下拉列表中选择的值,面板会被渲染(面板包含一个数据表)。 如何更改 wicket 测试中下拉菜单的值,以便我可以针对所选值的不同组
在我的 wicket 应用程序中,有一些页面供用户使用,具体取决于他们的角色和不同的标准。在我的数据库中,我存储了用作该用户背景的图像路径。每个用户都有一个独特的页面。我知道我可以添加读取图像,如果我
如何在 Wicket 中定义我自己的反馈消息? 例如:如果我提供了一个错误的用户名,我想得到一个错误信息,如“用户名不正确,请尝试再次登录”。而不是使用默认的错误消息。 一个例子会是什么样的? 最佳答
假设我想要 3 个不同的 *.html 用于 WebPage。 F.e. page_small.html、page_tablet.html、page_desktop.html。我如何解析 screen
我无法确定 Wicket 应用程序中 RuntimeException 的原因。我设置了许多断点,但是当我提交表单时,只有在加载表单时,没有一个断点被触发。这是堆栈: WicketMessage: N
我刚刚编写了我的第一个 Wicket 组件 :) 它包含一个 ListView 和一些 Radio 输入字段。现在我想对所选值是否进入模型进行单元测试。 由于 WicketTester.newForm
我的类属性有两个 CSS 类值。 HTML 开头是这样的: 我想动态地把它改成这样: 目前我正在这样做: component.add(new SimpleAttributeModifier("cl
我有一个使用 PropertyModel 的文本字段,如下所示: TextField ageField = new TextField("age", new
我是一名优秀的程序员,十分优秀!