JSF: способен выполнять массовое обновление, но не может обновить одну строку в таблице данных - PullRequest
2 голосов
/ 29 апреля 2010

У меня есть простой объект данных: Car. Я показываю свойства объектов Car в формате данных JSF. Если я отображаю свойства с помощью тегов inputText, я могу получить измененные значения в управляемом компоненте. Однако я просто хочу редактировать одну строку. Поэтому поместили кнопку редактирования в отдельный столбец и inputText и outputText для каждого свойства Car. кнопка редактирования просто переключает рендеринг inputText и outputText. Плюс я поместил кнопку обновления в отдельный столбец, который используется для сохранения обновленных значений. Однако, нажав кнопку обновления, я все равно получаю старые значения вместо измененных значений. Вот полный код:

public class Car {

    int id;
    String brand;
    String color;

    public Car(int id, String brand, String color) {
        this.id = id;
        this.brand = brand;
        this.color = color;
    }

    //getters and setters of id, brand, color
}

Вот управляемый компонент:

import java.util.ArrayList;
import java.util.List;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.RequestScoped;
import javax.faces.component.UIData;

@ManagedBean(name = "CarTree")
@RequestScoped
public class CarTree {

    int editableRowId;
    List<Car> carList;
    private UIData myTable;

    public CarTree() {

        carList = new ArrayList<Car>();
        carList.add(new Car(1, "jaguar", "grey"));
        carList.add(new Car(2, "ferari", "red"));
        carList.add(new Car(3, "camri", "steel"));
    }

    public String update() {

        System.out.println("updating...");
        //below statments print old values, was expecting modified values
        System.out.println("new car brand is:" + ((Car) myTable.getRowData()).brand);
        System.out.println("new car color is:" + ((Car) myTable.getRowData()).color);


        //how to get modified row values in this method??

        return null;
    }

    public int getEditableRowId() {
        return editableRowId;
    }

    public void setEditableRowId(int editableRowId) {
        this.editableRowId = editableRowId;
    }

    public UIData getMyTable() {
        return myTable;

    }

    public void setMyTable(UIData myTable) {
        this.myTable = myTable;
    }

    public List<Car> getCars() {
        return carList;
    }

    public void setCars(List<Car> carList) {
        this.carList = carList;
    }
}

вот страница JSF 2:

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

        <h:form id="carForm" prependId="false">
            <h:dataTable id="dt" binding="#{CarTree.myTable}" value="#{CarTree.cars}" var="car" >
                <h:column>
                    <h:outputText value="#{car.id}" />
                </h:column>

                <h:column>
                    <h:outputText value="#{car.brand}" rendered="#{CarTree.editableRowId != car.id}"/>
                    <h:inputText value="#{car.brand}" rendered="#{CarTree.editableRowId == car.id}"/>
                </h:column>

                <h:column>
                    <h:outputText value="#{car.color}" rendered="#{CarTree.editableRowId != car.id}"/>
                    <h:inputText value="#{car.color}" rendered="#{CarTree.editableRowId == car.id}"/>
                </h:column>

                <h:column>
                    <h:commandButton value="edit">
                        <f:setPropertyActionListener target="#{CarTree.editableRowId}" value="#{car.id}" />
                    </h:commandButton>
                </h:column>

                <h:column>
                    <h:commandButton value="update" action="#{CarTree.update}"/>
                </h:column>

            </h:dataTable>
        </h:form>
    </h:body>
</html>

Однако, если я просто сохраню теги inputText и удаляю визуализированные атрибуты, я получу измененные значения в методе обновления. Как я могу получить измененные значения для редактирования одной строки?

Ответы [ 2 ]

1 голос
/ 02 мая 2010

JSF уже обновил значения модели для вас. Просто получите к нему доступ обычным способом.

public String update() {
    for (Car car : carList) {
        if (/* this item was set to editmode */) {
            System.out.println("new car brand is:" + car.brand);
            System.out.println("new car color is:" + car.color);
        }
    }

    return null;
}

Кстати, делать свойства модели не private - плохая идея. Вы должны сделать их private и получить к ним доступ через геттеры / сеттеры. То есть car.getBrand(), car.getColor() и т. Д.

1 голос
/ 29 апреля 2010

Я получаю измененные значения в методе обновления при изменении области действия от запроса к сеансу. Есть ли лучший подход вместо использования SessionScoped? SessionScoped == Память сервера, поэтому я хочу избежать этого.

Rant (или разочарование?): Действительно, если бы было что-то похожее на ObjectDataSource asp.net, это было бы намного проще. Даже для умеренной работы с данными мы должны искать проблемы жизненного цикла. В то время как в asp.net ObjectDataSource + ListView достаточно для большинства вопросов, связанных с данными + пользовательским интерфейсом, и вряд ли нам придется искать жизненный цикл элемента управления (Infact, ребята из asp.net почти никогда не ищут документы). Почему базовая спецификация JSF не может обеспечить элемент управления, способный выполнять операции CRUD из коробки, возможно с возможностью отложенной загрузки. Разве это не требуется для каждого приложения?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...