JSF 复选框值未发送到 bean
JSF checkbox value not sent to bean
虽然视图可以从 bean 中获取所有值,但当复选框 (h:selectBooleanCheckbox
) 被切换时,bean 不会更新。 Item
中的 setSelected()
方法从未从视图中调用。
我已经尝试将 bean 的范围更改为应用程序,使用映射而不是所选 属性 的值,并且愚蠢地尝试编写我自己的 ajax javascript 函数。
我正在使用的应用程序有点旧,所以我使用的是 Tomcat 6、JSF 1.2 和 Richfaces 3.3。3.Final。
看起来应该很简单,我想我遗漏了一些明显的东西,但是我已经在这两天了,无法弄清楚为什么没有更新 bean。
我的看法是:
<!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:ui="http://java.sun.com/jsf/facelets"
xmlns:h="http://java.sun.com/jsf/html"
xmlns:f="http://java.sun.com/jsf/core"
xmlns:c="http://java.sun.com/jstl/core"
xmlns:fn="http://java.sun.com/jsp/jstl/functions"
xmlns:a4j="http://richfaces.org/a4j"
xmlns:rich="http://richfaces.org/rich">
<head>
<title>JSF</title>
</head>
<body>
<h:form id="tableForm">
<rich:dataTable id="table" value="#{managedBean}" var="item" width="100%">
<rich:column label="Select" align="center" width="40px" >
<f:facet name="header">
<h:outputText value="Select" />
</f:facet>
<h:selectBooleanCheckbox value="#{item.selected}" >
<a4j:support execute="@this" event="onclick" ajaxSingle="true"/>
</h:selectBooleanCheckbox>
</rich:column>
<rich:column label="Name" align="center" width="40px">
<f:facet name="header">
<h:outputText value="Name" />
</f:facet>
<h:outputText value="#{item.name}" />
</rich:column>
</rich:dataTable>
</h:form>
</body>
</html>
我在会话范围内有一个托管 bean ItemBean:
import org.richfaces.model.ExtendedTableDataModel;
public class ItemBean extends ExtendedTableDataModel<Item>{
public ItemBean() {super(new ItemProvider());}
}
ItemProvider 是:
import org.richfaces.model.DataProvider;
public class ItemProvider implements DataProvider<Item>{
private List<Item> items = new ArrayList<Item>();
public ItemProvider(){
for(int i = 0; i < 10; i++){
items.add(new Item(i, "Item "+i));
}
}
public Item getItemByKey(Object key) {return items.get((Integer)key);}
public List<Item> getItemsByRange(int fromIndex, int toIndex) {
return new ArrayList<Item>(items.subList(fromIndex, toIndex));
}
public Object getKey(Item arg0) {return arg0.getId();}
public int getRowCount() {return items.size();}
}
项目是:
public class Item {
private final int id;
private final String name;
private boolean selected;
public Item(int id, String name) {
this.id = id;
this.name = name;
selected = false;
}
public int getId(){
return id;
}
public String getName(){
return name;
}
public boolean isSelected(){
return selected;
}
public void setSelected(boolean selected){
this.selected = selected;
}
}
我假设您的原版 html
、head
和 body
标签可能会导致此问题。
Ajax-stuff (javascript) 有时必须进入页面的 <head>
部分(以及所需的脚本引用)。因为 JSF 使用的是组件,它需要在将组件添加到底层 Object-Model 时插入某个组件所需的 javascript。
因此JSF本身需要管理html
、head
和body
标签。
因此,不要将它们创建为 vanilla-html,而是使用适当的 <h:html>
、<h:body>
和 <h:head>
标记,这会将此任务移交给 JSF。这样,应该为您的 onclick 事件处理程序生成所需的 javascript 代码,并且复选框应该按预期工作。
问题是我没有正确设置 web.xml。
我遗漏了以下将请求路由到 richfaces 的内容:
<filter>
<display-name>RichFaces Filter</display-name>
<filter-name>richfaces</filter-name>
<filter-class>org.ajax4jsf.Filter</filter-class>
</filter>
<filter-mapping>
<filter-name>richfaces</filter-name>
<servlet-name>Faces Servlet</servlet-name>
<dispatcher>REQUEST</dispatcher>
<dispatcher>FORWARD</dispatcher>
<dispatcher>INCLUDE</dispatcher>
</filter-mapping>
虽然视图可以从 bean 中获取所有值,但当复选框 (h:selectBooleanCheckbox
) 被切换时,bean 不会更新。 Item
中的 setSelected()
方法从未从视图中调用。
我已经尝试将 bean 的范围更改为应用程序,使用映射而不是所选 属性 的值,并且愚蠢地尝试编写我自己的 ajax javascript 函数。
我正在使用的应用程序有点旧,所以我使用的是 Tomcat 6、JSF 1.2 和 Richfaces 3.3。3.Final。
看起来应该很简单,我想我遗漏了一些明显的东西,但是我已经在这两天了,无法弄清楚为什么没有更新 bean。
我的看法是:
<!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:ui="http://java.sun.com/jsf/facelets"
xmlns:h="http://java.sun.com/jsf/html"
xmlns:f="http://java.sun.com/jsf/core"
xmlns:c="http://java.sun.com/jstl/core"
xmlns:fn="http://java.sun.com/jsp/jstl/functions"
xmlns:a4j="http://richfaces.org/a4j"
xmlns:rich="http://richfaces.org/rich">
<head>
<title>JSF</title>
</head>
<body>
<h:form id="tableForm">
<rich:dataTable id="table" value="#{managedBean}" var="item" width="100%">
<rich:column label="Select" align="center" width="40px" >
<f:facet name="header">
<h:outputText value="Select" />
</f:facet>
<h:selectBooleanCheckbox value="#{item.selected}" >
<a4j:support execute="@this" event="onclick" ajaxSingle="true"/>
</h:selectBooleanCheckbox>
</rich:column>
<rich:column label="Name" align="center" width="40px">
<f:facet name="header">
<h:outputText value="Name" />
</f:facet>
<h:outputText value="#{item.name}" />
</rich:column>
</rich:dataTable>
</h:form>
</body>
</html>
我在会话范围内有一个托管 bean ItemBean:
import org.richfaces.model.ExtendedTableDataModel;
public class ItemBean extends ExtendedTableDataModel<Item>{
public ItemBean() {super(new ItemProvider());}
}
ItemProvider 是:
import org.richfaces.model.DataProvider;
public class ItemProvider implements DataProvider<Item>{
private List<Item> items = new ArrayList<Item>();
public ItemProvider(){
for(int i = 0; i < 10; i++){
items.add(new Item(i, "Item "+i));
}
}
public Item getItemByKey(Object key) {return items.get((Integer)key);}
public List<Item> getItemsByRange(int fromIndex, int toIndex) {
return new ArrayList<Item>(items.subList(fromIndex, toIndex));
}
public Object getKey(Item arg0) {return arg0.getId();}
public int getRowCount() {return items.size();}
}
项目是:
public class Item {
private final int id;
private final String name;
private boolean selected;
public Item(int id, String name) {
this.id = id;
this.name = name;
selected = false;
}
public int getId(){
return id;
}
public String getName(){
return name;
}
public boolean isSelected(){
return selected;
}
public void setSelected(boolean selected){
this.selected = selected;
}
}
我假设您的原版 html
、head
和 body
标签可能会导致此问题。
Ajax-stuff (javascript) 有时必须进入页面的 <head>
部分(以及所需的脚本引用)。因为 JSF 使用的是组件,它需要在将组件添加到底层 Object-Model 时插入某个组件所需的 javascript。
因此JSF本身需要管理html
、head
和body
标签。
因此,不要将它们创建为 vanilla-html,而是使用适当的 <h:html>
、<h:body>
和 <h:head>
标记,这会将此任务移交给 JSF。这样,应该为您的 onclick 事件处理程序生成所需的 javascript 代码,并且复选框应该按预期工作。
问题是我没有正确设置 web.xml。
我遗漏了以下将请求路由到 richfaces 的内容:
<filter>
<display-name>RichFaces Filter</display-name>
<filter-name>richfaces</filter-name>
<filter-class>org.ajax4jsf.Filter</filter-class>
</filter>
<filter-mapping>
<filter-name>richfaces</filter-name>
<servlet-name>Faces Servlet</servlet-name>
<dispatcher>REQUEST</dispatcher>
<dispatcher>FORWARD</dispatcher>
<dispatcher>INCLUDE</dispatcher>
</filter-mapping>