我跟随article跟踪我们如何存储全局参数,以及配置文件如何适用于经典Notes应用程序。我按照文章的步骤并根据必要的球状参数实现了类,但是当我调用javascript对象的方法时,会发生以下错误。我有点困惑,因为在应用程序的其他地方调用相同的方法可以正常工作。下面是javascript对象的代码,作为文章中的示例实现。
脚本解释器错误,line = 12,col = 21:[TypeError]错误调用方法' getDbRH()'在类型为' java.util.HashMap的对象上[Dynamic Java Wrapper,java.util.HashMap]'
var dbFotoConfig = {
getDbFoto : function ( ) {
var cache = this. getCacheObject ( ) ;
var result = cache.get( "DbFoto" ) ;
if (result == null ) {
// Here is where you would do @DBSomething or worse
var visao:NotesView=database.getView("Configuracoes")
var doc:NotesDocument=visao.getFirstDocument();
if (doc!=null)
{
result= [doc.getItemValueString("servidor_foto"),doc.getItemValueString("base_foto"),doc.getItemValueString("visao_foto")]
cache.put("DbFoto",result)
sessionScope.put ( "dbFotoConfig" ,cache )
}
else
{
cache.put("DbFoto",null)
sessionScope.put ( "dbFotoConfig" ,null )
}
}
return result ;
} ,
/* Here would be much more of these functions */
/* Utility functions for cache management */
/* Retrieves the configuration object from a cache store.
There are many ways to do that */
getCacheObject : function ( ) {
// Consider carefully where to cache. Typical places
// are sessions or applications
var curCache = sessionScope. get ( "dbFotoConfig" ) ;
if (curCache == null ) {
curCache = new java. util. HashMap ( ) ;
sessionScope. put ( "dbFotoConfig" ,curCache ) ;
}
return curCache ;
} ,
/* Resets the cache */
reset : function ( ) {
var curCache = new java. util. HashMap ( ) ;
sessionScope. put ( "dbFotoConfig" ,curCache ) ;
}
}
var dbRHConfig = {
getDbRH : function ( ) {
var cache = this. getCacheObject ( ) ;
var result = cache. get ( "DbRH" ) ;
if (result == null ) {
// Here is where you would do @DBSomething or worse
var visao:NotesView=database.getView("Configuracoes")
var doc:NotesDocument=visao.getFirstDocument();
if (doc!=null)
{
result=[doc.getItemValueString("servidor_RH"),doc.getItemValueString("base_RH"),doc.getItemValueString("visao_RH")]
cache.put("DbRH",result)
sessionScope.put ( "dbRHConfig" ,cache )
}
else
{
cache.put("DbRH",null)
sessionScope.put ( "dbRHConfig" ,null )
}
}
return result ;
} ,
/* Here would be much more of these functions */
/* Utility functions for cache management */
/* Retrieves the configuration object from a cache store.
There are many ways to do that */
getCacheObject : function ( ) {
// Consider carefully where to cache. Typical places
// are sessions or applications
var curCache = sessionScope. get ( "dbRHConfig" ) ;
if (curCache == null ) {
curCache = new java. util. HashMap ( ) ;
sessionScope. put ( "dbRHConfig" ,curCache ) ;
}
return curCache ;
} ,
/* Resets the cache */
reset : function ( ) {
var curCache = new java. util. HashMap ( ) ;
sessionScope. put ( "dbRHConfig" ,curCache ) ;
}
}
答案 0 :(得分:0)
我首选的选项是创建普通文档,保存,然后调用setUniversalID()
将其更改为使用session.evaluate("@Password(\"whateverYouWant\")")
自定义的内容。 @Password将值散列为32个字符的十六进制字符串(即有效的UNID)。这使您可以使用Database.getDocumentByUnid()
轻松检索文档(正常文档,从而避免使用Profile文档的缓存问题),这是访问文档的最快方法之一。如果您想避免每次都计算它,可以将“UNID”存储在applicationScope变量中。
答案 1 :(得分:0)
拜托,拜托,请不要这样做。忘掉SSJS并尽可能多地使用XPage:IBM Domino风格的JSF框架实现。
首先,您需要确定配置需要多长时间,以及每个用户是否都一样。
如果它与每个最佳用途相同,那么您可以将其存储在应用程序作用域 bean中。应用程序范围与每个用户共享,实例化一次并持续整个应用程序的生命。
会话作用域 bean保留在当前用户中,并且仅由当前用户显示。
托管豆类'是的,生活是由框架管理的。框架在应用程序中的任何位置被引用时负责实例化它。它由变量名称分发,您可以在XPage应用程序的faces-config.xml
文档中对其进行配置。
<managed-bean>
<managed-bean-name>app</managed-bean-name>
<managed-bean-class>demo.bean.ApplicationBean
</managed-bean-class>
<managed-bean-scope>application</managed-bean-scope>
</managed-bean>
managed-bean-name 声明您的bean可用的变量名称。 托管bean范围表示bean的生存时间。
现在您需要做的是在 demo.bean 包下创建一个Java类,并在 ApplicationBean 的名称下创建一个Java类(&#39; s&#39 ;在上面的示例中,您可以将它命名为您喜欢的任何内容)。 从您命名变量的方式来看,在我看来,您需要更多的应用程序范围的bean而不是会话bean。所以,为了对话,我会根据您在上面发布的代码编写一个示例,看看Application bean的样子
package demo.bean;
import java.io.Serializable;
import java.util.HashMap;
import java.util.Map;
import javax.faces.FacesException;
import lotus.domino.Document;
import lotus.domino.NotesException;
import lotus.domino.View;
import com.ibm.xsp.model.domino.DominoUtils;
public class ApplicationBean implements Serializable {
private static final long serialVersionUID = 1L;
// Just a way to do it without repeating the same lines over and over
private static final String[] CONFIG_FIELD_PREFIXES = { "servidor", "base", "visao" };
private Map<String, String> dbFoto;
private Map<String, String> dbRh;
public Map<String, String> getDbFoto() {
if (dbFoto == null) {
loadConfig();
}
return dbFoto;
}
public Map<String, String> getDbRh() {
if (dbRh == null) {
loadConfig();
}
return dbRh;
}
private void loadConfig() {
dbFoto = new HashMap<String, String>();
dbRh = new HashMap<String, String>();
try {
View vw = DominoUtils.getCurrentDatabase().getView("Configuracoes");
Document doc = vw.getFirstDocument();
if (doc != null) {
for (String fieldName : CONFIG_FIELD_PREFIXES) {
dbFoto.put(fieldName, doc.getItemValueString(fieldName + "_foto"));
dbRh.put(fieldName, doc.getItemValueString(fieldName + "_RH"));
}
}
} catch (NotesException e) {
throw new FacesException(e.getMessage(), e);
}
}
public void reset() {
dbFoto = null;
dbRh = null;
}
}
那里有一些概念。希望我不会淹没你太多。但是要简单地解释一下:首先,bean在延迟加载时大部分时间都在工作,这意味着你不会在创建数据时预加载数据,但是当外部源调用它的方法时,你可以填充类。第一次调用该方法时,它会加载并缓存数据(您不必担心其持久性,因为请记住,这是由框架及其在faces-config.xml
中确定的生命周期所保证的)。第二次调用该方法时,它将提供缓存的数据(您在类的开头声明的Map对象中看到的内容)。考虑到你从同一个地方加载2个db配置的事实,一次加载两个数据库配置而不是在不同的时间延迟加载它们的成本更低 - 这就是我编写私有方法的原因loadConfig
现在发生的事情是配置存储在地图中,并且由于EL表达式,您可以以简洁的方式从这样的地图中读取数据。 如果您使用以下代码创建XPage,您将在页面上看到所有内容:
<?xml version="1.0" encoding="UTF-8"?>
<xp:view xmlns:xp="http://www.ibm.com/xsp/core">
<xp:text value="#{app.dbFoto.servidore} #{app.dbFoto.base} #{app.dbFoto.visao}" />
<xp:text value="#{app.dbHr.servidore} #{app.dbHr.base} #{app.dbHr.visao}" />
<xp:button id="button1" value="reset">
<xp:eventHandler event="onclick" submit="true"
refreshMode="complete" action="#{app.reset}" />
</xp:button>
</xp:view>
app
是我们的bean名称dbFoto
/ dbHr
是我们对Map<String, String> getDbFoto( / Map<String, String> getDbHr(
的号召(get
被删除,第一个字母小写,&#39} ;遵守惯例),每个名称都是访问地图值的关键。
我还提供了一个帮助方法,以便在您需要时清除配置:reset()
。它只是使2个变量无效,因此在第一次再次询问时会再次获取这些变量。