В настоящее время я работаю над некоторым сложным веб-интерфейсом и реализую его, используя:
- JSF 1.2
- Facelets 1.1.15
- RichFaces 3.3.3.Final
Я создал пользовательский компонент JSF, который позволяет проверять поля inputText с использованием чистого JavaScript.Этот компонент имеет только один атрибут: тип.Этот атрибут отвечает за алгоритм проверки, который будет применяться в тот момент, когда пользователь нажимает клавишу клавиатуры.
На этапе restoreView
, когда создается начальный вид, этот атрибут устанавливается JSF (фактически Facelets).Это означает, что у меня есть класс компонента с сеттером и геттером для атрибута «тип».И установщик типа, вызываемый со значением, указанным в документе xhtml.
Компонентный объект воссоздается каждый раз на этапе restoreView, если я указываю их в атрибуте reRender.Но когда он воссоздается, мой требуемый тип атрибута не устанавливается.Это просто создает новые компоненты компонентов ... и это все.Может быть, я чего-то не понимаю, и это нормальное поведение, но как получить значения атрибутов в этом случае?
Код:
Простая тестовая страница:
<?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:u="http://java.sun.com/jsf/facelets"
xmlns:f="http://java.sun.com/jsf/core"
xmlns:h="http://java.sun.com/jsf/html"
xmlns:a="http://richfaces.org/a4j"
xmlns:r="http://richfaces.org/rich"
xmlns:v="http://nobodyhere.ru/jsf/validation">
<head>
<title>Test Page</title>
</head>
<body>
<h:form id="testForm">
<h:inputText id="textInput" value="test">
<v:keyValidator type="time"/>
</h:inputText>
<a:commandButton value="Make AJAX request" reRender="testForm"/>
</h:form>
</body>
</html>
Класс компонента:
public class KeyValidator extends UIComponentBase
{
public KeyValidator()
{
System.out.println("new KeyValidator");
}
public KeyValidatorType getValidatorType()
{
return type;
}
public String getType()
{
return getValidatorType().toString();
}
public void setType(String type)
{
this.type = KeyValidatorType.valueOf(type.toUpperCase());
}
@Override
public String getFamily()
{
return KeyValidator.class.getName();
}
private KeyValidatorType type;
}
Когда я нажимаю кнопку «Сделать запрос AJAX», мой компонент воссоздается.Но атрибут 'type' не установлен в компоненте.
Основная проблема начинается с фазы renderView
в компонентном рендерере, когда вызывается encodeBegin
, он пытается получить этот атрибут и, конечно, получает null
вместо правильного значения.
ТакВозможно, более точный вопрос:
Как получить значения атрибутов компонента по запросу AJAX на renderView
фазе?
Любая помощь будет принята с благодарностью.