在单个项目中 ZK 多个 Web 应用程序

ZK multiple webapps in a single project

背景:

我用 netbeans 8.1 编写了 2 个 ZK web 应用程序 (ZK653CE),它们都是用于单个任务的模块。 现在我想从应用程序 A 中访问应用程序 B,这两个项目都在同一个 Tomcat 8 网络服务器上。

我为什么要这样做:

应用程序 A 具有用户登录名并向用户提供数据。应用程序 B 允许任何人创建显示数据的模式。我希望用户启动应用程序 B 并创建一个模式(按保存关闭应用程序)。该模式应发送回应用程序 A,然后应用程序 A 将数据的显示行为更改为新模式。我不想将这两个应用程序混合在一起,因为我希望它们保持独立。

我在搜索这个主题时已经想通了:

真题:

有没有办法让两个应用程序独立(如果是,请解释或举个例子)或者我必须合并它们?

我有很多时间尝试不同的东西我会展示我遇到的 2 个最佳解决方案:

  1. 使用 Cookies

可以使用Cookies在客户端存储数据,并使用服务器访问它。它通常用于会话管理或其他控制当前用户内容的部分。

要访问 Cookie,可以在 ZK Class(控制器或视图模型)中使用此代码:

 HttpServletRequest req = (HttpServletRequest) Executions.getCurrent().getNativeRequest();
 Cookie[] cookies = req.getCookies();

这将加载当前会话的所有 cookie。 HttpServletRequest class 可以在 java 文档中找到更多信息(它表示原始客户端 http 请求)。然后可以遍历数组并查找 Cookie

HttpServletResponse resp = (HttpServletResponse) Executions.getCurrent().getNativeResponse();
for(Cookie c : cookies) {
        if(c.getName().equals(COOKIE_MODE)) {
            externalAccess = Boolean.parseBoolean(c.getValue());             
            c.setMaxAge(0);
            c.setValue(null);
            c.setPath(NAMESPACE);
            resp.addCookie(c);
        } 
}

externalAccess 存储模块是否从外部模块加载。当然,这个外部模块必须首先创建那个 Cookie。 set 参数用于删除 Cookie,将 age 设置为 0 意味着其过期的也设置值,如果使用路径创建它,则还必须设置路径,因为它必须知道旧 Cookie 的放置位置。必须将 cookie 添加到客户端(来自服务器)的 HTTP 响应中,以便客户端替换其旧的 Cookie。

要创建一个 cookie,可以使用这个:

Cookie cookie = new Cookie(COOKIE_NAME, COOKIE_VALUE);
                cookie.setPath(NAMESPACE);
                HttpServletResponse resp = (HttpServletResponse) Executions.getCurrent().getNativeResponse();
                resp.addCookie(cookie);

这和之前的for循环非常相似

  1. 方法 只需在URL中添加一个参数(常用来提供参数):

如果一个人在本地主机上有一个网络服务器,它的地址可能是这样的: http://localhost:8080/ 模块加载到 / 或者如果指定了子文件夹 /modul

如果在 /modul 中有一个名为 index.zul

的 .zul

可以使用 http://localhost:8080/modul/index.zul

访问它

如果要添加一个参数,可以这样做: http://localhost:8080/modul/index.zul?externalAccess=1

然后可以使用以下代码在 index.zul(我使用 MVVM)的视图模型或控制器中访问它:

String external = Executions.getCurrent().getParameter("externalAccess");

然后可以将参数转换为喜欢的参数。

要创建一个使用上面 URL 的重定向,可以使用这个:

Executions.sendRedirect("http://localhost:8080/modul/index.zul?externalAccess=1");

一个人可以像这样获取 URL 到服务器和当前应用程序: 服务器:

String server = Executions.getCurrent().getScheme() + "://" + Executions.getCurrent().getServerName() + ":" + Executions.getCurrent().getServerPort();

对于以“/”开头的应用程序的路径:

Executions.getCurrent().getContextPath() +  Executions.getCurrent().getDesktop().getRequestPath();

也可以使用存储了 URL 的配置文件(在网络服务器上),但我不会在这里介绍