在复杂的数据输入表单上,可能需要在表单中编辑表单。由于这在 JSF2 中是不可能的,我想知道有什么更好的解决方案可以解决这个问题。这是我需要的一个例子:
- 给定:两个 bean:OuterBean 和 HobbyBean;在 OuterBean 中使用了 HobbyBeans 列表
- OuterBean 是一个 ManagedBean(在 SessionScope 中)
- HobbyBean 包含两个字段 hobby 和 like
我想以在 OuterBean 中添加用户名的形式添加 HobbyBeans 而不提交 OuterBean 但提交新值以填充列表。这是代码示例:
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xmlns:ui="http://java.sun.com/jsf/facelets" xmlns:h="http://java.sun.com/jsf/html">
<h:head>
</h:head>
<h:body>
<h:form>
<h:panelGrid columns="2">
<h:outputText value="Name" />
<h:inputText value="#{outerBean.name}" required="true" />
<h:outputText value="Hobbies" />
<h:dataTable id="ht" value="#{outerBean.hobbies}" var="h">
<h:column>
<h:outputText value="#{h.hobby}" />
<f:facet name="footer">
<h:inputText value="#{outerBean.hobby}" required="true" />
</f:facet>
</h:column>
<h:column>
<h:outputText value="#{h.like}" />
<f:facet name="footer">
<h:inputText value="#{outerBean.like}" required="true" />
<h:commandButton action="#{outerBean.addHobby}" value="+" immediate="true">
<f:ajax render="ht" />
</h:commandButton>
</f:facet>
</h:column>
</h:dataTable>
</h:panelGrid>
</h:form>
</h:body>
</html>
是的,外部表单没有命令按钮,但这不是这里的问题。commandButton 用于内部表单,因此设置属性 immediate = true。这样做,所有字段都不会被检查为非空(必需标签被忽略)。但也是忽略此字段的内容,并且未设置到 ajax 请求中。如何避免这种情况并将 ajax 请求中的 h.hobby 和 h.like 的字段值发送到 OuterBean?
这里的豆子:
@ManagedBean
@SessionScoped
public class OuterBean
{
private List<HobbyBean> hobbies;
private String name;
private String hobby;
private Integer like;
public OuterBean()
{
hobbies = new ArrayList<HobbyBean>();
}
public String addHobby()
{
hobbies.add(new HobbyBean(hobby, like));
System.out.println("hobbies: " + hobbies.toString());
return "";
}
public String submit()
{
System.out.println("name is " + name);
return "";
}
// + getter & setter
}
/* ------------------------------------------------------------------------ */
public class HobbyBean
{
private String hobby;
private Integer like;
public HobbyBean(String hobby, Integer like)
{
this.hobby = hobby;
this.like = like;
}
public String toString()
{
return hobby == null ? "" : hobby.concat(",").concat(like == null ? "" : like.toString());
}
// + getter & setter
}
现在,当我向 bean 添加 hobby 时会发生什么,因为没有设置 bean 字段 hobby 和 like(列表为空,日志为:“hobbies: []”),所以没有添加任何 hobby。我怎样才能让它工作?