Проверка JSF в фазе действия
У нас есть веб-приложение на основе JSF, которое передает данные входной формы в веб-службу, а затем отображает ответ, предоставленный веб-службой.
Это веб-служба, которая проверяет входные данные, введенные пользователем. Я не уверен, как мы можем использовать JSF validation
здесь. По моему пониманию JSF проверяет отдельные компоненты в представлении. Но это будет очень дорогостоящая операция, чтобы каждый раз обращаться к веб-сервису.
Вместо этого, когда пользователь отправляет форму, мы пропускаем все проверки, делаем запрос веб-службы в методе действий. На основе ответа веб-службы мы можем программным образом сказать, что конкретный компонент пользовательского интерфейса недействителен?
Не могли бы вы предложить свое предложение по этому поводу?
Окружающая среда: -
JSF 2.0
WebSphere Application Server 8.5
Ответы
Ответ 1
На основе ответа веб-службы мы можем программным образом сказать, что конкретный компонент пользовательского интерфейса недействителен?
Да, вы можете сделать это, вызвав UIInput#setValid()
, передав false
. Здесь полный фрагмент:
FacesContext context = FacesContext.getCurrentInstance();
UIInput input = (UIInput) context.getViewRoot().findComponent("form:input");
input.setValid(false);
context.addMessage(input.getClientId(context), message);
context.validationFailed();
FacesContext#validationFailed()
не нужно вызывать на основе ввода. Кстати,
Ответ 2
Посмотрите этот учебник - раздел "Проверка вручную".
Вероятно, это то, что вы пытаетесь выполнить.
Ручная проверка
- Используйте строковые свойства для bean (используйте блоки try/catch для обработки незаконных данных)
- Сделайте проверку в методах setter и/или контроллере действий
- Возвращает null для отображения формы.
- Создание пользовательских сообщений об ошибках и сохранение в FacesMessage
- Используйте h: сообщения для отображения списка сообщений об ошибках (если сообщений нет, это ничего не выводит)
Например, в bean:
public void setBidAmount(String bidAmount) {
this.bidAmount = bidAmount;
try {
numericBidAmount = Double.parseDouble(bidAmount);
} catch(NumberFormatException nfe) {}
}
И в методе действий:
public String doBid() {
FacesContext context = FacesContext.getCurrentInstance();
if (getNumericBidAmount() <= 0.10) {
context.addMessage(null,
new FacesMessage("Bid amount must be at least $0.10."));
}
...
if (context.getMessageList().size() > 0) {
return(null);
} else {
doBusinessLogicForValidData();
return("show-bid1");
}
}