0

index.xhtmlに次のように2つのSelectOneMenuがあります。menu1 は基本的に言語 (sp または en) を選択し、menu2 は可能なシリアル番号 (0 から 3) を表示します。2 つのメニューのデフォルト値を初期化する init コンストラクター (ポスト コンストラクター) があります。ただし、奇妙な理由で、デフォルトの言語以外の言語のデフォルトのシリアル番号以外のシリアル番号を選択すると、どういうわけか言語が初期化デフォルトにリセットされます:(

<?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-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml"
      xmlns:h="http://java.sun.com/jsf/html"
      xmlns:ui="http://java.sun.com/jsf/facelets"
      xmlns:f="http://java.sun.com/jsf/core">

    <h:head>
        <title>My page</title>
    </h:head>
    <h:body>
                            <div>
                                <h4>Change Existing Description</h4>
                            </div>
                            <h:form id="myForm">
                                    <h:panelGrid columns="4">
                                        <h:outputLabel value="Language:" />
                                        <h:selectOneMenu value="#{myBean.language}">
                                            <f:selectItems value="#{myBean.languages}" />
                                            <f:ajax listener="#{myBean.doUpdate}" render ="myForm" />
                                        </h:selectOneMenu>
                                        <h:outputLabel value="SerialID:" />
                                        <h:selectOneMenu value="#{myBean.serialID}">
                                            <f:selectItems value="#{myBean.serialIDs}" />
                                            <f:ajax listener="#{myBean.doUpdate}" render ="myForm" />
                                        </h:selectOneMenu>

                                    </h:panelGrid>
                                </h:form>
    </h:body>
</html>

これが私のBeanコードです。問題はどこだ??お知らせ下さい!

package bean;



import java.util.ArrayList;
import java.util.List;
import javax.annotation.PostConstruct;
import javax.ejb.Stateful;
import javax.enterprise.context.RequestScoped;
import javax.faces.bean.ManagedBean;



@ManagedBean(name = "myBean")
//@Stateless
@Stateful
@RequestScoped
public class MyBean {

    public static final int PERMISSIONS = 2;
    private List<String> languages;
    private String language;
    private int serialID;
    private List<Integer> serialIDs;

    /**
     * init() method for initializing the bean. Is called after constuction.
     */

    @PostConstruct
    private void init() {
    //public MyBean () {
        languages = getAllLanguages();
        language = "en"; //defaultLanguage 
        serialID = 3;
        serialIDs = getSerialIDsFromOverview();
    } 

    public List<String> getLanguages() {
        System.out.println("getLanguages, language " +language);
        return languages;
    }


    public int getPERMISSIONS() {
        return PERMISSIONS;
    }

    public String getLanguage() {
        System.out.println("getLanguage " +language);
        return language;
    }

    public void setLanguage(String language) {
        System.out.println("setLanguage " +language);
        this.language = language;
    }


    public int getSerialID() {
        System.out.println("getSerialID " +serialID);
        return serialID;
    }

    public void setSerialID(int serialID) {
          System.out.println("setSerialID " +serialID);
        this.serialID = serialID;
    }

    public List<Integer> getSerialIDs() {
        System.out.println("getSerialIDs language =  "+language );
        return serialIDs;
    }

    public List<String> getAllLanguages() {
        List<String> results = new ArrayList<String>();
        results.add("sp");
        results.add("en");

        if(results != null){
            System.out.println("getting all languages");
        }
        return results;
    }


    public void doUpdate() {

         System.out.println("doUpdate language " +language);
         System.out.println("doUpdate serialID " +serialID);

    }

    /**
     * Returns a list of all serialIDs present in the overview.
     * @return 
     */
    private List<Integer> getSerialIDsFromOverview() {
        List<Integer> results = new ArrayList<Integer>();
        results.add(0);
        results.add(1);
        results.add(2);
        results.add(3);
        return results;
    }

}

更新:

cubbukからの提案を受けた後、@ViewScoped アノテーションを付けてコードを修正し、Bean に Serializable を実装しました。これは機能します。ただし、次にやらなければならなかったことは、@EJB アノテーションを含めてステートレス Bean を呼び出すことでした。この Bean は、エンティティ マネージャーを呼び出して、シリアル ID を "ハードコーディング" する代わりにデータベースから取得します。それは私が問題に遭遇したときです: Not serializable exception " java.io.NotSerializableException: bean.__EJB31_Generated__ .これを解決するにはどうすればよいですか? myBean を RequestScope に戻し、Serializable を削除すると、問題なくコードを実行できましたが、トグル値を初期化するメニューの:(

ちなみに、私はこの投稿をチェックしています: @ViewScoped マネージド Bean の @EJB は java.io.NotSerializableExceptionを引き起こし、状態保存メソッドをサーバーに設定しますが、「サーバーからの空の応答」ポップアップ メッセージが表示されます :( 助けてください!

4

1 に答える 1

1

@RequestScoped各リクエストの後にBeanをバッキングBeanとして使用しているため、initメソッドが呼び出され、値がリセットされます。@ViewScopedこれを避けるには、 Bean をバッキング Bean として使用する必要があります。それに応じて Bean を更新しました。バッキング Bean がSerializableインターフェイスを実装するようになったことに注意してください。この Bean はサーブレットに格納され、コンテンツをメモリに保持できない場合はディスクにフラッシュする必要があるため、これが必要です。Beanの詳細については@ViewScoped、次の投稿を参照してください。

http://balusc.blogspot.com/2010/06/benefits-and-pitfalls-of-viewscoped.html

これらとは別に、名前付け規則については、get と set で始まるメソッドが主に getter と setter に使用されるため、getAllLanguagesandgetSerialIDsFromOverviewメソッドの名前をinitAllLanguagesandに変更しました。initSerialIds

最後に、f:ajaxコマンドをデフォルトで使用UIInputすると、バインド先の ajax コマンドがレンダリングされて実行されます。h:selectOneMenu互いの値に従ってメニューを更新しないため、フォーム全体をレンダリングする必要はありません。この場合、以下で十分です。

<h:form id="myForm">
                                    <h:panelGrid columns="4">
                                        <h:outputLabel value="Language:" />
                                        <h:selectOneMenu value="#{myBean.language}">
                                            <f:selectItems value="#{myBean.languages}" />
                                            <f:ajax listener="#{myBean.doUpdate}"/>
                                        </h:selectOneMenu>
                                        <h:outputLabel value="SerialID:" />
                                        <h:selectOneMenu value="#{myBean.serialID}">
                                            <f:selectItems value="#{myBean.serialIDs}" />
                                            <f:ajax listener="#{myBean.doUpdate}"/>
                                        </h:selectOneMenu>

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

@ManagedBean
@ViewScoped
public class MyBean implements Serializable
{

    public static final int PERMISSIONS = 2;
    private List<String> languages;
    private String language;
    private int serialID;
    private List<Integer> serialIDs;

    /**
     * init() method for initializing the bean. Is called after constuction.
     */
    @PostConstruct
    protected void init()
    {
        //public MyBean () {
        System.out.println("lang: " + language);
        System.out.println("serialId: " + serialID);
        System.out.println("init is called");
        initAllLanguages();
        initSerialIds();
        language = "en"; //defaultLanguage 
        serialID = 3;
    }

    public List<String> getLanguages()
    {
        return languages;
    }

    public int getPERMISSIONS()
    {
        return PERMISSIONS;
    }

    public String getLanguage()
    {
        return language;
    }

    public void setLanguage(String language)
    {
        this.language = language;
    }

    public int getSerialID()
    {
        return serialID;
    }

    public void setSerialID(int serialID)
    {
        this.serialID = serialID;
    }

    public List<Integer> getSerialIDs()
    {
        return serialIDs;
    }

    private void initAllLanguages()
    {
        languages = new ArrayList<String>();
        languages.add("sp");
        languages.add("en");
    }

    public void doUpdate()
    {

        System.out.println("doUpdate language " + language);
        System.out.println("doUpdate serialID " + serialID);

    }

    /**
     * Returns a list of all serialIDs present in the overview.
     *
     * @return
     */
    private void initSerialIds()
    {
        serialIDs = new ArrayList<Integer>();
        serialIDs.add(0);
        serialIDs.add(1);
        serialIDs.add(2);
        serialIDs.add(3);
    }
}

乾杯

于 2013-02-04T14:50:16.203 に答える