2016-05-13 7 views
1

cacheBeanを適切に作成するのにまだ苦労しています。私は、私が読んだものからBeanをシングルトンにしたいと思う。それは1つだけのインスタンス が必要になります。頻繁に使用されるキーワードなどを取得するためにそれを使用してください。Xpages:cacheBeanが一度だけロードされるようにする方法

http://blog.defrog.nl/2013/02/prefered-way-for-referencing-beans-from.html

私は私のCacheBeanを作るために、このパターンを使用(およびユーティリティメソッドを使用しました)。

私は顔-config設定にそれを置くことによって、このmanagedBeanを作る場合、私は簡単にモデル

<xp:text escape="true" id="computedField1"   
value="#{CacheBean.models}"></xp:text> 

の値を取得することができますJSFは私のためにBeanをインスタンス化するの面倒を見ます。

しかし、私は同じ値(モデルのような)を何度も何度も再ロードしたくありません。私はそれを実現するために、私は をPOJOにして、urlのようにbeanのcurrentInstanceを取得する必要があると思っていました。私は顔-configファイルの外に豆を取ってこの変更を(作ったとき

しかし、私は、プロパティのハンドルを取得するように見えることはできません

これをしてもコンパイルされません:。

<xp:text escape="true" id="computedField1" 
     value="#{Cache.getCurrentInstance().models}"> 
    </xp:text> 

What am I doing wrong? 

================================

package com.scoular.cache; 

import java.io.Serializable; 
import org.openntf.domino.xsp.XspOpenLogUtil; 

import com.scoular.Utils; 

public class CacheBean implements Serializable { 

    private static final long serialVersionUID = -2665922853615670023L; 
    public static final String BEAN_NAME = "CacheBean"; 

    private String pcDataDBpath; 

    private Vector<Object> models = new Vector<Object>(); 


    public CacheBean() { 
     initConfigData(); 
    } 

    private void initConfigData() { 
     try { 
     loadModels(); 
     loadDBPaths(); 
     } catch (Exception e) { 
      XspOpenLogUtil.logError(e); 
     } 
    } 


    // Getters and Setters 

    public static CacheBean getInstance(String beanName) { 
     return (CacheBean) Utils.getVariableValue(beanName); 
    } 

    public static CacheBean getInstance() { 
     return getInstance(BEAN_NAME); 

    } 

    public String getPcDataDBpath() { 
     return pcDataDBpath; 
    } 

    public void setPcDataDBpath(String pcDataDBpath) { 
     this.pcDataDBpath = pcDataDBpath; 
    } 

    public void loadDBPaths() { 

     Session session = Factory.getSession(); 
     Database tmpDB = session.getCurrentDatabase(); 

     pcAppDBpath = (tmpDB.getServer() + "!!" + "scoApps\\PC\\PCApp.nsf"); 
     pcDataDBpath = (tmpDB.getServer() + "!!" + "scoApps\\PC\\PCData.nsf"); 
     compDirDBpath = (tmpDB.getServer() + "!!" + "compdir.nsf"); 
    } 

    public void loadModels() { 
     try { 
      Session session = Factory.getSession(); 
      Database tmpDB = session.getCurrentDatabase(); 
      Database PCDataDB = session.getDatabase(tmpDB.getServer(), "scoApps\\PC\\PCData.nsf"); 
      ViewNavigator vn = PCDataDB.getView("dbLookupModels").createViewNav(); 
      ViewEntry entry = vn.getFirst(); 
      while (entry != null) { 
       Vector<Object> thisCat = entry.getColumnValues(); 
       if (entry.isCategory()) { 
        String thisCatString = thisCat.elementAt(0).toString(); 
        models.addElement(thisCatString); 
       } 
       entry = vn.getNextCategory(); 
      } 
     } catch (Exception e) { 
      XspOpenLogUtil.logError(e); 
     } 
    } 

P

ackage com.scoular; 

import javax.faces.context.FacesContext; 

public class Utils { 

     public static Object getVariableValue(String varName) { 
      FacesContext context = FacesContext.getCurrentInstance(); 
      return context.getApplication().getVariableResolver().resolveVariable(context, varName); 
      } 
} 
+0

を使用することができるELに

CacheBean.get().models 

を呼び出すことができます。 filePathsを他の.nsfファイルにロードするだけの場合は、ここでシングルトンのことを心配する必要はありません。あなたはそれのようなもののためにappScoped beanを持つことができます。誰もが同じappScopeを使用しているので、Beanオブジェクトのインスタンスは1つだけでなければなりません。 –

+0

デビット、私は、私がシンプルさと明確さのために切り捨てたキャッシングしている多くのことがあります。私は、アプリケーション全体でこれらの値を取得し、一度だけそれらをロードできるようにしたい。私は、アプリケーションスコープを使用するマネージドBeanは動作すると思いますか?それは? –

+1

CacheBeanにユーザー固有のデータがない場合は、ApplicationScopeを指定します。ユーザー固有のデータがある場合はSessionScopeにする必要があります。ランタイムはBeanのインスタンス化を処理します。 ELの呼び出しはCacheBean.modelsになります –

答えて

4

Beanに正しいスコープが設定されている場合、Beanが作成されていれば直接Beanにアクセスできます。

private static final String BEAN_NAME = "CacheBean"; 

//access to the bean 
    public static CacheBean get() { 
      return (CacheBean) JSFUtil.resolveVariable(BEAN_NAME); 
    } 

//in my JSFUtil class I have the method 
public static Object resolveVariable(String variable) { 
     return FacesContext.getCurrentInstance().getApplication().getVariableResolver().resolveVariable(FacesContext.getCurrentInstance(), variable); 
    } 

はとてもJavaクラスでは、あなたが、私は本当にあなたがCacheBeanのものでやっているのかわからないんだけど

CacheBean.models 
1

少なくともコンパイルされていない理由を教えてください。 ELだ

値= "#{Cache.getCurrentInstance()。モデル}"

。ですから、ゲットや()があってはいけません。あなたは

値=「#{} Cache.currentInstance.models」

そして、私はあなたがキャッシュCacheBeanを使用していないと思っていたとしてあなたのvar名を確認したいです。

関連する問題