0

複雑なデータ入力フォームでは、フォーム内のフォームを編集する必要がある場合があります。これは 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
    }

ビーンに趣味を追加するとどうなるかというと、ビーンフィールドの趣味などが設定されていないため、趣味が追加されないということです (リストは空で、ログは「趣味: []」です)。どうすればそれを機能させることができますか?

4

1 に答える 1

1

f:ajax に何を送信するかを指示しないので、あなたの趣味は空っぽです。部分的な送信を行いたい場合(それがあなたが望んでいることだと思います)、次のことを試すことができます:

<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 id="hobby" value="#{outerBean.hobby}" required="true" />
                </f:facet>
            </h:column>
            <h:column>
                <h:outputText value="#{h.like}" />
                <f:facet name="footer">
                    <h:inputText id="like" value="#{outerBean.like}" required="true" />
                    <h:commandButton action="#{outerBean.addHobby()}" value="+" >
                        <f:ajax execute="hobby like" render="ht" />
                    </h:commandButton>
                </f:facet>
            </h:column>
        </h:dataTable>
    </h:panelGrid>
</h:form>

コードでわかるように、ボタンを押したときにフォームのどの部分を送信する必要があるかを f:ajax に伝えます。ここで Bean を確認すると、趣味などだけが Bean に追加されていることがわかります。名前部分は提出しません。すべてのフィールドがチェックされていないと言います。これは、immediate=true を使用すると検証がスキップされるためです。使用しないことをお勧めします。immediate= true の詳細については、こちらを参照してくださいhttp://balusc.blogspot.nl/2006/09/debug-jsf-lifecycle.html#WhenShouldIUseTheImmediateAttributeこれがお役に立てば幸いです。

于 2013-05-24T11:21:19.963 に答える