erc*_*iou 1 datatable jsf input
我在创建dataTable时遇到问题,其中每行都有一个inputText和一个commandLink.单击链接时,仅提交行的inputText数据.
像这样的东西?
<h:dataTable value="#{bean.items}" var="item">
<h:column>
<h:inputText value="#{bean.value}"/>
</h:column>
<h:column>
<h:commandLink action="#{bean.save}" value="save">
<f:setPropertyActionListener target="#{bean.item}" value="#{item}" />
</h:commandLink>
</h:column>
</h:dataTable>
Run Code Online (Sandbox Code Playgroud)
豆:
@RequestScoped
public class Bean {
private Item item;
private String value;
Run Code Online (Sandbox Code Playgroud)
现在,就像它一样,它正在使用最后一行inputText
填充value
.我包裹了另一个h:form
,但它破坏了其他东西,我已经知道嵌套h:form
不是正确的方法来做它
这样做的正确方法是什么?
谢谢.
您将所有HTML输入元素的值绑定到同一个bean属性.如果所有这些HTML输入元素都在同一个表单中,这当然不会起作用.随后,所有值都按照表格中输入的顺序设置在同一属性上.这就是你最后得到最后一个价值的原因.你想移动该表单里面的<h:column>
(移动,因此不添加/嵌套另一个).
然而,通常的方法是将输入字段绑定到迭代对象.
<h:inputText value="#{item.value}"/>
Run Code Online (Sandbox Code Playgroud)
另一种方法是,如果你真的需要在表格周围Map<K, V>
放置表单,那就是有一个as bean属性,K
表示后面对象的唯一标识符的类型,#{item}
并V
表示其类型value
.让我们假设它是Long
和String
:
private Map<Long, String> transferredValues = new HashMap<Long, String>();
// +getter (no setter necessary)
Run Code Online (Sandbox Code Playgroud)
同
<h:inputText ... value="#{bean.values[item.id]}" />
Run Code Online (Sandbox Code Playgroud)
这样你就可以在action方法中得到它,如下所示:
String value = values.get(item.getId());
Run Code Online (Sandbox Code Playgroud)
顺便说一句,如果碰巧指定的Servlet容器3.0支持EL 2.2(Tomcat的7,Glassfish的3等),则也可以只通过#{req}
作为而不需要一个一个方法参数<f:setPropertyActionListener>
.
<h:commandLink ... action="#{bean.save(item)}" />
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
4100 次 |
最近记录: |