Ajax JSF 2.1 SelectOneMenu自动切换为初始值

Ajax JSF 2.1 SelectOneMenu自动切换为初始值,ajax,jakarta-ee,web-applications,jsf-2,Ajax,Jakarta Ee,Web Applications,Jsf 2,我在index.xhtml中有2个selectOne菜单,如下所示。menu1基本上选择一种语言(sp或en),menu2显示可能的序列号(0到3)。我有init构造函数(post构造函数),它初始化两个菜单上的默认值。但是,出于某种奇怪的原因,如果我为非默认语言的语言选择了非默认序列号的序列号,该语言会以某种方式重置为init default:( 我的页面 更改现有描述 这是我的Bean代码。问题在哪里?请建议 package bean; import java.util.Array

我在index.xhtml中有2个selectOne菜单,如下所示。menu1基本上选择一种语言(sp或en),menu2显示可能的序列号(0到3)。我有init构造函数(post构造函数),它初始化两个菜单上的默认值。但是,出于某种奇怪的原因,如果我为非默认语言的语言选择了非默认序列号的序列号,该语言会以某种方式重置为init default:(


我的页面
更改现有描述
这是我的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;
    }

}
packagebean;
导入java.util.ArrayList;
导入java.util.List;
导入javax.annotation.PostConstruct;
导入javax.ejb.Stateful;
导入javax.enterprise.context.RequestScope;
导入javax.faces.bean.ManagedBean;
@ManagedBean(name=“myBean”)
//@无国籍
@有状态
@请求范围
公共类MyBean{
公共静态最终int权限=2;
私人名单语言;
私有字符串语言;
私有int-serialID;
私有列表序列ID;
/**
*用于初始化bean的init()方法。在构造后调用。
*/
@施工后
私有void init(){
//公共豆豆(){
语言=getAllLanguages();
language=“en”//defaultLanguage
serialID=3;
serialIDs=getSerialIDsFromOverview();
} 
公共列表getLanguages(){
System.out.println(“getLanguages,language”+语言);
返回语言;
}
公共int getPERMISSIONS(){
返回权限;
}
公共字符串getLanguage(){
System.out.println(“getLanguage”+语言);
返回语言;
}
公共语言(字符串语言){
System.out.println(“设置语言”+语言);
这种语言=语言;
}
public int getSerialID(){
System.out.println(“getSerialID”+serialID);
返回serialID;
}
public void setSerialID(int serialID){
System.out.println(“setSerialID”+serialID);
this.serialID=serialID;
}
公共列表getSerialIDs(){
System.out.println(“getSerialIDs language=“+language”);
返回serialid;
}
公共列表getAllLanguages(){
列表结果=新建ArrayList();
结果。添加(“sp”);
结果。添加(“en”);
如果(结果!=null){
System.out.println(“获取所有语言”);
}
返回结果;
}
公共无效数据更新(){
System.out.println(“双更新语言”+语言);
System.out.println(“更新serialID”+serialID);
}
/**
*返回概述中存在的所有SerialID的列表。
*@返回
*/
私有列表getSerialIDsFromOverview(){
列表结果=新建ArrayList();
结果:添加(0);
结果:增加(1);
结果:增加(2);
结果:增加(3);
返回结果;
}
}
更新:

在听取了cubbuk的建议后,我坐下来用@viewscope注释更正了我的代码,并使bean实现了可序列化。这是可行的。但是,接下来我必须做的是包含@EJB注释来调用无状态bean,该无状态bean调用实体管理器从数据中获取serialid而不是“硬编码”它。这就是我遇到的问题:不可序列化异常“java.io.NotSerializableException:bean.\uuuEJB31\u生成了\uuuu。如何解决这个问题?当我将myBean返回到RequestScope并删除Serializable时,我可以毫无问题地运行代码,但是菜单切换到init值:(

顺便说一下,我检查了这篇文章:并将我的状态保存方法设置为server,但这会给我“empyresponsefromserver”弹出消息:(
请帮助!

因为您在每次请求后都使用
@RequestScoped
bean作为您的支持bean,您的
init
方法正在被调用,并且您的值正在被重置。为了避免这种情况,您需要使用
@ViewScoped
bean作为您的支持bean。我相应地更新了您的bean,请注意,您的支持bean现在已经实现ts
Serializable
接口。这是必需的,因为此bean将存储在您的servlet中,如果内容无法保存在内存中,则需要将其刷新到磁盘。有关
@ViewScoped
bean的详细信息,请查看以下帖子:

除此之外,对于命名约定,我将您的
getAllLanguages
getSerialIDsFromOverview
方法重命名为
initAllLanguages
initSerialIds
,因为以get和set开头的方法可能会令人困惑,因为它们主要用于getter和setter

最后,当您默认使用
f:ajax
命令时,将呈现并执行绑定到ajax命令的
UIInput
。由于您不根据彼此的值刷新
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);
    }
}

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