使用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

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值