- Java 双重比较
- java - 比较器与 Apache BeanComparator
- Objective-C 完成 block 导致额外的方法调用?
- database - RESTful URI 是否应该公开数据库主键?
我正在学习如何在 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/
我有以下代码:
这是我在托管 bean 中的代码:- Facelet Title Se
如何在数据表中使用 UIInput 组件正确实现 ValueChangeListener,然后我进入监听器方法获取行索引已更改、新值和旧值 变化,不一定产生POST到Server,Post
我正在使用 p:ajax监听器处理值更改事件(因为 valueChangeListener 在表单提交时启动): 处理方法: public void onNameChanged(final Ajax
我的 JSF 页面有两个下拉列表,我想根据第一个下拉列表中选择的值加载第二个列表。但是,仅在我第二次更改选择时才检测到“onchange”事件! 网页代码片段:
我对 ValueChangeListener 有疑问.我有这个代码: private void caricaSelectMainUser(){ Object[] a = socFilName.
我查看了其他类似的帖子,但没有任何帮助。这是我的代码: function submit1() { document.forms["form"].submit(); }
我正在学习如何在 JSF 中使用事件。出于某种原因,当我更改下拉菜单的值时,程序没有更改文本字段中的值。该页面加载并显示“德国”,但不会将文本字段更改为“DE”。有什么建议吗? 索引.xhtml:
我们有一个自定义的 JSF 组件,它以特定方式呈现一些按钮和一个选择框。这是由扩展 UIInput 的类完成的。 xhtml 模板中使用的自定义组件如下所示: 现在,由于我们从运行 JSF 2.0
我有一个简单的 ice:SelectOneMenu 和一个 ice:outputLabel 我想做的就是更改下拉列表中的值以设置我的文本标签告诉我我更改了值以及新值是什么(简单测试,一旦它起作用,我实
我正在尝试 vaadin 网站上提供的教程,当我在表的行上设置项目选择时,教程建议我应该将以下行添加到我的表类中。 addListener((Property.ValueChangeListener)
摘要: JSPX 页面中有一个input File功能,用户可以在其中选择要上传的文件。用户将按保存按钮将文件存储在数据库中。 工作流程: 当用户选择要上传的文件时,valueChangeListen
我正在使用 jDeveloper 12.1.3 和 MAF 2.0.0.0。我正在尝试在移动应用程序中build设置页面。所有项目均基于移动设备上的本地 SQLite 数据库。我已经设置了 POJO(
嗨,我正在与 oracle-adf 合作使用 Jdeveloper。我尝试使用 valuechangelister
假设我像这样定义一个 ComboBox: ComboBox myCombo = new ComboBox(); myCombo.addValueChangeListener(event -> {
我有一个自定义组件,想要向其中添加一个 ValueChangeListener。但我的注册方法有问题。 这是我的自定义组件。 public class CustomComp extends CssLa
它可以很好地加载stateList,但是当我更改状态的值时,它会调用backbean,但addressBO为空。我该如何修复它?还有其他办法吗? 提前致谢。 BackBean
在许多情况下,我需要在运行时在应用程序的许多地方使用某些 UIComponent 的值。但问题是我无法在 ValueChangeListener 之外访问组件的值。我尝试将此值存储在本地临时变量中,我
我调用 valueChangeListener在 上它在数据表中。并且该数据表再次位于另一个(外部)数据表内。在valueChangeListener方法我想要外部dataTable的实例对象。有没
我正在尝试为我的 Web 应用程序实现审计跟踪功能,该功能记录: lastModified(时间戳) modifiedBy(用户信息) userComment(值变化的原因) 对于我的每个输入字段(输
我是一名优秀的程序员,十分优秀!