Отправка формы не запускает метод действия для managedBean на странице JSF 1.2 с параметрами запроса - PullRequest
2 голосов
/ 12 мая 2011

У меня довольно сложный управляемый компонент JSF 1.2 с различными методами и свойствами.Некоторые свойства сопоставлены с параметрами запроса URL, чтобы он мог заполнять объект сущности в соответствии с атрибутом id в URL.

Я использую один и тот же управляемый компонент для создания новой записи для этого объекта, используя одинСтраница jsf, и еще одна для обновления пары полей.В режиме создания отсутствуют параметры url, и отправка формы с использованием метода действия просто выполняет то, что ему говорят, и выполняет метод.

Но в режиме обновления получение идентификатора объекта из параметра запроса (в URL), который идеально заполняет форму данными объекта, извлеченными из базы данных, кнопка отправки, то есть метод не вызывает метод действия.в том же управляемом компоненте, но перезагружает страницу с пропущенными параметрами URL и на этот раз с пустой формой, поскольку в URL нет идентификатора, свойство id, которое используется при обращении к соответствующим данным методом класса обслуживания для установкиобъект-объект имеет значение null.

Итак, как мне заставить этот метод выполняться в этом режиме обновления, как я его называю?

Слушая совет, я также включил скрытые поля, которые содержат значенияпараметров id, полученных из URL-адреса в форме обновления, которая, похоже, не работает.

Вот фрагмент кода, содержащий форму на проблемной странице JSF:

<h:form id="ostOnayForm">
    <h:messages style="color:red" />

        <h:inputHidden value="#{oduncStokTalepBean.viewID}" />
        <h:inputHidden value="#{oduncStokTalepBean.adimID}" />

        <h:panelGrid id="oracleERP" columns="3"
                rendered="#{oduncStokTalepBean.aksiyon.faz==3}">
                Personel ödünç cari kodu:

        <h:inputText id="carikod" value="#{oduncStokTalepBean.oduncCariKod}"
                    required="true"
                    requiredMessage="Bu personelin 'ödünç cari kodu'nu girmelisiniz. (Eğer böyle bir kod tanımlı değilse, önce tanımı yapılmalıdır."
                    validatorMessage="Bu alana en fazla 25 karakter girebilirsiniz.">
                 <f:validateLength maximum="25" />
        </h:inputText>
        <h:message for="carikod" style="color:red" />
        </h:panelGrid>

        <h:panelGroup id="depocu1"
                rendered="#{oduncStokTalepBean.aksiyon.faz==2}">
            Personel ödünç cari kodu:
            <h:inputText value="#{oduncStokTalepBean.oduncCariKod}"
                    required="false"
                    validatorMessage="Bu alana en fazla 25 karakter girebilirsiniz.">
                <f:validateLength maximum="25" />
            </h:inputText>
        </h:panelGroup>

        <h:panelGroup id="depocu2"
                rendered="#{oduncStokTalepBean.aksiyon.faz==2}">
                <h:selectBooleanCheckbox value="#{oduncStokTalepBean.kargoyla}" />Ürün kargo firması ile teslim edilecek
        </h:panelGroup>

        <h:panelGrid columns="3"
                rendered="#{oduncStokTalepBean.onaylamaYetkisi}">
                Görüşler:
        <h:inputTextarea id="gorus" value="#{oduncStokTalepBean.gorus}"
                    required="true"
                    validatorMessage="Bu alana en fazla 255 karakter girebilirsiniz."
                    requiredMessage="Lütfen görüş de bildirin.">
        <f:validateLength maximum="255" />
        </h:inputTextarea>
        <h:message for="gorus" style="color:red" />

        <h:commandButton action="#{oduncStokTalepBean.vazgec}" value="Vazgeç" />

        <h:commandButton type="submit" action="#{oduncStokTalepBean.onayla}"
                    value="Onayla" rendered="#{oduncStokTalepBean.onaylamaYetkisi}" />
        <h:commandButton action="#{oduncStokTalepBean.reddet}"
                    value="Reddet"
                    onclick="return confirm('Bu formu reddetmek istediğinizden emin misiniz?')"
                    rendered="#{oduncStokTalepBean.onaylamaYetkisi}" />

        </h:panelGrid>
    </h:form>

Основаbean:

public class OduncStokTalepBean extends SurecBean {

    private String oduncCariKod;
    private Boolean kargoyla;

    private OduncStokTalep oduncStokTalep = new OduncStokTalep("ost", "Ödünç Stok Talebi");
    private List<SelectItem> depoListesi = new ArrayList<SelectItem>();
    private OduncStokAdres osa = new OduncStokAdres();

    private OduncStokAdresJpaController osaServ = new OduncStokAdresJpaController();

    public OduncStokTalepBean() {
        super();
    }

    @PostConstruct
    public void initializeOST() {
        if (FacesUtil.getSessionAttribute("GO_Person_id") != null ) {
            GO_Person_id = Integer.valueOf((String) FacesUtil.getSessionAttribute("GO_Person_id"));
            if (viewID != null) {

                System.out.println("ostBean got viewID:"+viewID);
                this.oduncStokTalep = ostServ.findOduncStokTalep(viewID);
                this.editModu = true;
                this.oduncCariKod = this.oduncStokTalep.getPersonelOduncCariKodu();
                this.kargoyla = this.oduncStokTalep.getKargoylaTeslim();
                System.out.println("ost: "+oduncStokTalep.getId()+" * "+oduncStokTalep.toString());
                if (adimID != null) {
                    this.aksiyon = aServ.findAkisAdim(adimID);
                    this.setAksiyonModu(true);
                } else {
                    System.out.println("adimID was null, reading it from Surec...");
                    if (oduncStokTalep.getPendingAction()!=null) {
                        this.aksiyon = aServ.findAkisAdim(oduncStokTalep.getPendingAction());
                        System.out.println("Found :"+aksiyon.getId()+" "+aksiyon.getAktor()+aksiyon.getAdimTanim());
                        this.setAksiyonModu(true);
                    } else {
                        System.out.println("oduncStokTalep.getPendingAction() seems also null :"+oduncStokTalep.getPendingAction());
                        this.setAksiyonModu(false);
                    }
                }

                if (editModu && GO_Person_id!=null) {

                    if (oduncStokTalep.getSuAnKimde().contains(GO_Person_id.toString()) )
                        this.onaylamaYetkisi = true;

                    if (this.aksiyon != null && this.aksiyon.getAktor().contains(GO_Person_id.toString())) 
                        this.onaylamaYetkisi = true;
                }

            } else {
                System.out.println("viewID is null.");
                System.out.println("initializing OST...");
                this.editModu = false;
                this.setAksiyonModu(false);

                oduncStokTalep.setPersonId(GO_Person_id);        
            }
        } else oturumActirt();
    }

    // THE FOLLOWING METHOD IS EXECUTED PERFCETLY WITH A BLANK FORM AND WITH NO GET PARAMETER
    public String kaydet(){
        Long formId;
        System.out.println("invoking ost kaydet()...");

        ostServ.doPersist(oduncStokTalep);

        formId = oduncStokTalep.getId();
        System.out.println("OST MB obtained Id:"+formId);
        if (formId != null) {
            doSomeOtherStuff();
        }

        FacesUtil.setSessionAttribute("surecView", null);
        FacesUtil.setSessionAttribute("surecAdim", null);
        FacesUtil.setSessionAttribute("surecID", null);

        FacesContext fc = FacesUtil.getFacesContext();
        fc.addMessage(null, new FacesMessage("Ödünç Stok talebiniz başarıyla oluşturuldu ve "+formId+" no'lu ile sisteme kaydedildi."));

        oduncStokTalep = new OduncStokTalep("ost", "Ödünç Stok Talebi");

        return "KAYDETVEGONDER";
    }

    // This method is never even called form the update form :(((((
    public String onayla() throws NonexistentEntityException, Exception {
        System.out.println("Onayla() invoked for OST "+oduncStokTalep.getId());
        if (this.onaylamaYetkisi) {         
            System.out.println("onaylama yetkisi de var.");

            SomeActionController ac1 = new SomeActionController();

            if (aksiyon == null) 
                    aksiyon = ac1.getPendingAction("ost", this.viewID, String.valueOf(this.GO_Person_id));

            ac1.adimiTamamla(this.GO_Person_id, "ost", this.viewID, aksiyon.getId(), true, this.gorus);
        }

        oduncStokTalep = new OduncStokTalep("ost", "Ödünç Stok Talebi");

        return "DASHBOARD";
    }

    // Neither this one via <h:commandButton action="#{oduncStokTalepBean.test}" value="Test Action Method" />
    public void test() {
        System.out.println("Test OK");
    }

    // getters and setters, etc.

}

и фрагмент face-config:

<managed-bean>
  <managed-bean-name>surecBean</managed-bean-name>
  <managed-bean-class>net.ozar.wf.jsfmanaged.SurecBean</managed-bean-class>
  <managed-bean-scope>request</managed-bean-scope>
  <managed-property>
   <property-name>viewID</property-name>
   <property-class>java.lang.Long</property-class>
   <value>#{param.id}</value>
  </managed-property>
  <managed-property>
   <property-name>adimID</property-name>
   <property-class>java.lang.Long</property-class>
   <value>#{param.aid}</value>
  </managed-property>
  <managed-property>
   <property-name>surecID</property-name>
   <property-class>java.lang.String</property-class>
   <value>#{param.sid}</value>
  </managed-property>
 </managed-bean>
 <managed-bean>
  <managed-bean-name>oduncStokTalepBean</managed-bean-name>
  <managed-bean-class>net.ozar.wf.jsfmanaged.OduncStokTalepBean</managed-bean-class>
  <managed-bean-scope>request</managed-bean-scope>
  <managed-property>
   <property-name>viewID</property-name>
   <property-class>java.lang.Long</property-class>
   <value>#{param.id}</value>
  </managed-property>
  <managed-property>
   <property-name>adimID</property-name>
   <property-class>java.lang.Long</property-class>
   <value>#{param.aid}</value>
  </managed-property>
 </managed-bean>

Ответы [ 2 ]

2 голосов
/ 12 мая 2011

Вы используете атрибут rendered для переключения видимости компонентов.При использовании этого с bean-объектом в области запроса необходимо убедиться, что то же самое условие для атрибутов rendered было оценено во время обработки отправки формы, как это было при отображении формы.Когда условие атрибута rendered кнопки или одного из ее родительских компонентов оценивает false, JSF не будет вызывать кнопку.

Если вы не можете гарантировать, что такое же условие может быть сохранено во времяКонструкция bean (post), то вам нужно поместить bean в область просмотра (только JSF 2.0) или использовать Томагавк <t:saveState>, чтобы сохранить bean в следующем запросе.

См. также:

0 голосов
/ 23 ноября 2013

Проверьте, есть ли ошибка, генерируемая на любом установщике ваших компонентов.

...