gpt4 book ai didi

xpages - 如何使用xe :jsonRpcService?

转载 作者:行者123 更新时间:2023-12-02 05:52:15 25 4
gpt4 key购买 nike

我正在尝试使用扩展库组件远程服务 (xe:jsonRpcService)。我从 here 得到了一些提示和 here .基本上我正在尝试使用 RPC 保存文档。问题是文档已保存,但它不保存 XPage 上存在的任何字段。下面是示例 XPage 代码:

<?xml version="1.0" encoding="UTF-8"?>
<xp:view xmlns:xp="http://www.ibm.com/xsp/core" xmlns:xe="http://www.ibm.com/xsp/coreex">
<xp:this.data>
<xp:dominoDocument var="document1" formName="Test"></xp:dominoDocument>
</xp:this.data>
<xe:jsonRpcService id="jsonRpcService1" serviceName="service">
<xe:this.methods>
<xe:remoteMethod name="saveDoc">
<xe:this.script><![CDATA[print(">> " + getComponent("inputText1").getValue());
document1.save();
return true;]]></xe:this.script>
</xe:remoteMethod>
</xe:this.methods>
</xe:jsonRpcService>
<xp:br></xp:br>
<xp:inputText id="inputText1" defaultValue="testValue" value="#{document1.testField}"></xp:inputText>
<xp:br></xp:br>
<xp:button value="Save" id="button1">
<xp:eventHandler event="onclick" submit="false">
<xp:this.script><![CDATA[var deferred = service.saveDoc();
deferred.addCallback(
function(result) {
alert(result);
}
);]]></xp:this.script>
</xp:eventHandler>
</xp:button>
</xp:view>

我在这里所做的是,我在保存当前文档 (document1) 的地方创建了远程服务 (service)。它保存文档但不保存 inputText1 中的值。此外,当我尝试打印 inputText1 的值时,它显示在控制台上,但未保存。

这是正确的做法吗?或者我在这里遗漏了什么。还有哪些场景可以证明使用 xe:jsonRpcService 是合理的?

最佳答案

避免为此类操作使用 JSON-RPC 有(至少)两个原因:

  1. 此服务组件被设计为尽可能轻量级,因此,与 XPages 中的标准事件(自动发布整个 HTML 表单)不同,它发送调用方法所需的数据,并且只接收方法返回的数据。在您的示例中,该方法不带任何参数,因此它实际上只是发送足够的信息让服务器知道要调用什么方法;同样,您只是返回一个 bool 值,所以这实际上就是所有将被发回的值。如果您使用浏览器的开发工具(即 Firebug 或 Chrome 中的内置工具)来检查网络流量,您会看到这反射(reflect)在每个方向发送的 JSON 数据包中。结果,服务器不会“知道”您没有明确“告诉”它的任何事情。所以它比典型的事件要快,因为你没有发布任何与你正在调用的方法没有明确相关的东西......但你必须有意发送方法需要的一切命令运行。
  2. 组件注重性能的另一个副作用是它跳过了 JSF 生命周期结束时的组件树序列化。如果您将当前页面保存在内存中,那应该不是问题,但是如果您使用默认选项(将所有页面保存到磁盘),服务器将“忘记”对该页面所做的任何更改在方法调用期间。您可以通过直接告诉 View 根序列化其状态来根据具体情况明确地覆盖此行为,但是很容易忘记您必须手动执行此操作,这通常会在您看到指示服务器时造成很多挫败感- 它正在做它应该做的事情,但实际的网页并没有反射(reflect)出这一点。最好将任何 RPC 方法都视为“只读”操作,除非您确定自己会始终记住这种奇怪的副作用并了解如何规避它。

我的建议是将 JSON-RPC 视为“减去愚蠢的 SOAP”。用更礼貌的措辞,它在概念上等同于 Web Services ,但没有 Web 服务的所有复杂性。因此,这些类型的服务非常适合在当前页面的上下文中有用的数据操作,而无需明确绑定(bind)到当前页面的状态

以下是一些可能对 JSON-RPC 方法有用的操作示例:

  • 通知新用户他们为新帐户选择的用户名是否已被占用。不要绑定(bind)将发布整个表单的标准 keyup 事件,而是仅将一个字段的值发送到服务,根据站点注册记录查询它,然后发回一个 bool 值。
  • 对易于频繁更新的相关数据进行实时轮询。假设您正在开发 CRM,并且您想要显示您正在查看其帐户的公司的股票价格。使用 setInterval 定期向 RPC 询问更新后的股票价格,然后在价格发生变化时手动执行客户端 DOM 操作,再次允许您以最小的网络开销执行稍微复杂的操作。

这并不意味着您不能将 RPC 用于写操作...但是对于任何需要完整的、最新的上下文(即每个当前页面上的字段)正确运行,标准事件处理程序几乎总是更好的方法。

关于xpages - 如何使用xe :jsonRpcService?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11356227/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com