У меня есть компонент раскряжевки, связанный со страницей, и я хочу изменить его значение в зависимости от того, завершилась ли проверка или завершилась успешно.

@ManagedBean(name = "testBean")
@ViewScoped()
public class TestBean implements Serializable {

String value="";
int number;

  /*getters-setters*/
}

Валидатор, который проверяет, является ли число положительным

@FacesValidator("Validator")
public class NumValidator implements Validator{



    @Override
    public void validate(FacesContext context, UIComponent component,
            Object value) throws ValidatorException {

        int num=(Integer)value;
        if(num<0){
            FacesMessage msg = 
                new FacesMessage(The number is negative");
            msg.setSeverity(FacesMessage.SEVERITY_ERROR);
            throw new ValidatorException(msg);
           }


    }
}

И страницу xhmtl:

<h:form>
<h:inputText id="number" value="#{testBean.number}" required="true"
                    requiredMessage="Is">
                    <f:validator validatorId="Validator" />
                    <f:ajax event="blur" render="msg" />
                </h:inputText>
                <h:message id="msg" for="number"/>
</h:form>

И я хочу, чтобы строка в bean-компоненте имела значение = "негативный" или значение = "положительный" независимо от случая. Как это может быть сделано?

0
JmRag 19 Авг 2014 в 16:33
Какова цель этого значения? Зачем вам когда-либо значение модели, которое никогда не попадает в метод действия? Разве это значение не принадлежит стороне просмотра? Кстати, вы также можете просто использовать встроенный валидатор JSF <f:validateLongRange>, если все, что вам нужно, это проверить, не является ли значение отрицательным.
 – 
BalusC
19 Авг 2014 в 16:49
Я хочу изменить css поля ввода независимо от того, правда это или нет. Итак, вот моя логика. CSS связан со строкой, которая читается из xhtml. Так что эту строку следует соответствующим образом изменить, если введенные данные действительны или недействительны. Моя логика верна или мне следует использовать javascript / jquery?
 – 
JmRag
19 Авг 2014 в 16:59
Итак, после фильтрации всего шума ваш конкретный вопрос сводится к следующему: «Как мне изменить класс стиля поля ввода в зависимости от того, есть ли в нем ошибка проверки?», Это правильно?
 – 
BalusC
19 Авг 2014 в 17:02
Да, но меня больше интересовало то, о чем я спрашивал, на случай, если мне это понадобится.
 – 
JmRag
19 Авг 2014 в 17:04
Вам не следует задавать проблемы XY. Решение проблемы Y не обязательно является правильным решением проблемы X. Вы должны спрашивать о конкретном функциональном требовании, а не о «возможном решении» конкретного функционального требования, которое, в конце концов, может быть неправильным решением.
 – 
BalusC
19 Авг 2014 в 17:04

1 ответ

Лучший ответ

Ваши конкретные функциональные требования, по-видимому, сводятся к:

Как изменить класс стиля <h:inputText> при ошибке проверки?

В этом случае просто проверьте UIInput#isValid() в EL. Текущий компонент пользовательского интерфейса доступен только для неявного объекта EL #{component}.

<h:inputText ... styleClass="#{component.valid ? 'positive' : 'negative'}">
    <f:ajax ... render="@this msg" />
</h:inputText>

Обратите внимание, что я добавил @this в render, иначе сам компонент не будет обновлен.

Вы не должны загрязнять модель специфичными для представления свойствами, такими как классы CSS. Вы должны стараться держать их в поле зрения как можно дольше. Это приведет к более «естественным» решениям.

1
BalusC 19 Авг 2014 в 17:24
Component.valid - это связанное слово или переменная из имени компонента? Также при начальной загрузке a для рендеринга ввода формы требуется
над полем ввода. Итак, как я могу изменить его css?
 – 
JmRag
19 Авг 2014 в 17:10
Что касается первой части, нажмите на ссылки (и прочтите книгу). Что касается второй части, на нее уже был дан ответ в вашем предыдущем вопросе.
 – 
BalusC
19 Авг 2014 в 17:13
В моей стране книги сложно найти, они слишком специализированные! Спасибо за ваше время и усилия!
 – 
JmRag
19 Авг 2014 в 17:34
Есть ли способ, чтобы изначально у меня был класс css, например. начать, а затем изменить на два других класса css (отрицательный, поиситивный) относительно действительности ввода?
 – 
JmRag
19 Авг 2014 в 18:36
Вы можете добавить чек на #{facesContext.postback}. Например. styleClass="#{facesContext.postback ? component.valid ? 'positive' : 'negative' : 'start'}".
 – 
BalusC
19 Авг 2014 в 18:40