当前位置: 首页 > 知识库问答 >
问题:

Wicket-会话间通信或手动创建新请求(周期)

吴和硕
2023-03-14

我有一些wicket面板存储在不同会话的静态Hashmap中,我想做一些,比如如果某个面板通知地图,那么地图通知所有其他面板。例如:

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(String notification)我想向服务器发送请求,并在浏览器中刷新我的面板。

public void String newNotification(String notification){
   // do some business logic depends on notification
   onMyRequest();
}

我在wicket行为源文件中进行了一些搜索,在AbstractDefaultaJaxBehavior中发现,我试图在wicket面板中创建自己的onRequest方法,如下所示

private void onMyRequest(){
    AjaxRequestTarget target = ((WebApplication)getApplication()).newAjaxRequestTarget(getPage());
        target.add( _some_wicket_components_ );

        RequestCycle.get().scheduleRequestHandlerAfterCurrent(target);
    }
 Wicket.Ajax.Call.processComponent: Component with id _containerdiv_ was not found while trying to perform markup update.
ERROR: Cannot find element with id: _someComponentIdOnPanel_

更新:我需要会间交流。

共有1个答案

芮叶秋
2023-03-14

要更新不同用户会话上的面板,显然不能使用当前的AjaxRequestTarget,因为这在某种程度上代表了服务器和请求用户之间的单个通信,而另一个用户的浏览器无法知道该通信。(非常非常基本的口语)

您可以使用AjaxSelfUpdatingTimerBehavior轮询更新。这将以固定的时间间隔为每个用户生成新的AjaxRequestTarget,您可以使用它来附加更改的面板。这是一个非常基本和简单的实现,很可能会影响您的系统性能,并产生相当多的通信量。

另一种方法是使用类似Atmosphere的东西,它由Wicket-Atmosphere支持(可以在这里找到quickstart),在wicket-library.com有一些示例,但我只知道这些。

 类似资料:
  • 我有一个遗留的Java1.6运行localhostTomcat 7应用程序使用JSP页面,一个带有框架的框架集,javascript,但没有像Struts这样的框架。我使用请求或会话从servlet传递一个对象以在页面中显示,这很好。 然而,我最近做了一些更改,现在我无法从会话或请求中检索到相同的对象。它以前工作得很好,所以我不确定是什么坏了,但我甚至无法将字符串值从JSP返回到servlet。

  • 我有一个问题,过去几天我一直在网上搜索。我发现有类似问题的人,但世卫组织的解决方案并没有改善我的状况。 最令人恼火的是,我以前一直在使用它,没有任何问题或障碍。 问题是,我在java web应用程序上的会话要么在请求之间被删除,要么一开始就无法正确创建。 一些简单的故障排除: 我可以很好地创建和使用cookie。 每次我刷新或跟踪指向servlet或jsp的链接时,jsesionid都会得到一个新

  • 问题内容: 我刚刚启动了一个简单的Java测试项目,该项目使用Hibernate管理某些实体,并提供REST接口来操纵这些对象并提供一些其他业务逻辑。REST接口是使用RESTEasy和Jetty创建的。 到目前为止,一切工作正常,但是我感觉我实际上写了太多样板代码。由于我在这些Java框架中没有太多经验,所以我只是想知道是否有人可以给我提示如何改善这种情况。 每个请求创建hibernate会话

  • org.openqa.selenium.SessionNotCreatedException:无法创建新会话。(原始错误:命令失败:C:\Windows\system32\cmd.exe/s/C“C:\Program Files(x86)\Android\Android sdk\platform tools\adb.exe”-s 69c7aa170104安装“C:\Program Files(x8

  • 问题内容: 我正在维护Java Web应用程序。 通过登录代码,它可以通过HttpServletRequest的getSession()方法从HttpServletRequest中获取一个HttpSession。(它在会话中使用一些值进行认证) 但是,我担心会话固定攻击,因此在使用初始会话后,我想开始一个新会话或更改会话ID。这可能吗? 问题答案: Servlet 3.0 API不允许您更改现有会

  • 我一直有一个问题,当请求来自域名而不是localhost时,会话变量不可用。例如,如果我设置一个用户变量: 当客户端发出另一个请求并且我尝试访问用户会话变量时,它返回null。 我注意到,在每个请求中,都会设置一个新的JSESSIONID cookie,并且ID值会更改。这是否意味着每次客户端访问服务器时都会创建一个新会话?如何在客户端之间保持相同的会话,以便我可以在Http会话中存储对象并访问它