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

来源:互联网 发布:python 2 3区别 编辑:程序博客网 时间:2024/06/02 06:20
运行环境: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

http://maping930883.blogspot.com/2009/09/adf043adfformcrud-3.html

0 0