在单个项目中 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 将数据的显示行为更改为新模式。我不想将这两个应用程序混合在一起,因为我希望它们保持独立。
我在搜索这个主题时已经想通了:
- 无法从 zk 项目中直接访问外部 webapp
- 可以使用 tomcat 中的共享资源概念(但我不想那样,因为我希望它 运行 在不同的网络服务器上,如 glasfish 和其他)
真题:
有没有办法让两个应用程序独立(如果是,请解释或举个例子)或者我必须合并它们?
我有很多时间尝试不同的东西我会展示我遇到的 2 个最佳解决方案:
- 使用 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循环非常相似
- 方法
只需在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 的配置文件(在网络服务器上),但我不会在这里介绍
背景:
我用 netbeans 8.1 编写了 2 个 ZK web 应用程序 (ZK653CE),它们都是用于单个任务的模块。 现在我想从应用程序 A 中访问应用程序 B,这两个项目都在同一个 Tomcat 8 网络服务器上。
我为什么要这样做:
应用程序 A 具有用户登录名并向用户提供数据。应用程序 B 允许任何人创建显示数据的模式。我希望用户启动应用程序 B 并创建一个模式(按保存关闭应用程序)。该模式应发送回应用程序 A,然后应用程序 A 将数据的显示行为更改为新模式。我不想将这两个应用程序混合在一起,因为我希望它们保持独立。
我在搜索这个主题时已经想通了:
- 无法从 zk 项目中直接访问外部 webapp
- 可以使用 tomcat 中的共享资源概念(但我不想那样,因为我希望它 运行 在不同的网络服务器上,如 glasfish 和其他)
真题:
有没有办法让两个应用程序独立(如果是,请解释或举个例子)或者我必须合并它们?
我有很多时间尝试不同的东西我会展示我遇到的 2 个最佳解决方案:
- 使用 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循环非常相似
- 方法 只需在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 的配置文件(在网络服务器上),但我不会在这里介绍