如何使 Wicket 的“AjaxLink”无状态?

2023-11-21

我正在构建一个 Wicket Web 应用程序,该应用程序必须处理大量并发请求。我已经设置了一个测试环境和一些 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;
            }
        });
    }
}

在输出中,我看到有状态行为是由页面中某些现有组件使用的 AjaxLink 引起的:

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 源代码、它的超类和一些周围的代码,但我似乎无法发现为什么 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 会尝试在服务器上查找页面实例,然后找到其中的链接组件,最后执行其回调方法 - 例如onClick()。如果不存储页面,就无法找到ajax行为实例并执行其回调方法。

您可以使用 Jolira 的 Ajax 行为和组件 (https://github.com/jolira/wicket-stateless)。它们的工作方式有点不同 - 当您单击 Jolira 的 AjaxLink 时,Ajax 调用会创建一个全新的页面实例,在其中找到新创建的 StatelessAjaxLink,执行其回调方法,最终使用 AjaxRequestTarget 为 Ajax 响应添加组件/javascript 并丢弃新创建的页面实例(它被垃圾收集)。下一个 Ajax 请求对全新的页面实例执行相同的操作。

有人会问“为什么 Jolira 的代码不在 Wicket 核心中?” - 因为它给出了部分解决方案。例如:单击 statelessAjaxLink1 创建一个新页面,在 StatelessAjaxLink 的新实例上执行 onClick(),其中将 PanelA 替换为 PanelB,并将此面板 (PanelB) 添加到 AjaxRequestTarget。简而言之:单击此链接将替换页面中面板的正文。如果PanelB内部有一个StatelessAjaxLink2,那么这个链接是找不到的。为什么 ?因为点击它会创建一个新的Page实例,而这个新实例将有PanelA,而不是PanelB,因此无法找到StatelessAjaxLink2来执行其onClick()方法。

如果您的场景足够简单并且 Jolira 的组件可以满足您的需求,那么就使用它们。请注意,更复杂的场景可能会失败。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何使 Wicket 的“AjaxLink”无状态? 的相关文章

  • Java Try Catch Final 没有 Catch 的情况下会阻塞

    我正在审查一些新代码 该程序只有一个 try 和一个 finally 块 既然排除了 catch 块 那么如果 try 块遇到异常或任何可抛出的内容 它如何工作 它直接进入finally块吗 如果 try 块中的任何代码可以引发已检查异常
  • 将 jar 作为 Linux 服务运行 - init.d 脚本在启动应用程序时卡住

    我目前正在致力于在 Linux VM 上实现一个可运行的 jar 作为后台服务 我已经使用了找到的例子here https gist github com shirish4you 5089019作为工作的基础 并将 start 方法修改为
  • 添加动态数量的监听器(Spring JMS)

    我需要添加多个侦听器 如中所述application properties文件 就像下面这样 InTopics Sample QUT4 Sample T05 Sample T01 Sample JT7 注意 这个数字可以多一些 也可以少一些
  • 如何在spring mvc中从控制器名称+操作名称获取映射的URL?

    是否有现有的解决方案可以从 Spring MVC3 中的 控制器名称 操作名称 获取映射的 URL 例如 asp net mvc 或 Rails 中的 UrlHelper 我觉得非常有用 thx 也许 你想要这样的东西 in your Co
  • Spring安全“记住我”cookie在第一个请求中不可用

    我无法在登录请求后检索 Spring 记住我 cookie 但它在对受保护页面的下一个请求中工作正常 谁能告诉我怎样才能立即得到它 我在登录请求中设置了记住我的 cookie 但在 Spring 重定向回原始 受保护的 url 后无法检索它
  • Java:使用 HttpURLConnection 的 HTTP PUT

    如何执行 HTTP PUT 我正在使用的类似乎认为它正在执行 PUT 但端点将其视为我执行了 GET 我做错了什么吗 URL url new URL https HttpURLConnection conn HttpURLConnectio
  • Condition 接口中的 signalAll 与对象中的 notificationAll

    1 昨天我才问过这个问题条件与等待通知机制 https stackoverflow com questions 10395571 condition vs wait notify mechanism 2 我想编辑相同的内容并在我的问题中添加
  • Java套接字:在连接被拒绝异常时重试的最佳方法?

    现在我正在这样做 while true try SocketAddress sockaddr new InetSocketAddress ivDestIP ivDestPort downloadSock new Socket downloa
  • 如何获取 WebElement 的父级[重复]

    这个问题在这里已经有答案了 我试过了 private WebElement getParent final WebElement webElement return webElement findElement By xpath 但我得到
  • RSA OAEP、Golang 加密、Java 解密 -BadPaddingException:解密错误

    我正在尝试解密使用 RSA OAEP 在 Golang 中加密的字符串 但出现 BadPaddingException 解密错误 很难弄清楚我错过了什么 这是Golang加密方法 func encryptString rootPEM io
  • Git 无法识别重命名和修改的包文件

    我有一个名为的java文件package old myfile java 我已经通过 git 提交了这个文件 然后我将我的包重命名为new所以我的文件在package new myfile java 我现在想将此文件重命名 和内容更改 提交
  • 如何记录来自 Akka (Java) 的所有传入消息

    在 Scala 中 您可以使用 LoggingReceive 包装接收函数 如何通过 Java API 实现相同的目标 def receive LoggingReceive case x do something Scala API 有Lo
  • Android Studio 将音乐文件读取为文本文件,如何恢复它?

    gameAlert mp3是我的声音文件 运行应用程序时 它询问我该文件不与任何文件类型关联 请定义关联 我选择TextFile错误地 现在我的音乐文件被读取为文本文件 我如何将其转换回music file protected void o
  • 如何配置 WebService 返回 ArrayList 而不是 Array?

    我有一个在 jax ws 上实现的 java Web 服务 此 Web 服务返回用户的通用列表 它运行得很好 Stateless name AdminToolSessionEJB RemoteBinding jndiBinding Admi
  • 解析输入,除了 System.in.read() 之外不使用任何东西

    我很难找到具体的细节System in read 有效 也许有人可以帮助我 似乎扫描仪会更好 但我不允许使用它 我被分配了一个任务 我应该以 Boolean Operator Boolean 的形式读取控制台用户输入 例如T F 或 T T
  • 将图像添加到自定义 AlertDialog

    我制作了一个 AlertDialog 让用户可以从我显示的 4 个选项中选择一个 前 3 个让他们在单击号码时直接拨打号码 第 4 个显示不同的视图 现在看起来是这样的 由于第四个选项的目的是不同的任务 我想让它看起来不同 因为用户可能会感
  • JVM:是否可以操作帧堆栈?

    假设我需要执行N同一线程中的任务 这些任务有时可能需要来自外部存储的一些值 我事先不知道哪个任务可能需要这样的值以及何时 获取速度要快得多M价值观是一次性的而不是相同的M值在M查询外部存储 注意我不能指望任务本身进行合作 它们只不过是 ja
  • Java的-XX:+UseMembar参数是什么

    我在各种地方 论坛等 看到这个参数 并且常见的答案是它有助于高并发服务器 尽管如此 我还是找不到 sun 的官方文档来解释它的作用 另外 它是Java 6中添加的还是Java 5中存在的 顺便说一句 许多热点虚拟机参数的好地方是这一页 ht
  • Java:多线程内的 XA 事务传播

    我如何使用事务管理器 例如Bitronix http docs codehaus org display BTM Home JBoss TS http www jboss org jbosstm or Atomikos http www a
  • 在android中跟踪FTP上传数据?

    我有一个运行 Android 的 FTP 系统 但我希望能够在上传时跟踪字节 这样我就可以在上传过程中更新进度条 安卓可以实现这个功能吗 现在 我正在使用org apache common net ftp我正在使用的代码如下 另外 我在 A

随机推荐

  • 在 Azure WorkerRole 上运行 PowerShell 命令时出错

    我正在尝试在 Windows Azure 角色上运行启动任务 cmd 脚本 这是命令文件脚本的两行 powershell command set executionpolicy Unrestricted powershell command
  • 使用sklearn在PCA中恢复explained_variance_ratio_的特征名称

    我正在尝试从使用 scikit learn 完成的 PCA 中恢复 which特征被选择为relevant IRIS 数据集的经典示例 import pandas as pd import pylab as pl from sklearn
  • Pyserial 缓冲区填充速度快于我的读取速度

    我正在通过串口以 921600 的波特率从微控制器读取数据 我正在读取大量 ASCII csv 数据 由于数据输入速度如此之快 缓冲区已被填满 所有其余数据都会在之前丢失我能读懂 我知道我可以手动编辑serialwin32的pyserial
  • android ExpandableListView如何设置组项目之间的空间

    我有可扩展列表视图 我想在组项之间添加填充 或边距 我使用margin botton在组项目上 它有效 但现在它也适用于组项目及其子项目 我想在组项目之间保留空格 而不是在组项目及其子项目之间保留空格 我的工作方式如下 主要XML
  • 如何中止 ASP.NET MVC 中的操作

    我想停止由jQuery ajax服务器端的方法 我可以使用停止 Ajax 请求 ajax abort 方法在客户端 但不在服务器端 Updated 我使用异步操作而不是同步操作 但我没有得到我想要的 如您所知 服务器无法同时处理多个请求 这
  • 嵌入图像不显示

    这是我在便携式项目中的页面
  • 如何获取 NLTK 中同义词集的词网语义频率?

    根据文档 我可以在 nltk 中加载带有语义标记的语料库 如下所示 gt gt gt from nltk corpus import wordnet ic gt gt gt brown ic wordnet ic ic ic brown d
  • 错误 1878 (HY000):临时文件写入失败

    我正在执行一个查询 修改表message添加列syncidint 10 非空默认 0 MySQL 返回错误 ERROR 1878 HY000 Temporary file write failure 消息表信息 引擎类型 InnoDB 行数
  • Excel 2007 - 根据文本生成唯一ID?

    我有一张工作表 其中 B 列中有一个名称列表 A 中有一个 ID 列 我想知道是否有某种公式可以获取该行 B 列中的值并根据文本生成某种 ID 每个名字也是独一无二的 不会以任何方式重复 如果我真的不必使用 VBA 那就最好了 但如果我必须
  • 集合、多重集、映射和多重映射如何在内部工作

    多组如何运作 如果集合不能将值映射到键 那么它是否只保存键 另外 关联容器如何工作 我的意思是向量和双端队列在内存中是按顺序定位的 这意味着如果它们很大 则删除 删除 除了开始 双端队列 和结束 向量 双端队列 会很慢 列表是一组不按顺序位
  • 我为什么要关心 Java 没有具体化泛型?

    这是我最近在一次采访中提出的一个问题 因为候选人希望看到 Java 语言中添加一些内容 这通常被认为是 Java 所没有的痛苦具体化泛型但是 当我催促时 这位候选人实际上无法告诉我 如果他们在那里 他可以实现哪些目标 显然 因为 Java
  • 从 C# 读取 protobuf3 自定义选项

    TL DR 根据文档 如果我正在使用 C 我可以使用读取自定义选项的值string value MyMessage descriptor gt options GetExtension my option Java 和 Python 也有类
  • 时间戳最大值

    我在 Windows 10 x64 上使用 Python 3 6 0 我刚刚发现在time ctime seconds seconds参数有一个隐含的最大值 即 32536799999 几乎等于2 34 92135 这是最大值吗 错误消息只
  • 使用 sed (或类似的东西)修改变量的内容

    我编写了一个 BASH 文件 其中包含以下形式的多个嵌入式循环 for P in 0 10 0 20 0 90 1 00 do for Q in 0 10 0 20 0 90 1 00 do 我使用这些变量作为命令行应用程序的参数 并直接在
  • 订阅 Facebook 页面动态实时更新

    我正在用 Scala 和 Play 编写一个 Facebook 应用程序 我想要实时更新用户源和该用户管理的页面源 所以我订阅了这些 这是从 GET my app id subscriptions 返回的内容 data object use
  • 如何在 SQL Server 中生成正态分布的数字

    我正在尝试播种一些数据 是否有办法在 SQL Server 中生成遵循正态分布曲线的数字 例如 我将指定平均值 标准差和计数 然后我会得到一个数字列表 随机正态分布 UPDATE TABLE SET COLUMN CAST SQRT 2 L
  • 在 Mac OSX 上使用 Xcode4 部署和分发 OpenCV 应用程序

    我正在开发 OpenCV 应用程序 我的问题是如何在非开发机器 未安装 OpenCV 的机器 上部署和分发该应用程序 我在 Mac OS X Lion 上使用 Xcode4 和 OpenCV 2 2 thanks 这只是部分答案 因为我还没
  • Github Pages 404 除了index.html 之外的所有内容

    我有一个供我们团队使用的 Github 页面网站 http olinaeromarketing github io 我尝试在本地打开index html 它在我的电脑上的chrome 中完美运行 一切都很完美 然而 当我将所有内容推送到 G
  • Safari 表行渐变背景重复 Bug

    当我在 tr 标签中使用渐变背景时 它似乎在其他浏览器中正常工作 但似乎背景代码应用于 Safari 中的每个 td 标签 当您在 Safari 和其他浏览器中运行下面的示例代码时 您就会明白我的意思 有人对这个问题有解决方案建议吗 Chr
  • 如何使 Wicket 的“AjaxLink”无状态?

    我正在构建一个 Wicket Web 应用程序 该应用程序必须处理大量并发请求 我已经设置了一个测试环境和一些 jmeter 脚本来进行负载测试 我注意到如果我将大多数页面设置为无状态 我可以减少应用程序的 CPU 和内存占用 我已将代码添