首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >JSF ValueChangeListener不工作

JSF ValueChangeListener不工作
EN

Stack Overflow用户
提问于 2011-11-01 00:41:21
回答 2查看 20.4K关注 0票数 5

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

Index.xhtml:

代码语言:javascript
复制
<?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

代码语言:javascript
复制
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();
}

}
EN

回答 2

Stack Overflow用户

发布于 2011-11-01 00:45:01

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

通常,您希望在操作侦听器方法中完成此工作。您可以使用<f:ajax>来定义ajax操作侦听器:

代码语言:javascript
复制
<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}" />

使用

代码语言:javascript
复制
public void changeEvent() {
    selectedItem = selectedItem;
}

但由于您已将输入绑定到与dropdown相同的属性,因此整个侦听器都是多余的。只需以下代码即可完成此操作:

代码语言:javascript
复制
<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按顺序处理输入字段,并且您已经将这两个字段绑定到相同的属性,因此<h:inputText>的值将覆盖<h:selectOneMenu>的值。根据我对这个问题的评论,当您将其设置为<h:inputText readonly="true"><h:outputText> (这样它就不会将其值提交给服务器)时,就不会出现这个问题。

票数 16
EN

Stack Overflow用户

发布于 2011-11-01 00:56:48

将其更改为output text component,并查看其是否有效

代码语言:javascript
复制
<h:inputText value="#{Bean.selectedItem}" />

代码语言:javascript
复制
<h:outputText value="#{Bean.selectedItem}" />

致以问候!

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/7956744

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档