use*_*376 4 java jsf jsp event-handling
我正在学习如何使用JSF的事件.出于某种原因,当我更改下拉菜单的值时,程序不会更改文本字段中的值.页面加载并显示"德国",但不会将文本字段更改为"DE".有什么建议?
的index.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>
Run Code Online (Sandbox Code Playgroud)
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();
}
}
Run Code Online (Sandbox Code Playgroud)
Bal*_*usC 15
你基本上是滥用valueChangeListener了actionListener.该值更改侦听器intented有机会获得这两个新旧价值,就在当新的输入值被提交和模型值进行了更新,这样就可以,例如增加约值变化的日志条目之间.你显然对旧的价值不感兴趣.你根本不对价值变化事件感兴趣.您只对新模型值感兴趣.因此,您根本不应该使用值更改侦听器.
通常,您希望在动作侦听器方法中执行此任务.您可以使用它<f:ajax>来定义ajax动作侦听器:
<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}" />
Run Code Online (Sandbox Code Playgroud)
同
public void changeEvent() {
selectedItem = selectedItem;
}
Run Code Online (Sandbox Code Playgroud)
但是,由于您已将输入绑定到与下拉列表相同的属性,因此整个侦听器是多余的.以下内容应该为您做到:
<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}" />
Run Code Online (Sandbox Code Playgroud)
你看到的问题是因为它onchange="submit()"基本上提交了整个表单,包括所有其他输入字段.由于JSF按顺序处理输入字段,并且您已将两个字段绑定到同一属性,因此值<h:inputText>将覆盖值<h:selectOneMenu>.根据我对这个问题的评论,当你把它作为一个<h:inputText readonly="true">或一个<h:outputText>(因此它不会将其值提交给服务器)时,你不会遇到这个问题.
| 归档时间: |
|
| 查看次数: |
18635 次 |
| 最近记录: |