Булевы переключатели JSF / JAVA (приватные для JSF, общедоступные статические для Beans) - PullRequest
0 голосов
/ 29 мая 2011

Я использую логические переключатели для разрешения выбранного поведения приложения, например, SAVEACCEPTED включает кнопку SAVE формы.

<h:commandButton action="#{bean.save}" disabled="#{!bean.saveaccepted}">

JSF требуется частное логическое значение и его методы получения и установки, но если я хочу разрешить некоторую внутреннюю логику на сервере приложений, она должна быть определена как статическая.Например,

IF (USERFOUND) SAVEACCEPTED = true;

Итак, я использую класс настроек , и определены общедоступные статические логические значения .И в бинах есть геттеры и сеттеры, указывающие на Settings.VARIABLE

Settings.java

public static boolean SAVEACCEPTED = false;

Bean.java

public static boolean isSaveAccepted() {
  return Settings.SAVEACCEPTED;
}

Проблема в том, чтоpublic boolean - только один, и, если приложение использует более одного пользователя, то при первом переключении переменной это влияет на форму второго пользователя.

Как я могу решить эту проблему, есть ли какое-то стандартное решение?

Ответы [ 2 ]

3 голосов
/ 29 мая 2011

Не используйте переменную static. Используйте бин @SessionScoped или @ViewScoped для сохранения настроек отдельно для каждого пользователя.

@Named
@SessionScoped
public class Settings
{
    private boolean saveAccepted = false;

    public boolean isSaveAccepted()
    {
        return saveAccepted;
    }

    public void setSaveAccepted(boolean saveAccepted)
    {
        this.saveAccepted = saveAccepted;
    }
}

и

<h:commandButton action="#{bean.save}" disabled="#{!settings.saveaccepted}">

Что если мне нужно установить saveAccepted = true в другом бине (не в JSF)? Это не работает, потому что в этом случае saveAccepted должен быть статическим.

Не не использовать статическую переменную.

Если вам нужно установить значение в другом бине, вы можете @Inject экземпляр:

@Named
@RequestScoped
public class SomeOtherBean
{
    @Inject
    private Settings settings;

    public boolean getSaveAccepted()
    {
        return settings.getSaveAccepted();
    }

    public void setSaveAccepted(boolean saveAccepted)
    {
        settings.setSaveAccepted(saveAccepted);
    }
}

и CDI даст вам правильный экземпляр Settings.


BalusC комментарии:

Основываясь на истории вопросов, OP использует Tomcat, который является простым сервлет-контейнером.

Поскольку похоже, что вы не используете полный контейнер Java EE 6, вы можете использовать @ManagedBean вместо @Named и @ManagedProperty вместо @Inject.

@ManagedBean
@RequestScoped
public class SomeOtherBean
{
    @ManagedProperty
    private Settings settings;

    public boolean getSaveAccepted()
    {
        return settings.getSaveAccepted();
    }

    public void setSaveAccepted(boolean saveAccepted)
    {
        settings.setSaveAccepted(saveAccepted);
    }
}

Приношу свои извинения за то, что отправил вас по более сложному пути!

2 голосов
/ 29 мая 2011

Использование статической переменной в этом сценарии не идеально. Статические поля по определению являются общими для всех экземпляров класса. Таким образом, происходит то, что сохраняемое вами значение становится общим для всех экземпляров вашего управляемого компонента.

Рекомендую сохранить его в области запроса с помощью @ViewScoped или определить его в face-config.xml с помощью <managed-bean-scope>.

...