人。我在做文件柜。我已将模式 - 字段列表与强制标志和其他标志分开。然后我有了柜卡列表 - 它们是列表数据和数据可以是简单的 - 一个值或多个 - N值。我根据排序将Schema字段映射到Data。所以假设我有3个字段 - 作者,书籍,页数。作者可以是多个。所以在List中首先我有MultipleData,另外两个是SimpleData。当我从MongoDB读取它时,它没问题。对于MultiplaData情况,它是内部ui:repeat的Datatable。所以我打印:
作者:作者1,作者2,作者3 ......
书籍:书籍
页数:62
然而,当我尝试添加某些内容时,它无效。我不得不替换内部ui:repeat因为它抛出了arrayindexoutofbound异常,所以我用h:dataTable替换它。
这是我的代码
<h:form>
<h3>Add new data</h3>
<hr/>
<h:dataTable value="#{filingCabinetManagerBean.filingCabinet.schema.fields}" var="schemaField" style="vertical-align: top">
<h:column><h:outputText value="#{schemaField.fieldTitle}:" style="font-size: 20px;font-weight: bold"/></h:column>
<h:column>
<ul>
<h:dataTable value="#{filingCabinetManagerBean.newCabinetCard.cardData.get(filingCabinetManagerBean.filingCabinet.schema.fields.indexOf(schemaField)).data}" var="data" rowStatePreserved="true">
<h:column>
<li>
<h:inputText value="#{data}"/>
</li>
</h:column>
<h:column>
<p:commandButton value="Add field" actionListener="#{filingCabinetManagerBean.addMultipleDataField(filingCabinetManagerBean.filingCabinet.schema.fields.indexOf(schemaField))}"
update="@form" rendered="#{schemaField.repeatable and filingCabinetManagerBean.newCabinetCard.cardData.get(filingCabinetManagerBean.filingCabinet.schema.fields.indexOf(schemaField)).data.lastIndexOf(data) == (filingCabinetManagerBean.newCabinetCard.cardData.get(filingCabinetManagerBean.filingCabinet.schema.fields.indexOf(schemaField)).data.size()-1)}"/>
</h:column>
</h:dataTable>
</ul>
</h:column>
</h:dataTable>
<p:commandButton value="Add data"
action="#{filingCabinetManagerBean.addNewCabinetCard(testBean.selectedDB)}" update="@all" />
</h:form>
当然,我使用适当数量的字符串预填充newCabinetCard变量,因此它适合于模式。 问题是,当我按下添加数据按钮时,无论我写入输入框,我都只保存空字符串。
我正在使用带有属性newCabinetCard的sessionscoped bean - 存放这些新值的地方。当我用&#34; abc&#34;填充这些值时。通过代码字符串,我可以看到它们但是当我更改它并保存它时 - 我只保存那些初始的&#34; abc&#34;字符串。看起来输入文本无法获取我输入的值。但是我有另外一个页面,当我使用inputTexts并且它们运行良好时,我认为这必须对dataTable做一些事情。
我在寻求你的帮助。
谢谢。
答案 0 :(得分:0)
3个月前我找到了解决方案。变量“data”只是String,JSF需要设置/ get方法来写入/读取变量。当然String没有它们,所以我创建了一个封装的类MyString,其中包含一个String变量,并为该变量设置/ get方法。现在一切都很完美。