Java ValueChangeListener不工作
这是我在托管bean中的代码:-Java ValueChangeListener不工作,java,jsf,jsf-2,valuechangelistener,Java,Jsf,Jsf 2,Valuechangelistener,这是我在托管bean中的代码:- <?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
<?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:f="http://java.sun.com/jsf/core">
<h:head>
<title>Facelet Title</title>
</h:head>
<h:body>
<center>
<h:form>
<h2> <u>Select Fruit(s). </u> </h2>
<!-- Value Change Listener is entirely superflous. You can make a full blown project without requiring the need to ever use this...This is
just for demo purpose..-->
<h:selectManyMenu onchange="document.forms[0].submit();" style="height: 200px;font-size: 1.5em;width: 200px;" >
<f:selectItems value="#{actionValueLisBean.fruitsList}" var="fruit" itemLabel="#{fruit}" itemValue="#{fruit}"/>
<f:valueChangeListener type="beans.ActionValueLisBean"/>
</h:selectManyMenu>
<h3> Your previous selection is :<h:outputText value="#{actionValueLisBean.prevSel}"/></h3>
<h3>Your current selection is :<h:outputText value="#{actionValueLisBean.currSel}"/></h3>
</h:form>
</center>
</h:body>
</html>
Facelet标题
选择水果。
您以前的选择是:
您当前的选择是:
这是我的豆子:-
package beans;
import com.sun.jmx.remote.internal.ArrayQueue;
import java.util.List;
import javax.enterprise.context.RequestScoped;
import javax.faces.bean.ManagedBean;
import javax.faces.event.AbortProcessingException;
import javax.faces.event.ValueChangeEvent;
import javax.faces.event.ValueChangeListener;
@ManagedBean
@RequestScoped
public class ActionValueLisBean implements ValueChangeListener {
private List<String> fruitsList;
private String currSel;
private String prevSel;
public String getCurrSel() {
return currSel;
}
public void setCurrSel(String currSel) {
this.currSel = currSel;
}
public String getPrevSel() {
return prevSel;
}
public void setPrevSel(String prevSel) {
this.prevSel = prevSel;
}
public List<String> getFruitsList() {
return fruitsList;
}
public void setFruitsList(List<String> fruitsList) {
this.fruitsList = fruitsList;
}
public ActionValueLisBean() {
fruitsList = new ArrayQueue<String>(5);
fruitsList.add("Apple");
fruitsList.add("Mango");
fruitsList.add("Banana");
fruitsList.add("Peach");
fruitsList.add("Plum");
}
@Override
public void processValueChange(ValueChangeEvent event) throws AbortProcessingException {
if(event.getOldValue() != null)
prevSel = event.getOldValue().toString();
if(event.getNewValue() != null)
currSel = "abc";
}
}
packagebean;
导入com.sun.jmx.remote.internal.ArrayQueue;
导入java.util.List;
导入javax.enterprise.context.RequestScope;
导入javax.faces.bean.ManagedBean;
导入javax.faces.event.AbortProcessingException;
导入javax.faces.event.ValueChangeEvent;
导入javax.faces.event.ValueChangeListener;
@ManagedBean
@请求范围
公共类ActionValueLisBean实现ValueChangeListener{
私人名单;
私有字符串currSel;
私有字符串prevSel;
公共字符串getCurrSel(){
返回电流;
}
公共无效设置currSel(字符串currSel){
this.currSel=currSel;
}
公共字符串getPrevSel(){
返回prevSel;
}
公共void setPrevSel(字符串prevSel){
this.prevSel=prevSel;
}
公共列表getFruitsList(){
返回水果列表;
}
公共无效设置结果列表(列表结果列表){
this.fruitsList=fruitsList;
}
公共行动价值LisBean(){
水果列表=新阵列队列(5);
水果列表。添加(“苹果”);
水果列表。添加(“芒果”);
水果列表。添加(“香蕉”);
水果列表。添加(“桃子”);
水果列表。添加(“李子”);
}
@凌驾
public void进程ValueChange(ValueChangeEvent事件)引发AbortProcessingException{
if(event.getOldValue()!=null)
prevSel=event.getOldValue().toString();
if(event.getNewValue()!=null)
currSel=“abc”;
}
}
然后我有prevSel,currSel被绑定到h:outputText
。但是,即使processValueChange被正确触发并且System.out.println(event.getNewValue())也无法获取该值代码>也可以正常工作。我也试着设置不同的bean范围,但没有用。我知道ValueChangeListener完全没用。我仍然想知道它是如何工作的
提前感谢:)我不知道你说的“价值没有得到”是什么意思。你应该进一步澄清这一点
至少,它的唯一目的是监听一个值的变化,这样您就可以根据变化做一些业务工作,比如记录或预加载一些与新值相关的内容。当初始值等于提交的值时,将不会调用此方法
下面是一段代码片段,供您自己使用:
<h:form>
<p>Input value: <h:inputText value="#{bean.value}" valueChangeListener="#{bean.change}"/></p>
<p>Old value: <h:outputText value="#{bean.oldValue}" /></p>
<p>New value: <h:outputText value="#{bean.newValue}" /></p>
<p><h:commandButton value="submit" action="#{bean.submit}" /></p>
</h:form>
更新:根据您的更新:您正在使用两个不同的bean实例。您实际上显示的是托管bean的值,而不是由f:valuechangeelistener
创建的bean的值。您好,请阅读我编辑的文章。我没有使用组件的valuelistener。我正在使用f:valueListener
。你能在我的代码中找到bug吗?我正在读这篇文章:-但它不起作用:(请参阅更新。要解决此问题,请继续我建议的方法。嗨,BalusC,我不太明白。那么我接下来要做什么呢?f:valueChangeListener
创建了一个新的bean实例。它使用的实例与输入/输出组件显示的实例不同。您现在有两个bean,正在显示我是一个“错误的”bean。使用我的方法来实现您最初想到的需求。使用您的方法将监听更改事件与托管bean完全分离(并且您对访问视图中的值更改侦听器bean不感兴趣).太好了!谢谢BalusC.顺便说一句,你的分数已经大大提高了!上次我在6月份使用JSF 2.0时,分数是54.4k。现在是82.8k。这样你甚至可以打破Jon Skeet的记录。
package com.example;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.ViewScoped;
import javax.faces.event.ValueChangeEvent;
@ManagedBean
@ViewScoped
public class Bean {
private String value;
private String oldValue;
private String newValue;
public void submit() {
System.out.println("Submit: " + value);
}
public void change(ValueChangeEvent event) {
oldValue = (String) event.getOldValue();
newValue = (String) event.getNewValue();
System.out.println("Change: " + oldValue + " to " + newValue);
}
public String getValue() {
return value;
}
public String getOldValue() {
return oldValue;
}
public String getNewValue() {
return newValue;
}
public void setValue(String value) {
this.value = value;
}
}