Как использовать xe:jsonRpcService?
Я пытаюсь использовать компонент библиотеки расширений 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>
Что я сделал здесь, так это то, что я создал Remote Service (service
) где я сохраняю текущий документ (document1
). Сохраняет документ, но не сохраняет значение в inputText1
, Кроме того, когда я пытаюсь напечатать значение inputText1
он отображается на консоли, но не сохраняется.
Это правильный способ сделать это? Или я что-то здесь упускаю. Также, что было бы несколько сценариев, где использование xe:jsonRpcService
будет оправданным?
1 ответ
Есть (как минимум) две причины, по которым следует избегать использования JSON-RPC для этого типа операций:
- Этот сервисный компонент разработан как можно более легким, поэтому, в отличие от стандартных событий в XPages (которые автоматически публикуют всю HTML-форму), он отправляет только данные, необходимые для вызова метода, и получает только данные, возвращенные методом. В вашем примере метод не принимает аргументов, поэтому он буквально просто посылает достаточно информации, чтобы сервер знал, какой метод вызывать; аналогично, вы просто возвращаете логическое значение, так что это буквально все, что будет отправлено обратно. Если вы используете инструменты разработки вашего браузера (например, Firebug или встроенные инструменты в Chrome) для проверки сетевого трафика, вы увидите это в пакетах JSON, которые отправляются в каждом направлении. В результате сервер не "знает" ничего, что вы явно не "говорите" ему. Так что это быстрее, чем обычное событие, потому что вы не публикуете ничего, что не имеет явного отношения к вызываемому методу... но вы должны преднамеренно отправлять все, что нужно методу для запуска.
- Еще одним побочным эффектом концентрации компонента на производительности является то, что он пропускает сериализацию дерева компонентов в конце жизненного цикла JSF. Если вы сохраняете текущую страницу в памяти, это не должно вызывать проблем, но если вы используете опцию по умолчанию (сохранить все страницы на диске), сервер "забудет" обо всех изменениях, внесенных в страницу. во время вызова метода. Вы можете явно переопределить это поведение в каждом конкретном случае, напрямую сказав корню представления, чтобы сериализовать его состояние, но легко забыть, что вы должны делать это вручную, что обычно вызывает большое разочарование, когда вы видите сервер индикации -то, что он делает то, что должен, но реальная веб-страница не отражает это. Лучше всего просто рассматривать любой метод RPC как операцию "только для чтения", если вы не уверены, что всегда будете помнить этот странный побочный эффект и понимать, как его обойти.
Мой совет - думать о JSON-RPC как о "SOAP минус глупый". Говоря более вежливо, он концептуально идентичен веб-службам, но не имеет всей сложности веб-служб. Как таковые, эти типы сервисов идеальны для операций с данными, которые полезны в контексте текущей страницы без явной привязки к состоянию текущей страницы.
Вот несколько примеров операций, в которых может быть полезен метод JSON-RPC:
- Информирование нового пользователя о том, что имя пользователя, которое он выбирает для своей новой учетной записи, уже занято. Вместо того, чтобы связывать стандартное событие keyup, которое будет отправлять всю форму, отправлять только значение одного поля в службу, запрашивать его в записях регистрации сайта и возвращать логическое значение.
- Живой опрос связанных данных, которые подвержены частым обновлениям. Предположим, вы разрабатываете CRM и хотите отобразить цену акций компании, чей аккаунт вы просматриваете. Использование setInterval для периодического запроса у RPC обновленной цены акций, а затем ручное манипулирование DOM на стороне клиента в случае изменения цены снова позволяет выполнить несколько сложную операцию с минимальными затратами сети.
Это не означает, что вы не можете использовать RPC для операций записи... но для любой операции, которая нуждается в полном, актуальном контексте (то есть текущем значении каждого поля на текущей странице) для правильной работы, стандартный обработчик событий почти всегда лучший подход.