Ajax JSF 2.1 SelectOneMenu自动切换为初始值
我在index.xhtml中有2个selectOne菜单,如下所示。menu1基本上选择一种语言(sp或en),menu2显示可能的序列号(0到3)。我有init构造函数(post构造函数),它初始化两个菜单上的默认值。但是,出于某种奇怪的原因,如果我为非默认语言的语言选择了非默认序列号的序列号,该语言会以某种方式重置为init default:(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
我的页面
更改现有描述
这是我的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现在已经实现tsSerializable
接口。这是必需的,因为此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);
}
}