有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

JavaJSFDataTable“优雅”地编辑行内容

EDIT1: 正如Valentin Jacquemin所建议的那样,我用一个List<Entry<String,String>>实现了它 但是,当我现在更改一个值时,tomcat会抛出一个错误: 错误消息:

    SEVERE: /bvDesktop_RuleOverviewAddActionNode.xhtml at line 111 and column 115 value="#{paramListKVs.value}": Property 'value' not writable on type java.lang.Object
javax.el.PropertyNotFoundException: /bvDesktop_RuleOverviewAddActionNode.xhtml at line 111 and column 115 value="#{paramListKVs.value}": Property 'value' not writable on type java.lang.Object

以及我的xhtml中的对应行:

<p:dataTable id="paramListKV" var="paramListKVs" value="#{ruleTreeBeanAddActionNode.paramListKV}" editable="true" editMode="cell">
    <p:column>
        <f:facet name="header">List Key</f:facet>
            <h:outputText value="#{paramListKVs.key}"/>
    </p:column>
    <p:column>
        <p:cellEditor id="paramListKVsEditTest"> 
             <f:facet name="header">List Value</f:facet>
             <f:facet name="output"><h:outputText value="#{paramListKVs.value}"/></f:facet>
             --><f:facet name="input"><p:inputText value="#{paramListKVs.value}" style="width:96%" /></f:facet><--
        </p:cellEditor>
    </p:column>
</p:dataTable>

以-->;及<;——。 我不知道java试图将代码写入什么。我甚至不确定value="#{paramListKVs.value}"是否正确。有什么想法吗


我有一个我能够解决的特殊问题,但我觉得我的解决方案更像是一种肮脏的方式。我希望有一个更优雅的方法来做到这一点,但我没有找到一个(搜索如此)。这就是我的问题:

我目前正在创建一个基于规则的框架,用于自动处理一些文件,我想让我们的编辑器能够在一个漂亮、简单的web界面中创建这些规则。 我已经有了所需的网站,数据模型等。然而,一个特殊的问题是,一个操作规则可以具有Set of Properties Key-Value智能。我选择一个TreeMap。现在我希望能够adddeleteedit表示数据表中的单元格

爪哇: createActioNode:

@ManagedBean
public class RuleTreeBeanAddActionNode {
...
        private TreeMap<String,String> actionParamMap = new TreeMap<String,String>(); 

        private String paramKeyToAdd = "";

        private String paramValueToAdd = "";

        private int paramKeyIndex;

        private String valueToChange;

        private String keyForInfo;

        private UIComponent datatable;

        public void addKeyValueToMap() {

            if((paramKeyToAdd != null || !paramKeyToAdd.equals("")) && (paramValueToAdd != null) || !paramValueToAdd.equals("")) {
            unusedActionParamKeys.remove(paramKeyToAdd);
            usedActionParamKeys.add(paramKeyToAdd);

            actionParamsAsListKeys.add(paramKeyToAdd);
            actionParamsAsListValues.add(paramValueToAdd);

            actionParamMap.put(paramKeyToAdd, paramValueToAdd);
            actionParamMapEntries = new ArrayList<Entry<Integer, String>>((Collection<? extends Entry<Integer, String>>) actionParamMap.entrySet());
            userSession.setAttribute("actionParamMap", actionParamMap);
            userSession.setAttribute("unusedActionParamKeys", unusedActionParamKeys);
            userSession.setAttribute("usedActionParamKeys", usedActionParamKeys);
            userSession.setAttribute("tempSelectorWorkOn", "");
            userSession.setAttribute("tempRuleId", "");

            userSession.setAttribute("actionParamsAsListKeys", actionParamsAsListKeys);
            userSession.setAttribute("actionParamsAsListValues", actionParamsAsListValues);

            paramKeyToAdd = "";
            paramValueToAdd = "";
           }
        }

        public void setValueToChange(String valueToChange) {
            DataTable dt = (DataTable)datatable;
            String id = String.valueOf(paramKeyIndex);
            Entry<String, String> temp = (Entry<String, String>)dt.getRowData();
            actionParamMap.put((String) temp.getKey(), valueToChange);
    }

        //getter and setter

createActionNode。xhtml

<tr>
    <td>Action Parameter </td>
    <td>
        <p:dataTable binding="#{ruleTreeBeanAddActionNode.datatable}" 
                     rowKey="test" 
                     rowIndexVar="paramKeyIndex" 
                     id="paramKeysValues" 
                     var="params" 
                     value="#{ruleTreeBeanAddActionNode.actionParamMapEntries}" 
                     editable="true" 
                     editMode="cell">
            <p:column id="keys">
                <f:facet name="header">Param Key</f:facet>
                <h:outputText value="#{params.key}"/>
            </p:column>
            <p:column id="values">
                <f:facet name="header">Param Value</f:facet>
                <p:cellEditor id="paramValueEdit">  
                   <f:facet name="output"><h:outputText value="#{params.value}"/></f:facet>  
                   <f:facet name="input"><p:inputText id="evinput" value="#{ruleTreeBeanAddActionNode.valueToChange}" style="width:96%"/></f:facet>  
                </p:cellEditor>  
            </p:column>
        </p:dataTable>
    </td>
</tr>
<tr><td><br/></td></tr>
<tr>
    <td>Param To Value</td>
    <td>
        <table>
            <tr>
                <td>
                    <p:selectOneMenu id="paramKeys" value="#{ruleTreeBeanAddActionNode.paramKeyToAdd}">
                        <f:selectItems value="#{ruleTreeBeanAddActionNode.unusedActionParamKeys}"/>
                    </p:selectOneMenu>
                </td>
                <td>
                    <p:inputText id="paramValue" value="#{ruleTreeBeanAddActionNode.paramValueToAdd}"/>
                </td>
            </tr>
            <tr>
                <td></td>
                <td>
                    <p:commandButton id="addParam" value="+" action="#{ruleTreeBeanAddActionNode.addKeyValueToMap}" update="paramKeysValues,paramKeys,paramValue"/>
                </td>
            </tr>
        </table>
    </td>
</tr>    

我知道我需要返回的不是映射,而是条目集,这样datatable就可以通过它进行数据挖掘。因此,当我编辑单元格中的记录时,函数 ^对更改调用{}。然而,要检索实际记录以及映射中要更改的键和值,我必须遍历UIComponentDatatable,检索编辑的记录,保存映射并重建条目集
所以我的实际问题是,这是推荐的方式吗?我是否监督过能让我的世界变得更容易的事情?是否有其他人实现了类似的功能


共 (1) 个答案

  1. # 1 楼答案

    以下是UIData的文档,任何数据表都是它的子项:

    UIData is a UIComponent that supports data binding to a collection of data objects represented by a DataModel instance, which is the current value of this component itself (typically established via a ValueExpression). During iterative processing over the rows of data in the data model, the object for the current row is exposed as a request attribute under the key specified by the var property.

    因此,正如您所说,您需要一个iterable对象,以便datatable可以在其中循环,并在构建表时公开每个元素

    另一方面,这里没有完全利用绑定特性。只需让组件执行其工作,并将value=#{ruleTreeBeanAddActionNode.actionParams}actionParams设置为List或任何其他supported type。完成后,datatable的模型将引用ruleTreeBeanAddActionNode.actionParams元素。你不需要任何进一步的机制来进行同步

    另见:

    更新

    我猜你想用AbstractMap.SimpleEntry作为列表的条目。这个类与JavaBean不兼容,尽管setValue不是void类型。创建自己的对象来保存行的状态,这样就有了一个与JavaBean兼容的对象,EL就能正确解析读/写方法:

    public class Entry{
        private String key;
        private String value;
    
        public Entry(String key, String value) {
            this.key = key;
            this.value = value;
        }
    
        public String getKey() {return key;}
        public String getValue() {return value;}
        public void setKey(String key) {this.key = key;}
        public void setValue(String value) {this.value = value;}
    }
    

    然后在你的后盾中:

    @ManagedBean
    public class RuleTreeBeanAddActionNode {
        private List<Entry> entries;
    
        @PostConstruct
        public void init() {
            entries = new ArrayList<Entry>();
            entries.add(new Entry("foo", "bar"));
        }
    
        public List<Entry> getEntries() { return entries; }
    }