【发布时间】:2013-06-29 12:02:40
【问题描述】:
我有一些检票口面板存储在来自不同会话的静态哈希图中,我想做一些事情,比如如果某个面板通知地图,然后地图通知所有其他面板。 例如:
public class PanelMap{
private static Map<Long, List<MyPanel>> map = new HashMap<Long, List<MyPanel>>();
public static void subscribe(Long id, MyPanel panel){
if (!map.containsKey(id)){
map.put(id, new ArrayList<MyPanel>());
}
map.get(id).add(panel);
}
}
public static void notify(Long id, String notification){
if (map.containsKey(id)){
List<MyPanel> panels = map.get(id);
for(MyPanel panel : panels){
panel.newNotification(notification);
}
}
}
}
在面板中,newNotification(字符串通知)我想向服务器发送请求并在浏览器中刷新我的面板。
public void String newNotification(String notification){
// do some business logic depends on notification
onMyRequest();
}
我在检票口行为源文件中进行了一些搜索,并在AbstractDefaultAjaxBehavior 中找到了关于我尝试在检票口面板中创建自己的 onRequest 方法,如下所示
private void onMyRequest(){
AjaxRequestTarget target = ((WebApplication)getApplication()).newAjaxRequestTarget(getPage());
target.add( _some_wicket_components_ );
RequestCycle.get().scheduleRequestHandlerAfterCurrent(target);
}
但我所做的只是 Wicket Ajax Debug 中的一些 Ajax 错误
Wicket.Ajax.Call.processComponent: Component with id _containerdiv_ was not found while trying to perform markup update.
ERROR: Cannot find element with id: _someComponentIdOnPanel_
(那些组件是存在的)
如何向服务器发送我自己的请求(或者如何获得有效的 AjaxRequestTarget 来更新我的组件?)
更新:我需要会话间通信。
【问题讨论】:
-
in html 页面中是否存在
_some_wicket_components_? -
是的,确实如此,它基本上是一个 WebMarkupContainer,内容容器 ()
-
您是否有理由不使用检票口事件总线?
-
唯一的原因是我不知道它是什么:) 它是干什么用的?一些主要,指南或链接?请
-
您能否详细说明“会话间通信”的含义?我的会话影响了另一个用户的会话,或者我的会话影响了我的另一个会话(我如何以及为什么会获得多个会话?)?显然,您不能将其他用户面板添加到我的 AjaxRequestTarget。为此,您需要某种推送技术,例如 Atmosphere,或者您必须等到其他用户创建自己的 AjaxRequestTarget(可能使用 TimedUpdatingBehaviour。