Java Primefaces数据表选择行和范围
我使用PrimeFaces 3.1,必须在数据表中选择一行。 我在Primefaces showcase中使用了这个示例,但它只在我的支持bean处于作用域会话中时才起作用,而不在视图中,这意味着当用户返回此页面时,我必须做一些额外的工作来删除它,我的代码中出了什么问题? 请求范围中的我的控制器:Java Primefaces数据表选择行和范围,java,jsf,primefaces,datatable,Java,Jsf,Primefaces,Datatable,我使用PrimeFaces 3.1,必须在数据表中选择一行。 我在Primefaces showcase中使用了这个示例,但它只在我的支持bean处于作用域会话中时才起作用,而不在视图中,这意味着当用户返回此页面时,我必须做一些额外的工作来删除它,我的代码中出了什么问题? 请求范围中的我的控制器: @ManagedBean @RequestScoped public class Ctrlr implements Serializable{ @ManagedProperty(value =
@ManagedBean
@RequestScoped
public class Ctrlr implements Serializable{
@ManagedProperty(value = "#{myDataModel}")
private MyDataModel dataModel;
...
public void onSelectRow() {
//do something
}
}
backingBean必须使用会话作用域才能正确工作:
@ManagedBean
@ViewScoped
public class MyDataModel extends ListDataModel<Bean> implements SelectableDataModel<Bean>, Serializable {
...
}
和我的xhtml页面:
<p:dataTable var="bean"
id="tableResults"
selectionMode="single"
selection="#{ctrlr.selectedBean}"
value="#{myDataModel}"
rowKey="#{bean.id}">
<p:ajax event="rowSelect"
listener="#{ctrlr.onSelectRow()}"
update=":searchForm:details:detail"/>
...
我签入了debug,似乎每次在每个请求中重建控制器时,注入的属性都是一个新属性,而不是从viewScope重新注入该属性
如果有人能帮我避免使用会话范围?我认为您可能对教程的了解太多了 下面是一个简单的工作示例: 汽车等级 后视图范围 Viewmain.xhtml 输出
如果您需要整个项目作为WAR/Zip文件,请告诉我knw。它不需要是scopeview。发布完整代码,因为我们看不出有什么问题。我尝试只放置代码的相关部分,但如果您认为缺少某些内容,请告诉我,我将添加它。您想对所选行做什么?我有一个带有搜索表单的屏幕,此搜索的结果显示在搜索表单下,然后用户可以选择一行并查看所选行的详细信息。但根据viewScope,只要您在浏览器窗口/选项卡中与相同的JSF视图交互,@PostContract只会被调用一次。它是根据HTTP请求创建的,一旦你回发到另一个视图,它就会被销毁。为什么我必须把所有东西都放在构造函数中?因为相同的代码工作正常,只需将支持bean放在会话中而不是视图范围中。好的,如果您希望将其作为会话视图,那么就可以了。我使用会话是因为它在视图中不工作。但我想知道为什么?因为会话和视图作用域只是存储某些信息的一种方式,但是会话更像是跨不同页面的永久存储,而不是视图,而且我只想在用户在页面上时存储数据。我在多重选择方面也有类似的问题。有人能帮忙吗?
package test_war.test_war;
public class Car {
private String name;
private Double price;
private int year;
public String getName() {
return name;
}
public Car(String name, Double price, int year) {
super();
this.name = name;
this.price = price;
this.year = year;
}
public void setName(String name) {
this.name = name;
}
public Double getPrice() {
return price;
}
public void setPrice(Double price) {
this.price = price;
}
public int getYear() {
return year;
}
public void setYear(int year) {
this.year = year;
}
}
package test_war.test_war;
import java.io.Serializable;
import java.util.ArrayList;
import java.util.List;
import javax.annotation.PostConstruct;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.ViewScoped;
@ManagedBean(name = "testBean")
@ViewScoped
public class TestBean implements Serializable {
private static final long serialVersionUID = 1L;
private List<Car> cars;
private Car selectedCar;
public Car getSelectedCar() {
return selectedCar;
}
public void setSelectedCar(Car selectedCar) {
this.selectedCar = selectedCar;
}
@PostConstruct
public void init() {
cars = new ArrayList<Car>();
cars.add(new Car("test1", 111.11, 2011));
cars.add(new Car("test2", 711.11, 2012));
cars.add(new Car("test3", 511.11, 2001));
cars.add(new Car("test4", 411.11, 2000));
}
public List<Car> getCars() {
return cars;
}
public void setCars(List<Car> cars) {
this.cars = cars;
}
}
<!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"
xmlns:p="http://primefaces.org/ui">
<h:head>
<title>A Simple JavaServer Faces 2.0 View</title>
</h:head>
<h:body>
<h:form id="form">
<p:dataTable id="cars" var="car" value="#{testBean.cars}"
rowKey="#{car.name}" selection="#{testBean.selectedCar}"
selectionMode="single">
<f:facet name="header">
Click "View" button after selecting a row to see details
</f:facet>
<p:column headerText="Name">
#{car.name}
</p:column>
<p:column headerText="Year">
#{car.year}
</p:column>
<p:column headerText="Price">
#{car.price}
</p:column>
<f:facet name="footer">
<p:commandButton id="viewButton" value="View" icon="ui-icon-search"
update=":form:display" oncomplete="carDialog.show()" />
</f:facet>
</p:dataTable>
<p:dialog id="dialog" header="Car Detail" widgetVar="carDialog"
resizable="false" width="200" showEffect="clip" hideEffect="fold">
<h:panelGrid id="display" columns="2" cellpadding="4">
<h:outputText value="Name:" />
<h:outputText value="#{testBean.selectedCar.name}" />
<h:outputText value="Year:" />
<h:outputText value="#{testBean.selectedCar.year}" />
<h:outputText value="Price:" />
<h:outputText value="#{testBean.selectedCar.price}" />
</h:panelGrid>
</p:dialog>
</h:form>
</h:body>
</html>