セッション Bean へのバインディングに関する jsfimmediate=“true”

StackOverflow https://stackoverflow.com/questions/2554374

  •  23-09-2019
  •  | 
  •  

質問

私は持っています リストページ それはに行きます ページを追加. 。追加ページには、 名前のテキストボックス その値はにバインドされています セッションスコープのBean.

リストページには、 追加ボタン これは、アクション メソッドを介して追加ページに移動します。このアクション メソッドは、名前のテキストボックスがバインドされているオブジェクトをクリアします。

私も持っています キャンセルボタン 追加ページでは、名前のテキストボックスがバインドされている値を再度クリアするアクション メソッドにバインドされています。

何も即時に設定されていない場合、これはすべて正常に機能します。

ただし、キャンセル ボタンを即時に設定した場合、名前フィールドに値を入力してキャンセルをクリックすると、アクション メソッドが起動されてバッキング Bean 内のオブジェクトがクリアされ、リスト ページに移動します。次に [追加] をクリックすると、アクション メソッドによってオブジェクトが再度クリアされ (最適なメソッドかどうかは無視されます)、追加ページに移動します。追加ページの名前のテキストボックスは空であると予想しますが、そうではありません。確かに、追加ボタンは即時ではないため、値は再バインドされて空になるはずです。

以下は、リスト ページの追加ボタンに関連する XHTML です。

<h:commandButton id="addButton"
                 value="Add"
                 action="#{myBean.gotoAdd}"/>

以下は、追加ページの入力ボックス (myBean はセッション スコープ) に関連する XHTML であり、その後に追加ページのキャンセル ボタンの XHTML が続きます。

<h:inputText id="newName"
             value="#{myBean.newObject.name}"
             binding="#{myBean.newNameInput}"
             styleClass="name" />

<h:commandButton id="cancelButton"
                 value="Cancel" immediate="true"
                 action="#{myBean.cancelAdd}"
                 onclick="return confirm('You sure?');"/>
役に立ちましたか?

解決

私はので、私は特にその用途について十分な情報ではないのです、アクションがそれに発砲持っていたリストのどの項目を識別するために必要がある場合を除き、タグのbindingプロパティを使用することはほとんどありません。しかし、私は知っているあなたのコードでしょう私の期待は、あなたが正しくリセットを取得していないに結合されているものは何でもbindingオブジェクトであるので、あなたは、予想通り、最も可能性の高い仕事ます。

javax.faces.component.UIxxxを使用せず

他のヒント

私は今、非常に同様の問題を抱えている。

結合および/またはimmediate属性を削除するだけでなく、「追加」ボタンをクリックすると呼び出されるアクションから結合を持つコンポーネント上setSubmittedValue()を呼び出してみます。

ああ、それはあなたを助けていても、あなたはまだキャンセルした後、同じコンポーネントを表示するにつながることができます任意のアクションでそれをしなければならないでしょう。

それ、私はまだいくつかのよりよい解決策を把握しようとしている理由です...

あなたはすぐに=「true」を使用している場合は、

その値は、これがどのようにパラメータ作品で、保持されます。あなたは以下のリンクを見てみる必要があります:

http://wiki.apache.org/myfaces/How_The_Immediate_Attribute_Worksする

http://wiki.apache.org/myfaces/ClearInputComponentsする

さて、これが私が最初から作った例です。キャンセル ボタンが 2 つあり、1 つは即時キャンセル、もう 1 つは即時キャンセルではありません。再現手順の例:

  • james-list ページに移動し、「追加」をクリックします。
  • 追加ページが空のフィールドで表示されます。すべてのフィールドに値を入力し、「追加」をクリックします。
  • リスト ページが表示され、新しい人が含まれるように更新されます。「追加」をクリックします。
  • 追加ページが空のフィールドで表示されます。すべてのフィールドに値を入力し、「キャンセル (即時)」をクリックします。
  • リスト ページが表示され、変更されません。「追加」をクリックします。
  • 追加ページが表示されますが、フィールドは予想どおり空ではありません。「キャンセル」をクリックします。
  • リスト ページが表示され、変更されません。「追加」をクリックします。
  • 追加ページが表示され、フィールドは空ではなくなりました。

ジェームス.java:

package com.jamiebarrow;

import java.util.ArrayList;
import java.util.List;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.SessionScoped;
import javax.faces.component.UIComponent;

@ManagedBean
@SessionScoped
public class James {

  private UIComponent idComponent;
  private UIComponent firstNameComponent;
  private UIComponent lastNameComponent;

  public UIComponent getIdComponent() {
    return idComponent;
  }

  public void setIdComponent(UIComponent idComponent) {
    this.idComponent = idComponent;
  }

  public UIComponent getFirstNameComponent() {
    return firstNameComponent;
  }

  public void setFirstNameComponent(UIComponent firstNameComponent) {
    this.firstNameComponent = firstNameComponent;
  }

  public UIComponent getLastNameComponent() {
    return lastNameComponent;
  }

  public void setLastNameComponent(UIComponent lastNameComponent) {
    this.lastNameComponent = lastNameComponent;
  }

  private List<Person> personResults;

  private Person person;

  public James() {
    personResults = new ArrayList();
    personResults.add(new PersonBuilder(1, "Bob", "Uncle").build());
    personResults.add(new PersonBuilder(2, "Jack", "Black").build());
  }

  public List<Person> getPersonResults() {
    return personResults;
  }

  public void setPersonResults(List<Person> personResults) {
    this.personResults = personResults;
  }

  public Person getPerson() {
    return person;
  }

  public void setPerson(Person person) {
    this.person = person;
  }

  private void clearPerson() {
    person = new PersonBuilder().build();
  }

  public String gotoList() {
    return "james-list";
  }

  public String gotoAdd() {
    clearPerson();
    return "james-add";
  }

  public String cancelAdd() {
    clearPerson();
    return gotoList();
  }

  public String addPerson() {
    personResults.add(person);
    return gotoList();
  }
}

ジェームスリスト.xhtml:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE html
    PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
    "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en"
      xmlns:ui="http://java.sun.com/jsf/facelets"
      xmlns:f="http://java.sun.com/jsf/core"
      xmlns:h="http://java.sun.com/jsf/html">
<h:head>
  <title>list page</title>
</h:head>

<body>
<div class="container">
  <div class="content">
    <h:messages showSummary="true" showDetail="false" errorClass="error" infoClass="info"
                warnClass="warn"/>
    <h:form>
      <h:dataTable value="#{james.personResults}" var="person">
        <h:column>
          <f:facet name="header">Id</f:facet>
          <h:outputText value="#{person.id}"/>
        </h:column>
        <h:column>
          <f:facet name="header">Name</f:facet>
          <h:outputText value="#{person.firstName}"/>
        </h:column>
        <h:column>
          <f:facet name="header">Surname</f:facet>
          <h:outputText value="#{person.lastName}"/>
        </h:column>
      </h:dataTable>
      <h:panelGroup layout="block">
        <h:commandButton value="Add" action="#{james.gotoAdd}"/>
      </h:panelGroup>
    </h:form>
  </div>
</div>
<ui:debug hotkey="L" rendered="true"/>
</body>
</html>

ジェームズ-追加.xhtml:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE html
    PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
    "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en"
      xmlns:ui="http://java.sun.com/jsf/facelets"
      xmlns:f="http://java.sun.com/jsf/core"
      xmlns:h="http://java.sun.com/jsf/html">
<h:head>
  <title>add page</title>
</h:head>

<body>
<div class="container">
  <div class="content">
    <h:messages showSummary="true" showDetail="false" errorClass="error" infoClass="info"
                warnClass="warn"/>
    <h:form>
      <fieldset>
        <legend>Add Person</legend>
        <h:panelGrid columns="2">
          <h:outputLabel for="PersonId" value="Id:"/>
          <h:inputText id="PersonId" value="#{james.person.id}" binding="#{james.idComponent}"/>
          <h:outputLabel for="PersonFirstName" value="First Name:"/>
          <h:inputText id="PersonFirstName" value="#{james.person.firstName}" binding="#{james.firstNameComponent}"/>
          <h:outputLabel for="PersonLastName" value="Last Name:"/>
          <h:inputText id="PersonLastName" value="#{james.person.lastName}" binding="#{james.lastNameComponent}"/>
        </h:panelGrid>
        <h:panelGroup layout="block">
          <h:commandButton value="Add" action="#{james.addPerson}"/>
          <h:commandButton value="Cancel (immediate)" action="#{james.cancelAdd}" immediate="true"/>
          <h:commandButton value="Cancel" action="#{james.cancelAdd}"/>
        </h:panelGroup>
      </fieldset>
    </h:form>
  </div>
</div>
<ui:debug hotkey="L" rendered="true"/>
</body>
</html>
ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top