JSF فوري = "صحيح" فيما يتعلق بالربط بحبة الجلسة

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

  •  23-09-2019
  •  | 
  •  

سؤال

انا املك صفحة القائمة هذا يذهب إلى إضافة صفحة. تحتوي صفحة الإضافة اسم textbox الذي ترتبط قيمته بـ جلسة النطاق الفول.

تحتوي صفحة الإدراج على إضافة زر هذا يذهب عبر طريقة الإجراء إلى صفحة إضافة. تقوم طريقة الإجراء هذه بمسح الكائن الذي يرتبط به مربع نص الاسم.

لدي أيضا ملف زرالإلغاء في صفحة إضافة ، والتي ترتبط بأسلوب الإجراء الذي يقوم مرة أخرى بمسح القيمة التي يرتبط بها مربع نص الاسم.

إذا لم يتم ضبط أي شيء على الفور ، كل هذا يعمل بشكل جيد.

ومع ذلك ، إذا قمت بتعيين زر الإلغاء على الفور ، إذا قمت بإدخال القيم في حقل الاسم ، ثم انقر فوق "إلغاء" ، يتم إطلاق طريقة الإجراء وتمسح الكائن الموجود في حبة الدعم وينتقل إلى صفحة الإدراج. إذا قمت بعد ذلك بالنقر فوق إضافة ، تقوم طريقة الإجراء بمسح الكائن مرة أخرى (تجاهل ما إذا كانت أفضل طريقة أم لا) ثم تنتقل إلى صفحة إضافة. أتوقع الآن أن يكون مربع نص اسم صفحة الإضافة فارغًا ، لكنه ليس كذلك؟! بالتأكيد ، نظرًا لأن زر الإضافة ليس فوريًا ، يجب إعادة القيم والفراغ؟

فيما يلي XHTML ذات الصلة لزر إضافة في صفحة الإدراج

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

فيما يلي XHTML ذي الصلة لمربع الإدخال في صفحة الإضافة (MyBean هو Scoped Scoped) ، يليه زر الإلغاء في صفحة إضافة::

<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 الكائن الذي تربطه بعدم إعادة تعيينه بشكل صحيح.

نصائح أخرى

أواجه مشاكل متشابهة جدًا الآن.

إلى جانب إزالة السمة الربط و/أو الفوري ، حاول استدعاء SetSubmittedValue () على مكون مع الربط من الإجراء المسمى على زر "إضافة".

للأسف ، حتى لو كان ذلك يساعدك ، فلا يزال يتعين عليك القيام بذلك في أي إجراء يمكن أن يؤدي إلى عرض نفس المكون بعد الإلغاء.

لهذا السبب ما زلت أحاول اكتشاف بعض الحلول الأفضل ...

إذا كنت تستخدم فوريًا = "صحيح" ، فسيتم الاحتفاظ بالقيمة ، فهذه هي الطريقة التي تعمل بها المعلمة. يجب عليك إلقاء نظرة على الروابط التالية:

http://wiki.apache.org/myfaces/how_the_immediate_attribute_works

http://wiki.apache.org/myfaces/clearinputcomponents

حسنًا ، هذا مثال قمت به من الصفر. لديّ زرعان إلغاء ، أحدهما فوري ، أحدهما ليس كذلك. مثال على الخطوات للتكاثر:

  • انتقل إلى صفحة James-List وانقر فوق إضافة
  • تعرض صفحة إضافة مع حقول فارغة. أدخل القيم لجميع الحقول وانقر فوق إضافة.
  • تعرض صفحة الإدراج ويتم تحديثها لتشمل الشخص الجديد. انقر فوق إضافة.
  • تعرض صفحة إضافة مع حقول فارغة. أدخل قيم جميع الحقول وانقر فوق "إلغاء" (فوري)
  • تعرض صفحة الإدراج وهي دون تغيير. انقر فوق إضافة.
  • تعرض صفحة الإضافة ، لكن الحقول ليست فارغة كما أتوقع. انقر فوق إلغاء.
  • تعرض صفحة الإدراج وهي دون تغيير. انقر فوق إضافة.
  • تعرض صفحة الإضافة والآن لا تكون الحقول فارغة.

جيمس جافا:

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();
  }
}

James-List.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>

جيمس add.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