0

在将经典 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 直接打印到浏览器。需要帮助请帮忙。

4

3 回答 3

2

如果您想使用 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 调用代理并能够使用内存中的文档。也许这会有所帮助,但如果它被大量使用,性能将不会很好,因为代理会为每个呼叫加载和卸载。这仍然是一个坏主意。

于 2015-02-17T18:11:00.470 回答
1

创建一个调用您的代理的 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>
于 2015-02-17T18:09:12.893 回答
0

你需要稍微改变一下你的代理。而不是Print "Something"你会使用someobj.print "Something"- 这应该是使用搜索/替换的可管理任务。详细步骤已记录在此博客条目中

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

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

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

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

让我们知道怎么回事。

于 2015-02-18T01:31:49.283 回答