运行环境: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。
在本文中用到的方法有:
3. 使用Java代码调用First、Previous、Next、Last Operation
方式和调用Delete Operation一样,都是通过BindingContainer找到OperationBinding。
这里只列出调用First Operation的代码:
First按钮的页面代码如下:
<af:commandButton text="First" disabled="#{!bindings.First.enabled}" partialSubmit="true" id="cb1"
actionListener="#{myBackingBean.firstButton_actionListener}"/>
4. 运行
修改一条记录,然后点击导航按钮,会弹出提示窗口,如下图:
注意,这里有一个问题,就是不知道为什么,弹出的信息不能显示在点击按钮的附近,而是只能显示在页面中央?
进一步实验发现,如果组件是输入型组件,比如InputText,就可以显示在旁边,如下图:
难道context.addMessage方法的第一个参数对命令型组件不起作用?
接上一个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
http://maping930883.blogspot.com/2009/09/adf043adfformcrud-3.html