Java Primefaces数据表选择行和范围

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 =

我使用PrimeFaces 3.1,必须在数据表中选择一行。 我在Primefaces showcase中使用了这个示例,但它只在我的支持bean处于作用域会话中时才起作用,而不在视图中,这意味着当用户返回此页面时,我必须做一些额外的工作来删除它,我的代码中出了什么问题? 请求范围中的我的控制器:

@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>