gpt4 book ai didi

java - JSF ValueChangeListener 不工作

转载 作者:搜寻专家 更新时间:2023-11-01 01:06:55 25 4
gpt4 key购买 nike

我正在学习如何在 JSF 中使用事件。出于某种原因,当我更改下拉菜单的值时,程序没有更改文本字段中的值。该页面加载并显示“德国”,但不会将文本字段更改为“DE”。有什么建议吗?

索引.xhtml:

<?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:f="http://java.sun.com/jsf/core"
xmlns:h="http://java.sun.com/jsf/html">
<h:head>
<title>Facelet Title</title>
</h:head>
<h:body>
<f:view>
<h:form>
<h:selectOneMenu value="#{Bean.selectedItem}" valueChangeListener="#{Bean.changeEvent}" onchange="submit()" >
<f:selectItems value="#{Bean.itemsList}" />
</h:selectOneMenu>
<br />
<h:inputText value="#{Bean.selectedItem}" />
</h:form>
</f:view>
</h:body>

MyBean.java

import javax.faces.bean.ManagedBean;
import javax.faces.bean.RequestScoped;
import java.util.ArrayList;
import javax.faces.model.SelectItem;
import javax.faces.event.ValueChangeEvent;
@ManagedBean (name = "Bean")
@RequestScoped
public class MyBean {

private static ArrayList menuItems;
private String selectedItem = "EN";
static {
menuItems = new ArrayList();
menuItems.add(new SelectItem("EN", "English"));
menuItems.add(new SelectItem("DE", "Germany"));
}

public ArrayList getItemsList() {
return this.menuItems;
}

public void setSelectedItem(String item) {
this.selectedItem = item;
}

public String getSelectedItem() {
return selectedItem;
}

public void changeEvent(ValueChangeEvent e) {
selectedItem = e.getNewValue().toString();
}

}

最佳答案

你基本上是在滥用 valueChangeListener作为actionListener .值更改监听器旨在访问两者旧值和新值,就在提交新输入值和更新模型值之间,例如,您可以添加有关值更改的日志条目。您显然对旧值不感兴趣。您对值更改事件根本不感兴趣。您只对新模型值感兴趣。因此,您根本不应该使用值更改监听器。

通常,您希望在 Action 监听器方法中完成这项工作。您可以使用 <f:ajax>定义一个 ajax Action 监听器:

<h:selectOneMenu value="#{Bean.selectedItem}">
<f:selectItems value="#{Bean.itemsList}" />
<f:ajax execute="@this" listener="#{Bean.changeEvent}" render="input" />
</h:selectOneMenu>
<h:inputText id="input" value="#{Bean.selectedItem}" />

public void changeEvent() {
selectedItem = selectedItem;
}

但由于您已将输入绑定(bind)到与下拉列表相同的属性,因此整个监听器都是多余的。只需执行以下操作即可:

<h:selectOneMenu value="#{Bean.selectedItem}">
<f:selectItems value="#{Bean.itemsList}" />
<f:ajax execute="@this" render="input" />
</h:selectOneMenu>
<h:inputText id="input" value="#{Bean.selectedItem}" />

您看到的问题是因为 onchange="submit()"实质上提交了整个表单,包括所有其他输入字段。由于 JSF 按顺序处理输入字段,并且您已将这两个字段绑定(bind)到同一属性,即 <h:inputText> 的值将覆盖 <h:selectOneMenu> 的值.根据我对这个问题的评论,当你把它设为 <h:inputText readonly="true"> 时,你就不会遇到这个问题。或 <h:outputText> (这样它就不会将其值提交给服务器)。

关于java - JSF ValueChangeListener 不工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7956744/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com