0

我有一个重复控件,它为我生成一个指向不同数据库中文档的链接列表。此任务的特殊之处在于 XPage 在notes 内部浏览器(不是 XPniC)中运行,并在notes 客户端(不是Xpages)中将文档作为真正的notes 文档打开。到目前为止,一切正常。现在我也想在打开文档之前检查文档是否存在。

我的解决方案是一个 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

我希望能得到一些有用的帮助——我已经在这个问题上浪费了很多时间。我认为这应该很简单。:/

4

3 回答 3

1

问题是 XPages 引擎不知道notes:// url 格式。在内部,给定的 URL 参数将使用java.net.URL进行转换,这会引发错误。

也许您可以发送自己的 HTTP 标头来重定向到notes:// URL。

编辑:

这应该可以解决问题:

}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();
}
于 2013-07-30T10:47:07.227 回答
1

您的问题是您正在尝试进行服务器端重定向。

而不是 facesContext.getExternalContext().redirect(url);

试试这个 view.postscript('window.location.href="+url+"')

改为使重定向客户端

于 2013-07-30T10:47:07.307 回答
0

我想到了。

主要问题是在后端函数中调用 CSJS 进行重定向。当然 ssjsfacesContext.GetExternalContext().redirect(url)无法处理我的笔记 url (notes://...)。

Frederic Norling 的一个提示是使用view.postscript('window.location.href="+url+"'),但此功能仅支持 Notes/Domino 8.5.3+(遗憾的是我们使用 8.5.2)。

我发现了EventHandler-事件“onComplet()”,这启发了我。现在我创建一个带有 onClick()- 事件的 Link 组件:

    <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 上,我有一个 ID 为“refreshcheckDoc”的面板,在这个面板上我有两个隐藏字段。
第一个字段从 requestScope.url 获取他的值,
另一个从 requestScope.ErrorMessage 获取。
在 onClick()- 事件上,我附加了 onComplet()- 事件。
在 onComplet()- 事件中,我检查了两个字段的内容。
url 是空的吗?errorMessage 我什么都不做。如果我有我调用的 url window.location.redirect(url)
如果我有 ErrorMessage,我会使用 alert() 函数来通知用户错误。

感谢你的帮助。
我希望这个简短的描述对其他人也有帮助。

于 2013-08-01T08:02:22.080 回答