如何使用xe:jsonRpcService?

Nav*_*een 2 xpages xpages-extlib

我正在尝试使用扩展库组件Remote Service(xe:jsonRpcService).我从这里这里得到了一些提示.基本上我试图使用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>
Run Code Online (Sandbox Code Playgroud)

我在这里做的是,我创建了Remote Service(service),我保存当前文档(document1).它保存文档但不保存值inputText1.此外,当我尝试打印inputText1它的值显示在控制台上,但它没有得到保存.

这是正确的方法吗?或者我在这里遗漏了一些东西.还有什么情况下使用xe:jsonRpcService是合理的?

Tim*_*ony 12

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

  1. 此服务组件设计为尽可能轻量级,因此,与XPage中的标准事件(自动发布整个HTML表单)不同,它发送调用方法所需的数据,并仅接收方法返回的数据.在您的示例中,该方法不带参数,因此它实际上只是为服务器发送足够的信息以了解要调用的方法; 类似地,你只是返回一个布尔值,所以这就是所有将被发回的.如果您使用浏览器的开发工具(即Firebug或Chrome中的内置工具)来检查网络流量,您会看到这反映在每个方向发送的JSON数据包中.因此,服务器不会"知道"您未明确"告知"它的任何内容.所以它比典型的事件更快,因为你没有发布任何与你正在调用的方法没有明确相关的东西......但是你必须故意发送方法确实需要的所有内容才能运行.
  2. 组件关注性能的另一个副作用是它在JSF生命周期结束时跳过组件树序列化.如果您将当前页面保留在内存中,这应该不是问题,但如果您使用默认选项(将所有页面保存到磁盘),服务器将"忘记"对页面所做的任何更改在方法调用期间.您可以直接告诉视图根序列化的国家明确覆盖的情况下,逐个这种行为,但人们很容易忘记,你必须手动做到这一点,这通常会导致很多的挫折,当你看到迹象服务器它正在做它应该做的事情,但实际的网页并没有反映出这一点.最好只将任何RPC方法视为"只读"操作,除非你确定你会永远记住这种奇怪的副作用并理解如何规避它.

我的建议是将JSON-RPC视为"SOAP减去愚蠢".更礼貌地说,它在概念上与Web服务相同,但没有Web服务的复杂性.因此,这些类型的服务对于在当前页面的上下文中有用的数据操作是理想的,而不明确地与当前页面的状态相关联.

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

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

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