如果有人在nsf中使用javascript原型,如何清理Domino服务器中的SSJS(服务器端Javascript)?
马克·罗登发现了XPage SSJS的一个巨大弱点 :(感谢David Leedy告诉我这件事并向我展示这篇文章).
如果您有以下SSJS代码:
var dummyObj = {}
dummyObj.prototype.NAME = "Johann"
Run Code Online (Sandbox Code Playgroud)
XPages SSJS并不关心你使用var(var表示变量必须是本地的),它使dummyObj.NAME在整个服务器中可见,其值为Johann.因此,如果同一服务器中的另一个nsf使用具有相同名称的var,则它将继承整个原型:
var dummyObj = {}
println(dummyObj.NAME) /*prints "Johann" */
Run Code Online (Sandbox Code Playgroud)
这是一个巨大的错误(一个使得不可靠的XPage SSJS IMO).即使你根本不使用原型,如果他的应用程序中的其他人做了类似这样的事情:
String.prototype.split = function(){ return "I broke this method" }
Run Code Online (Sandbox Code Playgroud)
它将破坏使用无辜split()的同一服务器中的所有应用程序.
所以,问题是:如果有人"错误地"在NSF中写下以下SSJS(XPages服务器端Javascript):
String.prototype.split = function(){ return "I broke this method" }
Run Code Online (Sandbox Code Playgroud)
如何将String.prototype.split()修复为原始值?
正如Mark Roden所说,重启HTTP任务并不能解决问题.
////////////////////////////////////////////////// /////////
编辑1:为什么我认为这是一个巨大的错误:
我是Javascript粉丝但IMHO @MarkyRoden在SSJS中发现了一个巨大的错误.垫片和填充物实际上不是主要问题.Eval被认为是一种不好的做法,但原型对象是基本Javascript的基本元素.这是向Javascript类添加方法的标准和首选方法,它还需要继承和各种OOP内容.因此,您需要在服务器级别使用某种命名空间以避免冲突.所有这些都非常糟糕,但最大的问题是,一个应用程序中的一行代码可能会破坏服务器中的所有应用程序.是的,您可以信任您的开发人员,但其中一人可能会错误地编写错误的行,并且Domino服务器也可以拥有来自不同软件供应商的数百个应用程序.在代码审查中设置责任不是一个可靠的程序.也许是时候在SSJS中拥有一个真正的javascript引擎,比如V8,Spidermonkey,Chakra或Rhino.作为一种解决方法,我正在思考Tommy Valand 在SSJS中与Rhino的想法.
编辑2:情况更糟.你可以这样做:
prototype.importPackage = null
Run Code Online (Sandbox Code Playgroud)
要么
prototype.Array = null
Run Code Online (Sandbox Code Playgroud)
正如你在@SvenHasselbach的文章中看到的那样:http …
我已经阅读了关于Domino对象回收的这个建议: 在Java Bean中回收Domino对象的最佳方法是什么
如果我有一个名为document的数据源并且在一个多次调用的函数中存在这个代码,那么最佳做法是什么:
var doc=document.getDocument(true)
Run Code Online (Sandbox Code Playgroud)
并在后端文档中执行操作.
在我退出该功能之前,我应该回收doc还是我的后端文档到数据源再循环呢?
在这两个选择中,我必须访问最有效的控件的值?
getComponent("ControlName").getValue();
Run Code Online (Sandbox Code Playgroud)
要么
dataSource.getItemValue("FieldName");
Run Code Online (Sandbox Code Playgroud)
我发现有时getComponent似乎没有返回当前值,但访问dataSource似乎更可靠.那么从性能角度来看,它是如何使用的呢?
dataSource.getValue似乎适用于我尝试过的所有地方.但是,在使用rowData时,我似乎仍然需要执行rowData.getColumnValue("Something").rowData.getValue("Something")失败.
您好我需要在我的XPage中使用http://www.dropzonejs.com/上传文件.我想过使用XAgent来处理Mark Leusink:
http://openntf.org/XSnippets.nsf/snippet.xsp?id=custom-xpage-file-upload-handler
但总是我有问题错误500,这不是一个文件!例外....
似乎控制DropZone js不发送带参数的文件,我不明白Firebug
DropZone非常简单......
$(function () {
// $("div#FileIDUpload").dropzone({ url: "xUpload.xsp" });
var myDropzone = new Dropzone("div#FileIDUpload", { url: "xUpload.xsp"});
Dropzone.options.myAwesomeDropzone = {
paramName: "uploadedFile", // The name that will be used to transfer the file
clickable:true,
uploadMultiple:false,
maxFilesize: 2, // MB
accept: function(file, done) {
if (file.name == "justinbieber.jpg") {
done("Naha, you don't.");
}
else { done(); }
}
}
});
Run Code Online (Sandbox Code Playgroud)
有人有建议吗?
谢谢!
UPDATE
我解决了!问题是程序化使用这是正确的
$(function () {
// $("div#FileIDUpload").dropzone({ url: "xUpload.xsp" });
var …Run Code Online (Sandbox Code Playgroud) 我有两个计算字段,想要更新它们.它在浏览器中运行良好,但IBM Notes客户端出错.
这是代码:
var Admin = @DbColumn("", "GoreAdmins", 1);
var AdminBackup = @DbColumn("", "GoreAdmins", 2);
if (Admin && typeof Admin == "string") Admin = new Array(Admin);
if (AdminBackup && typeof AdminBackup == "string") AdminBackup = new Array(AdminBackup);
if (document1.isNewNote()) {
document1.setValue("Admin", Admin);
document1.setValue("AdminBackup", AdminBackup);
};
Run Code Online (Sandbox Code Playgroud)
我在这一行得到错误:
document1.setValue("Admin", Admin);
我的XPage有一个视图数据源,其中包含一个由URL参数构造的搜索公式("在视图中搜索结果").
搜索结果显示在位于面板内的重复控件中.如果没有搜索结果并且显示相应的消息,我想隐藏此面板.
该面板基于以下代码可见:
var vec:NotesViewEntryCollection = view1.getAllEntries();
vec.getCount() != 0;
Run Code Online (Sandbox Code Playgroud)
但是,似乎getAllEntries在进行过滤之前返回视图中的所有条目.All for Entry的帮助说"如果视图被FTSearch过滤,则此属性返回过滤视图中的条目."
我误解了吗?有没有办法可以在过滤发生后获得条目数量?
这是一个相当普遍的问题,但我会尽量精确:
很多时候我会被客户要求正确实现LotusScript
continue = false
Run Code Online (Sandbox Code Playgroud)
在Notes的Query*事件中.一个很常见的情况是表单的QueryOpen事件,我们实际上可以根据某些条件停止打开相关文档的过程,例如基于用户对话框的响应.
对于像querySaveDocument这样的一些Xpages事件,有非常明显的解决方案,而对于其他事件我只能建议重新思考整个逻辑,比如在更早的阶段阻止代码执行.但当然大多数人都更喜欢像"使用......重写这些代码"这样的通用方法.并且 - 说实话 - 我想知道自己;)
我或多或少熟悉Xpages/JSF生命周期,但不得不承认我没有正确的想法如何在任何给定阶段停止执行.一如既往,任何提示都是受欢迎的.
编辑(澄清我的问题,但也回应蒂姆的答案):
它不仅仅是QuerySave,而且还有QueryModeChange和QueryRecalc以某种方式需要与一个在线应用程序的逻辑一起转换,但在Xpages逻辑中没有它们的等价物.这两个概念(基于表单和基于xpages)在这一点上有太大的不同吗?
例如,考虑一个工作流应用程序,我们需要在允许在编辑模式下为潜在作者打开现有文档之前检查某些条件.在我的Notes客户端应用程序中,我将一些代码添加到2个事件,即QueryOpen,我在其中检查" mode "arg和第二个QueryModeChange,在那里我检查当前的doc模式.在这两种情况下continue = false,如果需要,我可以通过添加my来阻止编辑文档.根据事件,文档将不会更改其模式,或者根本不会打开.
使用Xpage我可以使用按钮来更改文档的编辑模式,我可以"隐藏"这些按钮,或者只是添加一些检查代码或其他.但17年的Domino咨询至少给我上了一课:总会有用户找到隐藏的方法来实现他们的目标.在我们的案例中,他们可能会发现对页面URL的简单修改最终将允许他们编辑文档.为了防止这种情况,我可以使用" beforeRenderResponse "事件,我假设.但是之后,在其他情况下也会调用beforeRenderResponse,因此我们必须首先调查当前的情况.或者我可以确保用户没有作者权限,除非情况允许.
同样,这不是一个大问题,但是当从传统Notes应用程序进行转换时,这意味着重新思考其整个逻辑.这使得这项工作更加明显,而且更加昂贵.
真正?或者我错过了这个概念的一些关键部分?
当我尝试对服务器端JavaScript(SSJS)中的前向和反向循环迭代之间的执行时间差异进行基准测试时,出现了一个(奇怪的)问题.虽然这个例子代码
var i,n=9999;
var arr=new Array(n);
for (i=0;i<n;i++) arr[i]=i; // WORKS
i=n; while (i--) arr[i]=i; // WORKS
Run Code Online (Sandbox Code Playgroud)
工作正常,以下代码
var i,n=10000; // changed n from 9999 to 10000
var arr=new Array(n);
for (i=0;i<n;i++) arr[i]=i; // WORKS
i=n; while (i--) arr[i]=i; // THROWS ArrayIndexOutOfBoundsException
Run Code Online (Sandbox Code Playgroud)
为反向迭代抛出ArrayIndexOutOfBoundsException.只要数组长度小于10000,反向while循环才能正常工作.谁能告诉我这里发生了什么?
使用Domino Designer 8.5.3时,我使用Java设计元素添加了一堆自定义类.我希望在我的自定义类中使用第三方JAR,就像在xPages SSJS中使用外部JAR一样,通过Package Explorer:
的WebContent - > WEB-INF - > LIB
但是我的自定义类没有选择JAR.
这是一个已知的限制还是我的配置搞砸了?
在我的XPages应用程序中,我经常使用SSJS对象(com.ibm.jscript.std.ObjectObject)来缓存数据.如果我使用java.util.HashMaps来检查性能是否有所提高,我会对以下代码片段(SSJS)的执行时间进行基准测试:

所有三个代码片段都是相同的:它们创建并填充SSJS对象或具有不同类型数据/对象的HashMap.对于每个片段,我测量了超过1000次运行的平均执行时间,其中n(=片段中的最大循环索引)为1000000(100万).基准测试是使用java.lang.System.nanoTime在Domino 9.0.1服务器上执行的.
所述的比率的执行时间如下:
换一种说法:
我的问题如下:
xpages ×10
xpages-ssjs ×10
lotus-domino ×3
arrays ×1
lotus ×1
lotus-notes ×1
lotusscript ×1
performance ×1
prototype ×1