複雑なデータ入力フォームでは、フォーム内のフォームを編集する必要がある場合があります。これは JSF2 では不可能であるため、この問題に対するより良い解決策を見つけられるだろうかと思います。必要なものの例を次に示します。
- 与えられた: 2 つの Bean: OuterBean と HobbyBean。HobbyBeans のリストは OuterBean で使用されます
- OuterBean は ManagedBean です (SessionScope 内)
- HobbyBean には、hobby と like の 2 つのフィールドが含まれています
OuterBean を送信せずに OuterBean にユーザーの名前を追加し、新しい値を送信してリストを埋めるという形で、HobbyBeans を追加したいと考えています。コード例は次のとおりです。
<!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 属性を設定します。これを行うと、すべてのフィールドが空でないことがチェックされません (required-Tag は無視されます)。しかし、このフィールドの内容は無視され、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
}
ビーンに趣味を追加するとどうなるかというと、ビーンフィールドの趣味などが設定されていないため、趣味が追加されないということです (リストは空で、ログは「趣味: []」です)。どうすればそれを機能させることができますか?