рекомендуется использовать viewScope
. избегайте использования атрибутов корня представления (компонента в целом) по двум причинам:
теоретически существует вероятность того, что вы перезапишете атрибут корневого компонента представления. на практике это невозможно, поскольку ключи атрибутов реализуются с помощью enum
(по крайней мере, в мохарре)
UIComponentBase.getAttributes
возвращает конкретную реализацию Map
: AttributesMap
. эта реализация сначала проверяет, существует ли в компоненте метод с тем же именем, что и ключ карты. а если нет, то проверяет внутреннюю карту. если снова не найдено, проверяет карту компонента ValueExpression
. так что это вообще неэффективно и, в особом случае, может привести к бесконечной рекурсии.
взгляните на AttributesMap.get
, например:
public Object get(Object keyObj) {
String key = (String) keyObj;
Object result = null;
if (key == null) {
throw new NullPointerException();
}
if (ATTRIBUTES_THAT_ARE_SET_KEY.equals(key)) {
result = component.getStateHelper().get(UIComponent.PropertyKeysPrivate.attributesThatAreSet);
}
Map<String,Object> attributes = (Map<String,Object>)
component.getStateHelper().get(PropertyKeys.attributes);
if (null == result) {
PropertyDescriptor pd =
getPropertyDescriptor(key);
if (pd != null) {
try {
Method readMethod = pd.getReadMethod();
if (readMethod != null) {
result = (readMethod.invoke(component,
EMPTY_OBJECT_ARRAY));
} else {
throw new IllegalArgumentException(key);
}
} catch (IllegalAccessException e) {
throw new FacesException(e);
} catch (InvocationTargetException e) {
throw new FacesException(e.getTargetException());
}
} else if (attributes != null) {
if (attributes.containsKey(key)) {
result = attributes.get(key);
}
}
}
if (null == result) {
ValueExpression ve = component.getValueExpression(key);
if (ve != null) {
try {
result = ve.getValue(component.getFacesContext().getELContext());
} catch (ELException e) {
throw new FacesException(e);
}
}
}
return result;
}
Думая о своем реквизите, это не имеет большого смысла, по крайней мере, с точки зрения веб-приложения. Состояние просмотра запоминает состояния компонентов: значения модели компонентов, которые изменены по сравнению с начальным состоянием и должны быть обработаны далее. если эти значения не нужно обрабатывать, то и запоминать долго не надо. мы можем думать о них как о «временных». и наоборот, если их нужно обрабатывать и запоминать в течение длительного времени, настойчивость — это путь. действительно, я не могу придумать ни одного случая, чтобы такого рода данные сохранялись дольше, чем сеанс, и короче, чем навсегда (постоянство).
Можете ли вы привести пример из реальной жизни?
лучший пример, который приходит мне на ум, — запомнить активный индекс для tabView или аккордеона, но это значение можно (и нужно) сохранять, если оно важно.
однако у каждой проблемы есть решение, первое, что я могу подумать, это то, что вы можете реализовать пользовательскую область, которая хранит эти значения в области приложения, используя определенное значение файла cookie (клиента) в качестве ключа.
person
Michele Mariotti
schedule
30.03.2014