这是一个两部分问题。
我在许多应用程序中使用Tim Tripcony的Fancy XPage Typeahead脚本,根据特定数据库中的许多不同视图返回一个预先输入列表。
可以将该博客中列出的服务器端javascript转换为java类,以返回XPage中本机预先输入函数可以获取的相同结果。
该类是否可以作为部署到所有服务器的扩展库的一部分,以便所有应用程序可以立即使用它,如果是这样,将如何从XPage调用它。
答案 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方法。 并且应该是对扩展库的一个很好的增强,所以每个人都可以受益于这种很酷的类型