public class MyClass{
private String shared;
public String mySharedFun() {
`Session session = Sessions.getCurrent();`
}
在上述情况下,我得到 Http "session" null,我是否需要实现任何接口。
我想 Session 类取自 ZK。如何获得会话的正确方法是
Executions.getCurrent().getSession();
将请求传递给您的方法。然后 HttpSession session = (HttpSession)request.getSession(); 会给你会议。如果没有会话,那么它将为您创建一个会话。如果不需要创建新会话,则 if(session.isNew()) 将让您知道是否存在当前会话。
如果它在 ZK 事件处理程序中运行,则此方法有效:
SimpleSession s = (SimpleSession) Executions.getCurrent().getDesktop().getSession();
HttpSession session = (HttpSession) s.getNativeSession();
似乎很难进入实际的 http 会话,但当您有使用 ZK 的经验时,这不是您通常会做的事情。更自然的放置数据的位置是 ZK 隐式范围对象,例如 desktopScope 或 sessionScope,它们只是 java.util.Map。
原因如下:用户可能会在两个浏览器选项卡中打开指向您网站的两个 URL,以便能够同时处理两个订单。每个打开的 url 都会创建一个 zk 桌面。在用户单击的每个选项卡中,事件处理程序(用户鼠标单击)应该与运行事件处理程序的桌面中的业务数据一起工作。如果您将业务数据放在 http 会话中,那么它对该用户来说是全局的;任何同时打开两个浏览器选项卡的用户尝试同时执行两项工作都会有一个浏览器选项卡破坏他们在另一个浏览器选项卡中所做的工作。如果你真的想让某些东西对用户来说是全局的,就把它放在 sessionScope 中。事物实际上保存在 http 会话中的地图中。
文档的基本概念页面在http://books.zkoss.org/wiki/ZK%20Developer%27s%20Guide/Fundamental%20ZK/Basic%20Concepts/Page%20and%20Desktop中介绍了这些想法,其中包含指向其他隐式对象,例如 requestScope、componentScope、pageScope、spaceScope(“ID 空间”)。
你通常不会使用诸如 requestScope 之类的作用域,因为 ZK 事件处理将你从 ajax 请求中抽象出来;让事件操纵桌面范围。当您来自 Http 请求/会话世界时,这似乎非常不自然,但是 ZK 是关于使用在桌面中的组件上触发的事件进行事件驱动的编程;所以我坚持使用在使用 ZK 时“自然”的 componentScope、desktopScope 和 sessionScope。