Откройте NotesURL через перенаправление

У меня есть элемент управления повторением, который генерирует список ссылок на документы в другой базе данных. Особенностью этой задачи является то, что XPage работает во внутреннем браузере заметок (НЕ XPniC) и открывает документы как настоящие документы заметок в клиенте заметок (НЕ Xpages). пока все работает нормально. Теперь я тоже хочу проверить, существует ли документ, прежде чем открыть его.

Мое решение - это xAgent, который проверяет, существует ли документ, и перенаправляет на NotesURL, но я получаю следующую ошибку:

    Error source
    Page Name:/xaOpenDocument.xsp
    Exception
    Error while executing JavaScript action expression
    Script interpreter error, line=25, col=43: Error calling method 'redirect(java.lang.String)' on java class 'com.ibm.xsp.domino.context.DominoExternalContext'
    notes://SERVER01@SRV@DE@OU@MyCompany AG/__C1257B6B002A0472.nsf/0/C1257B6B002A0472C12574CD0024E6B9

Ссылка на xAgent выглядит так:

http://SERVER02/dev/release_4/test_xui.nsf/xaOpenDocument.xsp?dbServer=SERVER01%2FSRV%2FDE%2FOU%2FMyCompany+AG&dbPath=dev%5C%5Crelease_4%5C%5Ctest_adr&docUNID=C1257B6B002A0472C12574CD0024E6B9

Код xAgent выглядит следующим образом:

<?xml version="1.0" encoding="UTF-8"?>
<xp:view xmlns:xp="http://www.ibm.com/xsp/core" rendered="false">
    <xp:this.afterPageLoad><![CDATA[#{javascript:var server:string = context.getUrlParameter("dbServer");
var db:string = context.getUrlParameter("dbPath");
var unid:string = context.getUrlParameter("docUNID");

var url:string = "";

var targetDB:NotesDatabase = session.getDatabase(server,db);

var doc:NotesDocument = targetDB.getDocumentByUNID(unid);

if(doc == null){
    requestScope.put("targetDocUNID",unid);
        println("xaOpendocument targetDocUNID: " + unid);
    requestScope.put("dbServer",server);
        println("xaOpendocument dbServer: " + server);
    requestScope.put("dbPath",db);
        println("xaOpendocument dbPath: " + db);
    requestScope.put("targetError","Dokument konnte nicht geöffnet werde. \n Document wurde verschoben oder entfernt.");
    println("xaOpendocument URL: xpErrorMessage.xsp");
    context.redirectToPage("xpErrorMessage.xsp");
}else{
    url = sessionUser.getDocumentURL(targetDB,unid);
    println("xaOpendocument: Dokument wurde gefunden... Umleiten!");
    println("xaOpendocument URL: " + url);
    facesContext.getExternalContext().redirect(url);
}}]]></xp:this.afterPageLoad>
</xp:view>

Консоль сервера показывает мне следующие строки ошибок:

30.07.2013 11:17:47   HTTP JVM: xaOpendocument: Dokument wurde gefunden... Umleiten!
30.07.2013 11:17:47   HTTP JVM: xaOpendocument URL: notes://SERVER02@SRV@DE@OU@MyCompany AG/__C1257B6B002A0472.nsf/0/C1257B6B002A0472C12574CD0024E6B9
30.07.2013 11:17:47   HTTP JVM: com.ibm.xsp.webapp.FacesServlet$ExtendedServletException: com.ibm.xsp.exception.EvaluationExceptionEx: Error while executing JavaScript action expression
30.07.2013 11:17:47   HTTP JVM: CLFAD0134E: Exception processing XPage request. For more detailed information, please consult error-log-0.xml located in F:/Lotus/data/domino/workspace/logs

Я надеюсь на полезную помощь - я уже потратил много времени на эту проблему. Я думал, что это должно быть просто. :/


person Michael    schedule 30.07.2013    source источник


Ответы (3)


Ваша проблема в том, что вы пытаетесь выполнить перенаправление на стороне сервера.

вместо FaceContext.getExternalContext().redirect(url);

попробуйте этот view.postscript('window.location.href="+url+"')

Вместо этого сделать перенаправление на стороне клиента

person Fredrik Norling    schedule 30.07.2013
comment
Я пытался заменить свои FaceContext.getExternalContext().redirect(url); с view.postscript, но появляется следующее сообщение: Ошибка при выполнении выражения действия JavaScript Ошибка интерпретатора скрипта, строка = 29, столбец = 9: Неизвестный элемент 'postScript' в классе Java 'com.ibm.xsp.component.UIViewRootEx2' - person Michael; 30.07.2013
comment
Здорово! - Я знаю, почему это не работает с view.postScript... У меня есть сервер 8.5.2 в Backend... это новая функция в 8.5.3... и я не узнал об этом, потому что мой разработчик клиент 8.5.3 - Спасибо за подсказку, по крайней мере, я узнал кое-что интересное для будущего использования. :) - person Michael; 30.07.2013
comment
Вы можете обновить набор вычисляемых текстовых элементов управления для отображения html. И в этот элемент управления добавьте javascript, который делает перенаправление - person Fredrik Norling; 30.07.2013

Проблема в том, что XPages Engine не знает формат URL-адреса notes://. Внутри заданный параметр URL будет преобразован с помощью java.net.URL, и это вызовет ошибку.

Возможно, вместо этого вы можете отправить свои собственные HTTP-заголовки для перенаправления на URL-адрес notes://.

ИЗМЕНИТЬ:

Это должно помочь:

}else{
   url = sessionUser.getDocumentURL(targetDB,unid);
   println("xaOpendocument: Dokument wurde gefunden... Umleiten!");
   println("xaOpendocument URL: " + url);
   var resp:com.ibm.xsp.webapp.XspHttpServletResponse = facesContext.getExternalContext().getResponse();
   resp.setStatus( 302 );
   resp.addHeader("Location", url );
   facesContext.responseComplete();
}
person Sven Hasselbach    schedule 30.07.2013
comment
Спасибо - ошибки больше нет, но перенаправление тоже не работает. :/ - person Michael; 30.07.2013

Я понял.

Основная проблема заключалась в том, чтобы вызвать CSJS в внутренних функциях для перенаправления. Конечно, ssjs facesContext.GetExternalContext().redirect(url) не мог обработать URL-адрес моих заметок (notes://...).

Одним из советов Фредерика Норлинга было использование view.postscript('window.location.href="+url+"'), но эта функция поддерживается только в Notes/Domino 8.5.3+ (к сожалению, мы используем 8.5.2).

Просветление приходит с моим открытием EventHandler-Event "onComplet()". Теперь я создаю компонент Link с событием onClick():

    <xp:link escape="true" id="link1" tabindex="-1" style="font-weight:bold">
        <xp:this.text>MyLink</xp:this.text>
        <xp:eventHandler event="onclick" submit="true" 
            refreshMode="partial" refreshId="refreshCheckDoc">
            <xp:this.action>
                <![CDATA[#{javascript:<some code for checking my URL Target and write the URL in a requestScope variable when the target exist else I write a propper ErrorMessage in a requestScope Varaible>]]></xp:this.action>

На моем XPage у меня есть панель с идентификатором "refreshcheckDoc", и на этой панели у меня есть два скрытых поля.
Первое поле получает свое значение из requestScope.url
другое получает requestScope.ErrorMessage.
К событию onClick() я присоединил событие onComplete().
В событии onComplete() я проверяю содержимое двух полей.
Является ли URL-адрес пустым И сообщение об ошибке Я ничего не делаю. Если у меня есть URL-адрес, я вызываю window.location.redirect(url),
если у меня есть ErrorMessage, я использую функцию alert(), чтобы сообщить пользователю об ошибке.

Спасибо за всю вашу помощь.
Я надеюсь, что это краткое описание будет полезно и другим.

person Michael    schedule 01.08.2013