【问题标题】:Reuse web agents that PRINT to the browser in XPages Lotus重用在 XPages Lotus 中打印到浏览器的 Web 代理
【发布时间】:2015-02-17 17:14:46
【问题描述】:

在将经典 Domino 应用程序升级到 XPage 时,经常会出现一个特殊问题:“如何处理直接写回浏览器的现有代理中的 PRINT 语句?”我的 nsf 文件中有 200 个代理,它们都在其代码中使用 Print 语句。 我调查发现链接http://www.wissel.net/blog/d6plinks/SHWL-8SF7AH 但我无法更改代理代码,因为它也用于表单。 我必须在单击按钮时从 xpages 重新使用这些代理,并且还必须传递文档。 有什么方法或替代方案可以解决我的问题。 需要帮助。

我们有 Agent.runWithDocumentContext(doc:NotesDocument) 方法,它可以从 xpage 运行代理并传递内存中的文档。我创建了一个内存文件

   var doc = database.createDocument();
   doc.replaceItemValue("StartDate",startDate.getDateOnly())
   doc.replaceItemValue("EndDate",endDate.getDateOnly())
   doc.replaceItemValue("ReportName",reportName)
    var agent:NotesAgent = database.getAgent("("+reportName+")");

    agent.runWithDocumentContext(doc);   

我可以将此内存中的文档传递给代理。但是我目前面临的问题是,我的代理习惯于直接打印,这通过我假设的 xpage 是不可能的。 有没有其他方法可以将内存中的文档传递给代理并能够通过 xpages 直接打印到浏览器。 需要帮助请帮忙。

【问题讨论】:

    标签: xpages document lotus agents


    【解决方案1】:

    如果你想使用 XPages.. 那么 USE XPages... 意味着将代理迁移到 XPages 做事方式。 XPages 和 Notes Client 或者我认为甚至是 Classic Domino Web 之间可以有很多共存。但是,如果您打算保留 200 个不是 XPages 最佳实践的真正组成部分的代理,那么在我看来,您根本不应该使用 XPages。

    编辑: 这个链接: http://www-10.lotus.com/ldd/ddwiki.nsf/dx/XPages_and_Calling_Agents_Using_an_In-Memory_Document

    谈论从 XPages 调用代理并能够使用内存中的文档。也许这会有所帮助,但如果它被大量使用,性能将不会很好,因为代理会为每个呼叫加载和卸载。这样做仍然是个坏主意。

    【讨论】:

    • 是否有任何替代方法可以调用代理 Xpage -> Lotus Form -> 表单加载时的代理调用或代理可以在文档上下文中工作的任何其他方法。我可以使用从 xpage 到 lotus 表单的 url 参数在表单中创建文档。我们有 100 个数据库,因此更改每个数据库都不是正确的解决方案。我是 Xpages 的新手,任何帮助都会有很大帮助。
    • 我添加了一个指向如何从 xpages 调用代理的文档的链接。正确的解决方案是不要尝试以这种方式强制 XPages。这听起来像是一件坏事。
    【解决方案2】:

    创建一个调用您的代理的 java 类,并在输入流中读取代理的输出,并在 Xpages 的计算字段中显示该流。

    这是一个示例 java 类,它将从您的代理中检索输出

    package com.thomas;
    import java.io.BufferedReader;
    import java.io.IOException;
    import java.io.InputStreamReader;
    import java.net.MalformedURLException;
    import java.net.URL;
    
        public class getAgentData{
    
            public String getData() throws IOException {
                try {
                    URL url = new URL("http://localhost/mydatabase.nsf/myagent?openagent");
    
                    BufferedReader in = new BufferedReader(
                    new InputStreamReader(url.openStream()));
                    String content = new String();
                    String inputLine;
                    while ((inputLine = in.readLine()) != null) {
                        content+=inputLine;
                    }
                    in.close();
                    return content;
    
                } catch (MalformedURLException e) {
                    e.printStackTrace();
                }
                return null;
            }
        }
    

    如果你在 faces-config.xml 中添加你的 java 类作为一个 bean,你可以像这样在你的 xpages 中使用一个计算字段来调用它

    <xp:text escape="true" id="computedField1" value="#{javascript:getAgentData().getData()}"></xp:text>
    

    【讨论】:

    • 你能帮我举一个Java类的例子吗?我还需要将文档传递给我使用 NotesSession.DocumentContext 属性在代理中获取的代理。是否有任何替代方法可以调用代理 Xpage -> Lotus Form -> Agent call on form load,代理可以在文档上下文中工作。我是 Xpages 的新手,任何帮助都会有很大帮助。
    • Thomas 的课程有 2 个挑战 :-) a) 它仅适用于您可以匿名访问的数据库,并且它可能在大量回复时失败。如果你想沿着这条路走,请使用 Apache HTTP 客户端
    • 我们如何在这个 java 类中传递一个文档。我也想让代理处理内存中的文档。
    • 不确定您的意思,内存中的文档以表单形式提供,而不是在 xpages 中。在 xpages 中,您使用数据源。如果您在 xpage 中创建一个新的数据源,您将拥有一个内存中的文档。如果您需要在此解决方案中获取特定文档,则需要在打印语句中发送 unid 并使用 java 类对其进行解析。
    • 我们有 Agent.runWithDocumentContext(doc:NotesDocument) 方法,它可以从 xpage 运行代理并传递内存中的文档。我创建了一个记忆文件
    【解决方案3】:

    您需要稍微更改一下您的代理。您将使用someobj.print "Something" 而不是Print "Something" - 这应该是使用搜索/替换的可管理任务。详细步骤已记录在in this blog entry

    现在您声明您需要双重使用代理。不那么难,一旦你超越了复制和粘贴编程。

    当您检查类时 - 它会查找文档上下文。当您直接调用代理时,文档上下文不存在。所以你检查你是否有这个文档——如果没有,它是经典的,你在类中添加一个打印语句,如果它在那里,你保存到上下文中。

    要打印的代码是myObject.printResult = true - 或者默认情况下将其设置为 true(但随后会污染日志:-))

    如果您在调用代理时提供了上下文文档,那么您将从 XPage 中提供一个项目(例如 DontPrint=1)并检查该项目。如果存在,只保存到上下文中,否则添加打印语句。

    告诉我们进展如何。

    【讨论】:

    • 是否有任何替代方法可以调用代理 Xpage -> Lotus Form -> 表单加载时的代理调用或代理可以在文档上下文中工作的任何其他方法。我可以使用从 xpage 到 lotus 表单的 url 参数在表单中创建文档。我们有 100 个数据库,因此更改每个数据库都不是正确的解决方案。我是 Xpages 的新手,任何帮助都会有很大帮助
    • “相当多的工作要做”不会使解决方案“不正确”。如果您已经设置了适当的开发环境——即所有数据库设计都受版本控制——您可以使用脚本(任何语言)在 ODP 中运行代理来调整代码。中间不需要使用表格。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-08-28
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多