1

我有以下显示所有产品的重复控件:

<xp:repeat id="rptProduct" rows="16" value="#{vwProduct}"
        var="productRow">
        <xp:panel styleClass="linkPanel" id="panel1">
            <xp:text escape="false" id="imgHTML">
                <xp:this.value><![CDATA[#{javascript:getImgURLForProduct(productRow.getDocument());}]]></xp:this.value>
            </xp:text>
            <xp:eventHandler event="onClientLoad"
                submit="true" refreshMode="norefresh"></xp:eventHandler></xp:panel>
</xp:repeat>

其中 getImgURLForProduct 从另一个数据库构建 URL:

function getImgURLForProduct(doc:NotesDocument) {
    var resourceDB:NotesDatabase = session.getDatabase(getWebServer(), applicationScope.aspCRMResourceDBPath);
    var strReturnVal:String = "<a style='text-decoration: none;' href='#'>";

    if (resourceDB != null) {
        if (resourceDB.isOpen()) {
            var vwResource:NotesView = resourceDB.getView("vwLookupAttachmentsForPrimaryImg");

            if (vwResource != null) {
                var pictureDoc:NotesDocument = vwResource.getDocumentByKey(doc.getItemValueString("fldProductCode"), true);

                if (pictureDoc != null) {
                    if (pictureDoc.hasItem("fldThumbImage")) {
                        var rtiLockPicture:NotesRichTextItem = pictureDoc.getFirstItem("fldThumbImage");

                        var eos:java.util.Vector = rtiLockPicture.getEmbeddedObjects();

                        if (eos.isEmpty() == false) {
                            var eosi:java.util.Iterator = eos.iterator();

                            while (eosi.hasNext()) {
                                var eo:NotesEmbeddedObject = eosi.next();

                                if (eo.getType() == NotesEmbeddedObject.EMBED_ATTACHMENT) {
                                    var strImageFile:String = "/" +  applicationScope.aspCRMResourceDBPath + "/0/" + pictureDoc.getUniversalID() + "/$file/" + eo.getSource(); 
                                    strReturnVal += "<img src='" + strImageFile + "' alt='" + eo.getSource() + "' border='0' width='105'>";
                                }
                            }
                        }
                    }
                }
            }
        }
    }

    strReturnVal += "<br /><br /><span>" + doc.getItemValueString("fldProductCode") +  "</span>";
    strReturnVal += "</a>";
    return strReturnVal;
}

我想知道如何改进代码,以便不会为重复控件中的每个项目初始化数据库和视图?

4

2 回答 2

3

您可能能够将来自不同数据库的视图存储在 dataContext 中。我不确定回收安全的 dataContexts 有多安全,但将 Domino 对象存储在其中可能是安全的。Mastering XPages 中有一个关于 dataContexts 的好部分。这对我非常有用。

于 2012-02-23T14:54:43.840 回答
1

最好的方法是更改​​您从中检索文档数据的数据库中的注释视图。此视图包含您需要的所有数据(ofc.richtext 值除外),除此之外,还有一列包含您在这段代码中生成的计算 url。这样您就不必为您引用的每个文档打开辅助数据库。

另一种方法是通过添加一些缓存手段来改进您的代码。如果 getImageFromUrl 方法总是打开同一个数据库(在同一个服务器上等),你可以像这样改变你的可能。

警告此代码没有任何保证,也没有任何错误处理;)

    function getImgURLForProduct(doc:NotesDocument) {
        var docid = doc.getUniversalID();
if(inCache(docID){
   return fromCache(docid);
} 

        var resourceDB:NotesDatabase = session.getDatabase(getWebServer(), applicationScope.aspCRMResourceDBPath);
        var strReturnVal:String = "<a style='text-decoration: none;' href='#'>";

        if (resourceDB != null) {
            if (resourceDB.isOpen()) {
                var vwResource:NotesView = resourceDB.getView("vwLookupAttachmentsForPrimaryImg");

                if (vwResource != null) {
                    var pictureDoc:NotesDocument = vwResource.getDocumentByKey(doc.getItemValueString("fldProductCode"), true);

                    if (pictureDoc != null) {
                        if (pictureDoc.hasItem("fldThumbImage")) {
                            var rtiLockPicture:NotesRichTextItem = pictureDoc.getFirstItem("fldThumbImage");

                            var eos:java.util.Vector = rtiLockPicture.getEmbeddedObjects();

                            if (eos.isEmpty() == false) {
                                var eosi:java.util.Iterator = eos.iterator();

                                while (eosi.hasNext()) {
                                    var eo:NotesEmbeddedObject = eosi.next();

                                    if (eo.getType() == NotesEmbeddedObject.EMBED_ATTACHMENT) {
                                        var strImageFile:String = "/" +  applicationScope.aspCRMResourceDBPath + "/0/" + pictureDoc.getUniversalID() + "/$file/" + eo.getSource(); 
                                        strReturnVal += "<img src='" + strImageFile + "' alt='" + eo.getSource() + "' border='0' width='105'>";
                                    }
                                }
                            }
                        }
                    }
                }
            }
        }

        strReturnVal += "<br /><br /><span>" + doc.getItemValueString("fldProductCode") +  "</span>";
        strReturnVal += "</a>";
        toCache(strReturnVal);
        return strReturnVal;
    }

function inCache(strKey){
  if(!sessionScope.containsKey("urlcache")){
    sessionScope.put("urlcache",new java.util.HashMap());
}
  var cache = sessionScope.get("urlcache");
  cache.containsKey(strKey);
}

function fromCache(strKey){
  var cache = sessionScope.get("urlcache");
  return cache.get(strKey);
}

function toCache(strKey,strValue){
  if(!sessionScope.containsKey("urlcache")){
    sessionScope.put("urlcache",new java.util.HashMap());
}
  var cache = sessionScope.get("urlcache");
  cache.put(strKey,strValue);
}

通过首先检查您引用的文档是否有可用的缓存条目,您不需要再次打开数据库。

于 2012-02-23T14:45:21.250 回答