在Domino平台上应用Java 反射机制

14 篇文章 0 订阅

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{

}



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值