2009年9月27日星期日

ADF_043:使用ADF实现基于Form的CRUD (3)

运行环境:JDeveloper 11.1.2.1.0 + Oracle Database 10g Express Edition 10.2.0.1。

接上一个Project,在测试Update功能时,发现了一个小问题:
当用户修改数据项后,点击导航按钮时,应该提示:“数据已改动,请先保存或者放弃。”。

问题分析:
(1)当用户修改数据项并点击导航按钮后,相当于点击了Submit按钮,这时数据改动已经提交到了模型层,Application Module可以感知到模型层数据发生了修改。
(2)Commit按钮的disabled属性="#{!bindings.Commit.enabled}",我们也可以通过判断Commit按钮是否Enable了,来判断数据是否发生了改变。

重要步骤说明:

1. 复制JSFUtil.java和ADFUtil.java到View Controller Project。

2. 把Managed Bean的一些工具方法总结出来,创建一个BaseBackingBean。
其它BackingBean继承BaseBackingBean。
在本文中用到的方法有:

public BindingContainer getBindings() {
return BindingContext.getCurrent().getCurrentBindingsEntry();
}

public boolean isDirty() {
ApplicationModule am = ADFUtils.getDCBindingContainer().getDataControl().getApplicationModule();
return am.getTransaction().isDirty();
}

public boolean isCommitEnabled() {
Boolean commitState = (Boolean)JSFUtils.getManagedBeanValue("bindings.Commit.enabled");
boolean commitEnabled = commitState != null ? commitState.booleanValue() : false;
return commitEnabled;
}

public void popupMessage(String message) {
FacesContext context = FacesContext.getCurrentInstance();
context.addMessage(null, new FacesMessage(FacesMessage.SEVERITY_INFO, message, null));
}

public void popupMessage(ActionEvent actionEvent, String message) {
FacesContext context = FacesContext.getCurrentInstance();
context.addMessage(actionEvent.getComponent().getClientId(context),
new FacesMessage(FacesMessage.SEVERITY_INFO, message, null));
}


3. 使用Java代码调用First、Previous、Next、Last Operation
方式和调用Delete Operation一样,都是通过BindingContainer找到OperationBinding。
这里只列出调用First Operation的代码:

public void firstButton_actionListener(ActionEvent actionEvent) {
if (!isDirty()) {
BindingContainer bindings = getBindings();
OperationBinding operationBinding = bindings.getOperationBinding("First");
Object result = operationBinding.execute();
} else {
popupMessage(actionEvent,Save_Or_Undo_Message);
}
}

First按钮的页面代码如下:
<af:commandButton text="First" disabled="#{!bindings.First.enabled}" partialSubmit="true" id="cb1"
actionListener="#{myBackingBean.firstButton_actionListener}"/>

4. 运行
修改一条记录,然后点击导航按钮,会弹出提示窗口,如下图:

注意,这里有一个问题,就是不知道为什么,弹出的信息不能显示在点击按钮的附近,而是只能显示在页面中央?
进一步实验发现,如果组件是输入型组件,比如InputText,就可以显示在旁边,如下图:

难道context.addMessage方法的第一个参数对命令型组件不起作用?

Project 下载: Form_CRUD(3).7z

没有评论: