Domino平台的数据库是一种文本数据库,其实也就是一种NOSQL型数据库,不需要严格的数据库表格式定义。这倒是为我们应用Java的反射机制提供了一些方便。首先我们要用到Domino的MBean。
所谓的MBean应该称为Managed-Bean,就是托管Bean。这是JSF的一个概念,在Domino851之后就已经提供支持了。我们正好可以利用它。
在Designer中,切换至Java透视图,在左侧的包浏览器找到WebContent文件夹:
打开faces-config.xml,在<faces-config>这个标签内增加:
<managed-bean>
<managed-bean-name>DocumentBean</managed-bean-name>
<managed-bean-class>xpage.bean.DocumentBean</managed-bean-class>
<managed-bean-scope>session</managed-bean-scope>
<managed-property>
<property-name>form</property-name>
<value>DocBean</value>
</managed-property>
</managed-bean>
<managed-bean>
<managed-bean-name>DocumentControl</managed-bean-name>
<managed-bean-class>xpage.bean.DocumentControl</managed-bean-class>
<managed-bean-scope>application</managed-bean-scope>
</managed-bean>
标签增加完了,千万不要忘了编写Bean实体。
package xpage.bean;
package xpage.bean;
public interface DocumentInterface {
//public boolean print();
public String getForm();
}
public class DocumentBean implements DocumentInterface {
private String form = \"\";
private String fullname =\"\";
private String subject = \"\";
private String title = \"\";
private String uuid = \"\";
private int num = 1;
private boolean saved = true;
public DocumentBean(){
}
public String getUuid() {
return uuid;
}
public void setUuid(String uuid) {
this.uuid = uuid;
}
public boolean isSaved() {
return saved;
}
public void setSaved(boolean saved) {
this.saved = saved;
}
public String getFullname() {
return fullname;
}
public void setFullname(String fullname) {
this.fullname = fullname;
}
public String getForm() {
return form;
}
public void setForm(String form) {
this.form = form;
}
public String getTitle() {
return title;
}
public String getSubject() {
return subject;
}
public void setSubject(String subject) {
this.subject = subject;
}
public void setTitle(String title) {
this.title = title;
}
}
这样在整个session期,DocumentBean对象实体都是可以访问的,而且是不需要开发人员去创建而是由服务器托管的,这也是managed一词的来由。但是问题来了,怎么用啊?我们看XML配置中的<managed-bean-name>属性,这个是MBbean的名称,就相当于对象名。我们在Xpage或者SSJS中直接引用它就可以使用这个bean,下面就具体来讲讲。
先创建一个Xpage页面,在里边添加三个文本框,分别是subject,title,form。编辑form文本框的默认值属性,改为计算值:
然后在浏览器中打开
能看到form字段的默认值已经取到了,就是XML文件中配置的数据。以上可以看到MBean作为实体是存在于内存中的,并不需要用户去创建。那么在SSJS中那?也很简单:直接用:DocumentBean.form。在页面的事件中(随便一个),输入:
var sform = DocumentBean.form;
print(sform);
然后刷新浏览器页面,会在控制台中显示:DocBean
MBean此时就可以在我们的设计下发挥它自己的作用了。但是现在还只是能借助MBean取数据,事实是,我们更想通过它保存数据。Dominont的数据库是一种文档数据库,那也就是说没有严格的库表结构,同一种文档里的字段可以完全不一样。这给我们利用反射保存和引用数据提供了方便。
继续编辑文件。在里边增加一个MBean:DocumentControl
<managed-bean>
<managed-bean-name>DocumentControl</managed-bean-name>
<managed-bean-class>xpage.bean.DocumentControl</managed-bean-class>
<managed-bean-scope>application</managed-bean-scope>
</managed-bean>
然后新建一个类:
package xpage.bean;
import java.lang.reflect.Field;
import java.lang.reflect.Method;
import lotus.domino.*;
import com.ibm.domino.xsp.module.nsf.NotesContext;
public class DocumentControl {
Session session = null;
Database db = null;
public DocumentControl(){
}
public boolean save(DocumentInterface docbean){
try{
session = NotesContext.getCurrent().getCurrentSession();
db = session.getCurrentDatabase();
if (docbean.getForm().equals(\"DocBean\")){
saveDocument((DocumentBean)docbean);
}
return true;
}catch(Exception e){
e.printStackTrace();
return false;
}
}
private boolean saveDocument(DocumentBean docbean){
Document doc = null;
try{
doc = db.createDocument();
Class docclass = docbean.getClass();
Field[] aryfield = docclass.getDeclaredFields();
Object val = null;
Field field = null;
for (int i =0; i < aryfield.length; i++){
try{
field = aryfield[i];
field.setAccessible(true);
val = field.get(docbean);
doc.replaceItemValue(field.getName(), val).recycle();
}catch(Exception e){
continue;
}
}
doc.save(true,true);
}catch(Exception e){
e.printStackTrace();
}finally{
try{
if (doc != null){
doc.recycle();
}
}catch(Exception e){
}
}
return true;
}
}
在页面上增加一个保存按钮,在它的事件中输入下面的代码:
try{
DocumentBean.fullname = session.getEffectiveUserName();
DocumentBean.subject = getComponent(\"subject\").getValue();
DocumentBean.title = getComponent(\"title\").getValue();
DocumentControl.save(DocumentBean);
}catch(e){
_dump(e)
}finally{
}