Jsf 2 简单相关SelectOne菜单不工作
我有以下代码,其中显示两个SelectOne菜单。第一个菜单的值是语言,第二个菜单告诉我,如果是英语,则选择“一个或两个”,如果是西班牙语,则选择“uno或duo” 我还需要确定我是否选择了项目“2”,如果我现在将语言更改为“Sp”,则“duo”必须是所选项目 我该怎么做?这是我的 index.html:Jsf 2 简单相关SelectOne菜单不工作,jsf-2,Jsf 2,我有以下代码,其中显示两个SelectOne菜单。第一个菜单的值是语言,第二个菜单告诉我,如果是英语,则选择“一个或两个”,如果是西班牙语,则选择“uno或duo” 我还需要确定我是否选择了项目“2”,如果我现在将语言更改为“Sp”,则“duo”必须是所选项目 我该怎么做?这是我的 index.html: <?xml version='1.0' encoding='UTF-8' ?> <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Tr
<?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>Facelet Title</title>
</h:head>
<h:body>
<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="Items:" />
<h:selectOneMenu value="#{myBean.item}">
<f:selectItems value="#{myBean.items}" />
<f:ajax listener="#{myBean.doUpdate}" render ="myForm" />
</h:selectOneMenu>
<h:panelGrid columns="1" id ="show" >
<h:outputLabel value="#{myBean.language} #{myBean.item}"/>
</h:panelGrid>
</h:panelGrid>
</h:form>
</h:body>
</html>
Facelet标题
MyBean:
package bean;
import java.io.Serializable;
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;
import javax.faces.bean.ViewScoped;
@ManagedBean(name = "myBean")
//@Stateless
@Stateful
@ViewScoped
public class MyBean implements Serializable{
private List<String> languages;
private String language;
private String item;
private List<String> items;
public List<String> getItems() {
return items;
}
public void setItems(List<String> items) {
this.items = items;
}
/**
* init() method for initializing the bean. Is called after constuction.
*/
@PostConstruct
private void init() {
//public MyBean () {
languages = getAllLanguages();
language = "en"; //defaultLanguage
items = getItemsFromOverview();
}
public String getItem() {
return item;
}
public void setItem(String item) {
this.item = item;
}
public List<String> getLanguages() {
System.out.println("getLanguages, language " +language);
return languages;
}
public String getLanguage() {
System.out.println("getLanguage " +language);
return language;
}
public void setLanguage(String language) {
System.out.println("setLanguage " +language);
this.language = language;
}
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 item " +item);
}
/**
* Returns a list of all serialIDs present in the overview.
* @return
*/
private List<String> getItemsFromOverview() {
List<String> results = new ArrayList<String>();
if(language.equalsIgnoreCase("en")){
results.add("one");
results.add("two");
}
else {
results.add("uno");
results.add("duo");
}
return results;
}
}
packagebean;
导入java.io.Serializable;
导入java.util.ArrayList;
导入java.util.List;
导入javax.annotation.PostConstruct;
导入javax.ejb.Stateful;
导入javax.enterprise.context.RequestScope;
导入javax.faces.bean.ManagedBean;
导入javax.faces.bean.ViewScoped;
@ManagedBean(name=“myBean”)
//@无国籍
@有状态
@视域
公共类MyBean实现了可序列化{
私人名单语言;
私有字符串语言;
私有字符串项;
私人清单项目;
公共列表getItems(){
退货项目;
}
公共无效集合项(列表项){
这个项目=项目;
}
/**
*用于初始化bean的init()方法。在构造后调用。
*/
@施工后
私有void init(){
//公共豆豆(){
语言=getAllLanguages();
language=“en”//defaultLanguage
items=getItemsFromOverview();
}
公共字符串getItem(){
退货项目;
}
公共void集合项(字符串项){
this.item=项目;
}
公共列表getLanguages(){
System.out.println(“getLanguages,language”+语言);
返回语言;
}
公共字符串getLanguage(){
System.out.println(“getLanguage”+语言);
返回语言;
}
公共语言(字符串语言){
System.out.println(“设置语言”+语言);
这种语言=语言;
}
公共列表getAllLanguages(){
列表结果=新建ArrayList();
结果。添加(“sp”);
结果。添加(“en”);
如果(结果!=null){
System.out.println(“获取所有语言”);
}
返回结果;
}
公共无效数据更新(){
System.out.println(“双更新语言”+语言);
系统输出打印项次(“更新项”+项);
}
/**
*返回概述中存在的所有SerialID的列表。
*@返回
*/
私有列表getItemsFromOverview(){
列表结果=新建ArrayList();
if(语言等信号情况(“en”)){
结果。添加(“一”);
结果。添加(“两”);
}
否则{
结果。添加(“uno”);
结果。添加(“duo”);
}
返回结果;
}
}
很简单。您忘了更改第二个列表(项
)的当前值。按如下操作
<h:form id="myForm">
<h:selectOneMenu id="list1" value="#{myBean.language}" actionListener="#{myBean.updateFiledsInList2}">
<f:selectItems value="#{myBean.languages}" />
<f:ajax execute="@this" render ="list2 lang" />
</h:selectOneMenu>
<h:selectOneMenu id="list2" value="#{myBean.item}" >
<f:selectItems value="#{myBean.items}" />
<f:ajax execute="@this" render="item" />
</h:selectOneMenu>
<h:outputText id="lang" value="#{myBean.language}"/>
<h:outputText id="item" value="#{myBean.item}"/>
</h:form>
顺便说一句,这是西班牙语的dos;)你让它工作了吗?如果我在表单名上执行ajax怎么办?那么它是否应该根据菜单1更新菜单2?你可以指定
render=“@form”
,但这实际上是一项开销。如果您想更新某些内容,并且应该知道要更新的内容,请更新它。否则,请更好地考虑代码的结构。此外,从属列表应保留disctinct值,如汽车品牌-车型。如果您有一个具有多语言支持的列表,则您的设置将大大改进t和其他保存语言选择的位置(会话范围的bean、视图参数等)。这样,您的列表将在bean的构造过程中初始化。
public void updateFiledsInList2(ActionEvent event) {
if(language.equals("en")) {
items = new ArrayList<String>();
items.add("one");
items.add("two");
} else if(language.equals("es")) {
items = new ArrayList<String>();
items.add("uno");
items.add("dos");
} else {
items = null;
}
}
public void updateFiledsInList2(ActionEvent event) {
int index = (item == null) ? -1 : items.indexOf(item);
if(language.equals("en")) {
items = new ArrayList<String>();
items.add("one");
items.add("two");
} else if(language.equals("es")) {
items = new ArrayList<String>();
items.add("uno");
items.add("dos");
} else {
items = null;
}
if(index >= 0) {
item = (items == null) ? null : items.get(index);
} else {
item = null;
}
}