可以从java函数返回预先输出结果

时间:2012-02-27 14:20:57

标签: xpages

这是一个两部分问题。

我在许多应用程序中使用Tim Tripcony的Fancy XPage Typeahead脚本,根据特定数据库中的许多不同视图返回一个预先输入列表。

  1. 可以将该博客中列出的服务器端javascript转换为java类,以返回XPage中本机预先输入函数可以获取的相同结果。

  2. 该类是否可以作为部署到所有服务器的扩展库的一部分,以便所有应用程序可以立即使用它,如果是这样,将如何从XPage调用它。

2 个答案:

答案 0 :(得分:7)

是的,我想不出任何无法转换为Java的SSJS的例子,这是Tim Tripcony的SSJS移植到Java。

import java.util.HashMap;
import java.util.Map;
import lotus.domino.*;
import com.ibm.domino.xsp.module.nsf.NotesContext;
public class TypeAhead {
    public static String directoryTypeAhead(String searchValue) {
        String returnList = "";
        try {

            Database directory = NotesContext.getCurrent().getCurrentSession().getDatabase("", "names.nsf");
            View allUsers = directory.getView("($Users)");
            Map<String, HashMap<String, String>> matches = new HashMap<String, HashMap<String, String>>();
                Map<String, String> individualMatches = new HashMap<String, String>();
            Map<String, Boolean> includeForm = new HashMap<String, Boolean>();
            includeForm.put("Person", Boolean.TRUE);
            includeForm.put("Group", Boolean.TRUE);
            ViewEntryCollection matchingEntries = allUsers.getAllEntriesByKey(searchValue, false);
            ViewEntry entry = matchingEntries.getFirstEntry();
            int resultCount = 0;
            while (entry != null) {
                Document matchDoc = entry.getDocument();
                String matchType = matchDoc.getItemValueString("Form");
                if ((Boolean)includeForm.get(matchType)) {
                    String fullName = matchDoc.getItemValue("FullName").elementAt(0).toString();
                    if (matches.get(fullName) == null) {
                        resultCount++;
                        Name matchName = NotesContext.getCurrent().getCurrentSession().createName(fullName);
                        individualMatches = new HashMap<String, String>();
                        individualMatches.put("cn", matchName.getCommon());
                        individualMatches.put("photo", matchDoc.getItemValueString("photoUrl"));
                        individualMatches.put("job", matchDoc.getItemValueString("jobTitle"));
                        individualMatches.put("email", matchDoc.getItemValueString("internetAddress"));
                        matches.put(fullName, (HashMap<String, String>) individualMatches);
                    }
                }
                if (resultCount > 9) {
                    entry = null;
                }
                else {
                    entry = matchingEntries.getNextEntry(entry);
                }
            }
            returnList = "<ul>";
            for (Map<String, String> match : matches.values()) {    
                String matchDetails = "<li><table><tr><td><img class=\"avatar\" src=\"" + match.get("photo") + "\"/></td><td valign=\"top\"><p><strong>" +  match.get("cn") + "</strong></p><p><span class=\"informal\">" + match.get("job") + "<br/>" +  match.get("email") + "</span></p></td></tr></table></li>";
                returnList += matchDetails;
            }
            returnList += "</ul>";
        } catch(Exception e) {
            System.out.println(e);
        }
        return returnList;
    }
}

至于在扩展库中创建它所有你真正需要做的就是把它放在插件Jar中并创建一个功能和更新站点然后你可以使用新的8.5.3功能来将其复制到所有服务器上。

您可以通过在xpage中执行以下操作来使用此代码:

<xp:inputText id="inputText1" value="#{viewScope.someVar}">
  <xp:typeAhead mode="partial" minChars="1" valueMarkup="true"
   var="searchValue"
   valueList="#{javascript:return com.tobysamples.demo.TypeAhead.directoryTypeAhead(searchValue);}">
  </xp:typeAhead></xp:inputText>

答案 1 :(得分:0)

我认为将SSJS转换为Java并不难。使用托管bean,您可以通过该字段立即访问java方法。 并且应该是对扩展库的一个很好的增强,所以每个人都可以受益于这种很酷的类型