Я создал виджет со следующим серверным API:
private Map<String,Object> attributes = new HashMap<String,Object>();
@Override
public void paintContent(PaintTarget target) throws PaintException {
super.paintContent(target);
for (String key : attributes.keySet()) {
Object value = attributes.get(key);
if (value instanceof Boolean)
target.addAttribute(key, ((Boolean) value).booleanValue());
else if (value instanceof Float)
target.addAttribute(key, ((Float) value).floatValue());
else if (value instanceof Double)
target.addAttribute(key, ((Double) value).doubleValue());
else if (value instanceof Integer)
target.addAttribute(key, ((Integer) value).intValue());
else if (value instanceof Long)
target.addAttribute(key, ((Long) value).longValue());
else if (value instanceof String)
target.addAttribute(key, (String) value);
else if (value instanceof Map<?,?>)
target.addAttribute(key, (Map<?,?>) value);
else if (value instanceof Object[])
target.addAttribute(key, (Object[]) value);
}
// We could also set variables in which values can be returned
// but declaring variables here is not required
}
public void resetAttributes() {
attributes.clear();
}
public void setAttribute(String key, Object value) {
attributes.put(key, value);
}
На стороне клиента я просто присоединяю полученный UIDL к документу.
public void updateFromUIDL(UIDL uidl, ApplicationConnection client) {
this.client = client;
paintableId = uidl.getId();
shareVars(uidl, getElement());
}
public native void shareVars(UIDL uidl, Element element) /*-{
var el = element;
var ownDoc = element.ownerDocument;
ownDoc.uidl = uidl;
ownDoc.doGraphics();
}-*/;
Сейчасв doGraphics () я могу получить доступ к данным uidl с помощью uidl [1] ["attname"]
Комбинируя его с виджетом IcePush, я получаю все необходимое поведение, и все прекрасно работает.
Мне любопытно, почему это решение не появилось раньше, поскольку оно выглядит вполне естественным для меня, и я был бы признателен, если бы вы могли сравнить эту технику с теми, о которых вы упомянули.