仍在努力正确制作cacheBean。根据我的阅读,我想我想让豆子成为单身人士。只需要 一个例子。用它来获取常用的关键字等。
http://blog.defrog.nl/2013/02/prefered-way-for-referencing-beans-from.html
我使用这个模式来制作我的CacheBean(并使用了一个实用工具方法)。
如果我通过将它放入Faces-config使其成为一个managedBean,那么我可以轻松获得模型的值
<xp:text escape="true" id="computedField1"
value="#{CacheBean.models}"></xp:text>
JSF负责为我实例化bean。
但我不希望它一遍又一遍地重新加载相同的值(如模型)。我认为要做到这一点我需要做 一个POJO并获取bean的currentInstance,如url。
但是,当我进行此更改时(从faces-config文件中取出bean,我似乎无法处理属性。
这甚至不会编译:
<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 :(得分: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.get().models
EL中的可以使用
CacheBean.models
答案 1 :(得分:1)
我可以告诉你为什么它至少没有编译。
值=&#34;#{Cache.getCurrentInstance()的模型。}&#34;
那个EL。所以不应该有get或a()。你想要
值=&#34;#{Cache.currentInstance.models}&#34;
检查你的var名称,因为我认为你使用的是CacheBean,而不是Cache。