您的位置:首页 > 编程语言 > Java开发

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

2017-05-09 11:20 441 查看
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{

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  Domino JSF JavaBean