从托管 bean 中的 ADF SelectOneChoice 获取选定项目

Posted

技术标签:

【中文标题】从托管 bean 中的 ADF SelectOneChoice 获取选定项目【英文标题】:Getting selected item from an ADF SelectOneChoice in managed bean 【发布时间】:2021-10-18 09:33:40 【问题描述】:

我目前正在使用 Jdev v12.2.1.4.0 (Oracle 12c) 修改 ADF Fusion Web 应用程序。

在其中一个 jsf 页面上,我在表格列中有一个 SelectOneChoice。 jsf 实现如下所示:

    <af:column 
        headerText="#ManagedBean.column5HeaderText"
        sortable="false"  
        visible="true" 
        id="c5">
        <af:selectOneChoice 
            binding="#ManagedBean.bindingErrorCaseSelectOneChoice"
            label="error case" 
            unselectedLabel="---" 
            autoSubmit="true"
            id="soc1">
            <f:selectItems value="#ManagedBean.errorCases" id="si1"/>
        </af:selectOneChoice>
    </af:column>

我省略了required 属性,因为进程没有必要在这里选择一个值。 我的 ManagedBean.java 的连贯部分如下:

    //declaring
    private RichSelectOneChoice bindingErrorCasesSelectOneChoice;
    private  List<SelectItem> errorCases = new ArrayList<SelectItem>();

    //...

    //populating errorCases List from a database
    public void getErrorCasesFromDB() 
    errorCases= new ArrayList<SelectItem>();
    
    try 
        //HC is a helper class to connect to a specific database
        Conection conn = HC.getConn();
        PreparedStatement pstmt = conn.prepareStatement("some SQL");
        ResultSet rs = pstmt.executeQuery();
        
        while (rs.next()) 
            errorCases.add(new SelectItem("i"+ rs.getRow(), rs.getString(1)));
        
        conn.close();
     catch(Exception e) 
        e.printStackTrace();
    

当我运行 jsf 页面时,表格内的 SelectOneChoices 会被渲染,并且所有预期的项目都会被登记。每当我尝试访问 SelectOneChoice 的选定项目时,我都会遇到问题。

当我点击页面上的按钮时,我想读取 selectedItem 的值,所以我想我可以不用在 valueChangeListener 中处理它,并在我的按钮操作中执行以下操作:

    public void buttonSaveReceivedResults(ActionEvent actionEvent) 
        //...
        if (bindingErrorCaseSelectOneChoice.getValue != null) 
            //... insert the selected value into an SQL statement
            //in the case the unselected label is selected, skip
            System.out.println(bindingErrorCasesSelectOneChoice.getValue().toString())
        
    

这个块总是被跳过。此外,当我检查进程时,getValue() 调用始终返回 null,即使我从列表中选择了一个项目。 现在我问你们,链条中缺少的部分在哪里?我是否正确地进行了数据绑定。我是否以错误的方式访问元素?提前致谢。

【问题讨论】:

您可以尝试在 af:selectOneChoice 上添加 value 属性,并检查 newValue 是否存储在 value 属性中 @SaiPatil 我假设我必须在我的 bean 中创建一个变量来存储它,对吧?它必须是哪种类型?或者我可以直接从 bean 访问 value 属性吗? 对,变量必须在bean中创建,value属性是Object类型。在值更改侦听器的值属性中以及在提交之后打印数据,如果您有任何类似的功能。 添加 value 属性后,bindingErrorCaseSelectOneChoice.getValue 应该理想地返回设置值。 我测试了在 valuechangelistener 方法中获取所选值并检索到一些东西:D。似乎 value 属性是缺失的部分。不幸的是,它似乎是 id 而不是价值,但我已经有了一个想法去弄清楚。你可以写一个答案;) 【参考方案1】:

value 属性存储 af:selectOneChoice 组件的输出。由于您没有添加它,因此返回的值为空。

【讨论】:

我必须重新打开这个问题,尽管我仍然无法按预期获得所选值。我计划点击一个调用动作的按钮,并在连贯的方法中,我计划从每个表格行中的SelectOneChoice 中读取选定的值。选择一个值不是强制性的,所以我想检查一个值是否被选中,但无论我是否选择了一个值,我总是得到 null。 请更新最新代码。现在,无论是否设置了值,您都得到了 null?

以上是关于从托管 bean 中的 ADF SelectOneChoice 获取选定项目的主要内容,如果未能解决你的问题,请参考以下文章

如何从托管 bean 中获取消息包字符串?

如何从jsf / primefaces中的托管bean向页面添加组件[重复]

从托管 bean 调用 JavaScript 函数

ADF 管道加载几个表后,自托管集成运行时超时

JSF 获取托管 bean 中的当前操作

使用 URL 参数的 JSF 托管 Bean 方法调用