Не можете использовать EL 2.2 для передачи параметра элемента в бин, если список элементов меняется между обновлениями? - PullRequest
0 голосов
/ 02 ноября 2011

Я использую функциональность EL 2.2 (с Tomcat 7) для передачи параметров (в данном случае, целых элементов) со страницы JSF бэк-компоненту.Это оказывается очень удобным, но я сталкиваюсь с гигантской проблемой, когда список элементов изменяется другим пользователем между обновлениями страницы.Вот пример кода, который поможет вам понять, что я имею в виду:

JSF-страница:

<ui:repeat var="item" value="#{myBackingBean.listOfItems}">
    <h:panelGrid columns="3">
        <h:outputText value="#{item.name}" />
        <p:commandLink value="(Change name to foo)" action="#{myBackingBean.changeNameToFoo(item)}" />
        <p:commandLink value="(Delete this item)" action="#{myBackingBean.deleteThisItem(item)}" />
    </h:panelGrid>
</ui:repeat>

MyBackingBean.java:

public void changeNameToFoo(Item i) {
    i.setName("foo");
}

public void deleteThisItem(Item i) {
    i.remove();
}

Моя ситуация такова: Скажите listOfItemsвозвращает список из пяти Предметов с именами [1, 2, 3, 4, 5].Два разных пользователя загружают эту страницу одновременно.Пользователь А сразу удаляет пункт 2 и теперь видит [1, 3, 4, 5].Пользователь B, который все еще видит все пять элементов, затем пытается изменить имя элемента 3 на foo.Когда его страница обновляется, он теперь видит [1, 3, foo, 5].Поскольку пользователь, которого он даже не знал об удалении второго элемента в списке, был изменен совершенно другой элемент, чем тот, на который он нажал.

Я что-то упустил, или это действительно проблема с показом, когда несколькопользователи вводят картинку?

Спасибо!

1 Ответ

0 голосов
/ 02 ноября 2011

Если вы разрешаете нескольким пользователям совместно использовать некоторые ресурсы, вы должны убедиться, что вы справляетесь с ситуациями соответствующим образом. И это относится не только к JSF, но и к любым ситуациям, в которых могут возникнуть проблемы с многопоточностью. Я не знаю, насколько велико ваше приложение, но если оно достаточно маленькое, чтобы не создавать проблемы, я бы синхронизировал методы, которые устанавливают, и получал информацию из listOfItems.

Как я уже сказал, вы можете потерять производительность, и это зависит от того, хорошо ли вы с этим (и, конечно, от ваших пользователей)

...