2

さまざまなメソッドとプロパティを持つ、非常に複雑なリクエスト スコープの JSF 1.2 マネージド Bean があります。一部のプロパティは、URL の id 属性に従ってエンティティ オブジェクトを設定できるように、URL 要求パラメーターにマップされます。

同じマネージド Bean を使用して、1 つの jsf ページを使用してそのエンティティの新しいレコードを作成し、別のページをいくつかのフィールドを更新するために使用します。作成モードでは、url パラメーターはなく、アクション メソッドを指定してフォームを送信すると、指定されたとおりに実行され、メソッドが実行されます。

しかし、更新モードでは、要求パラメーター (URL 内) からエンティティーの ID を取得して、データベースから取得したエンティティー・データをフォームに完全に取り込みます。つまり、送信ボタンは、同じマネージド Bean でアクション・メソッドを呼び出しません。しかし、今度は URL に id がないため、URL パラメーターがなくなり、フォームが空白の状態でページをリロードします。エンティティ オブジェクトを設定するためにサービス クラス メソッドによって対応するデータを参照するときに使用される id プロパティは null です。

では、呼び出したときにこの更新モードでそのメソッドを実行するにはどうすればよいでしょうか?

アドバイスを聞いて、更新フォームの URL から取得した id パラメータの値を含む隠しフィールドも含めていましたが、機能していないようでした。

問題のある 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.

}

そしてfaces-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>
4

2 に答える 2

2

属性を使用してrendered、コンポーネントの表示を切り替えています。リクエスト スコープ Bean でこれを使用する場合、フォーム送信の処理中に、フォームの表示中と同じ属性の条件が評価されていることを確認する必要があります。ボタンまたはその親コン​​ポーネントのいずれかrenderedの属性の状態が評価されると、JSF はボタンを呼び出しません。renderedfalse

Bean の (ポスト) 構築中に同じ条件を確実に保持できない場合は、Bean をビュー スコープ (JSF 2.0 のみ) に配置するか、Tomahawk を使用<t:saveState>して後続のリクエストで Bean を保持する必要があります。

以下も参照してください。

于 2011-05-12T19:36:04.080 に答える