0

JSF1.2 から 2.1 に移行しています。faces-config.xml の Bean のエントリを注釈に変更しました。@ViewScoped の代わりに @RequestScoped と @ManagedProperties (いくつかのクラスの多くのパラメーターに対して) を使用しようとしましたが、@ViewScoped として注釈が付けられたフォーム Bean の送信をクリックするたびに再作成されます。@SessionScoped の場合、すべてが正しく機能します。

私はここでいくつかの Q&A とこの記事を読みましたが、強制的に動作させたわけではありません。

JSTL タグを render 属性に変更するか、c:if と ui:param をレンダリングします。

私のweb.xmlで、paramsを設定しました:

<context-param>
  <param-name>javax.faces.PARTIAL_STATE_SAVING</param-name>
  <param-value>false</param-value>
</context-param>
<context-param>
  <param-name>javax.faces.STATE_SAVING_METHOD</param-name>
  <param-value>CLIENT</param-value>
</context-param>

javax.faces.PARTIAL_STATE_SAVING = true を試しましたが、うまくいきませんでした。javax.faces.STATE_SAVING_METHOD = SERVER と同じ問題。

テストのためにタグハンドラを削除しましたが、それも役に立ちませんでした。

プロジェクトで使用されているのは、Mojarra 2.1.13、hibernate 3.6、spring 3.1 (前任者によって更新されたフォーム 2.x を知っている限り)、acegi-security-1.0.5、tomahawk20、urlrewrite-3.2.0 です。

私はTomcat 6を使用しています

編集:

これが私の Bean です: package my.package;

import javax.faces.bean.ManagedBean; 
import javax.faces.bean.SessionScoped;
import javax.faces.bean.ViewScoped;

import my.package.MyOtherBean;

@ManagedBean(name="someNameBean")
@ViewScoped
//@SessionScoped
public class MyBean extends MyOtherBean {

public MyBean(){
    super();
    //XXX
    System.out.println("-->> someNameBean is being created");       
}
}



package my.package;

@ManagedBean(name="someNameMyOtherBean")
//@ViewScoped
@SessionScoped
public class MyOtherBean extends BaseBean {

private ClassWithFormFields dataIn; //getter & setter exist
//a lot of code here

}

beanの使用例

<h:selectOneMenu value="#{someNameBean.dataIn.currencyId}" id="currencyId" tabindex="2" >
<f:selectItems value="#{someNameBean.dataIn..availableCurrencies}"/>
</h:selectOneMenu>

更新 serviceLocalizator は、Spring xml ファイルと JSF アノテーションによって管理されます

@ManagedBean
public class BaseBean implements Serializable {

private static final long serialVersionUID = 1L;

protected transient Logger log = Logger.getLogger(this.getClass());

@ManagedProperty(value="#{serviceLocalizator}")
protected transient ServiceLocalizator serviceLocalizator;

    //few more lines

}

更新 2: それは私のせいです。@kolossusに感謝します。彼は方向性を示しました。私は答えを探していましたが、BalusC の記事を見つけて読みました。そして今、バッキング Bean アクションで文字列を返すべきではありません。文字列の代わりに null を使用すると機能します。ビューの概念をよく理解していませんでした。タブ/ウィンドウが同じである限り、ViewSoped Bean id は有効であると考えました。今、私はそれがJSFビューであることを知っています。ご迷惑をおかけして申し訳ありません。

新しいページへのリダイレクトで @ViewSoped を使用する方法はありますか?

4

1 に答える 1

1

注意: 2 つの異なるビューから同じ (非セッション スコープの) Bean を参照すると、その Bean の2 つのインスタンスが作成されます。

JSF でのナビゲートは非常に基本的で、JSF ビューをサポートしているどのような種類の Bean からでも簡単です。

  1. パブリック メソッドの戻り値として、移動しようとしているページの名前 (ビュー ID) を返します。

      public String navigateAway(){
       //Do whatever processing you want here
       return "page2"; //where page2 is the name of an actual .xhtml file in your application     
       }
    
  2. faces_config.xmlファイルで指定された JSF ナビゲーション ケースの結果を返す

      public String navigateAway(){
        //Prior processing
        return "go somewhere else" ;  //where go somewhere else is a navigation outcome you've specified in your faces_config.xml file
       }    
    

    あなたのfaces_config.xmlファイルには、これがあります

      <navigation-rule>
    <from-view-id>/register.xhtml</from-view-id>
    <navigation-case>
        <from-outcome>go somewhere else</from-outcome>
        <to-view-id>/review_registration.xhtml</to-view-id>
        <redirect/>
    </navigation-case>
    

ただし、アクションの後も同じページに留まりたい場合はnull、メソッドで文字列の代わりに戻るだけで、別のビューに移動することはありません。また、バッキング Bean のスコープによっては、null 値を返す場合、Bean の同じインスタンスを使用していることを確認できます。

詳しくはこちらをご覧ください

于 2012-10-27T20:46:09.323 に答える