Xpages 如何使用xe:jsonRpcService?

Xpages 如何使用xe:jsonRpcService?,xpages,xpages-extlib,Xpages,Xpages Extlib,我正在尝试使用扩展库组件远程服务()。我从和那里得到了一些提示。基本上,我正在尝试使用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.da

我正在尝试使用扩展库组件远程服务()。我从和那里得到了一些提示。基本上,我正在尝试使用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>

我在这里所做的是,我创建了远程服务(
Service
),在其中保存当前文档(
document1
)。它保存文档,但不保存
inputext1
中的值。另外,当我尝试打印
inputext1
的值时,它会显示在控制台上,但不会保存

这样做对吗?或者我在这里遗漏了什么。另外,在某些情况下,使用
xe:jsonRpcService
是合理的吗?

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

  • 此服务组件设计为尽可能轻量级,因此,与XPages中的标准事件(自动发布整个HTML表单)不同,它只发送调用该方法所需的数据,只接收该方法返回的数据。在您的示例中,该方法不带参数,因此它实际上只是发送足够的信息,让服务器知道要调用哪个方法;类似地,您只是返回一个布尔值,所以这就是将返回的所有内容。如果您使用浏览器的开发工具(即Firebug或Chrome中的内置工具)来检查网络流量,您将在每个方向发送的JSON数据包中看到这一点。因此,服务器不“知道”任何您没有明确“告诉”它的事情。因此,它比典型事件更快,因为您没有发布任何与您正在调用的方法无关的内容。。。但是您必须有意地发送方法运行所需的所有内容
  • 组件关注性能的另一个副作用是,它在JSF生命周期结束时跳过了组件树序列化。如果您将当前页面保留在内存中,这应该不是问题,但是如果您使用默认选项(将所有页面保存到磁盘),服务器将“忘记”在方法调用期间对页面所做的任何更改。通过直接告诉视图根目录序列化其状态,您可以在个案基础上显式重写此行为,但很容易忘记您必须手动执行此操作,当您看到服务器端指示它正在做它应该做的事情,但实际的web页没有反映这一点时,这通常会导致很多挫折。最好只将任何RPC方法视为“只读”操作,除非您确定自己将始终记住这个奇怪的副作用,并了解如何规避它
  • 我的建议是将JSON-RPC想象成“SOAP减去愚蠢”。更礼貌地说,它在概念上与Web服务相同,但没有Web服务的所有复杂性。因此,这些类型的服务非常适合于在当前页面上下文中有用的数据操作,而无需显式地绑定到当前页面的状态

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

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

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

    感谢Tim的详细解释。