向Vaadin 7应用程序添加第二个用户界面出现问题 [英] Adding second UI to Vaadin 7 app causes problems
问题描述
我有一个Vaadin7应用程序,而我最初只有一个用户界面。发生了以下事情,我并不介意,甚至喜欢:
- 安装新的WAR文件时,当前打开到该URL的所有浏览器选项卡都显示黑色";连接失败";或";会话过期";错误,迫使我刷新。此外,在部署应用程序时,我经常会在右上角看到服务器加载错误。这一点很难解释,但希望这是有道理的。所有这些都不是由我的代码直接触发的,所有这些都是我从Vaadin获得的开箱即用的行为。
- 如果我在多个浏览器选项卡中登录到同一网站(和同一用户),然后从一个选项卡注销,我用于注销/停用所有选项卡的代码工作得很好-它们都返回到登录屏幕,就像我编码的那样。
当时我的web.xml如下:
web-app id="WebApp_ID" version="2.5"
xmlns="http://java.sun.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee
http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd">
<display-name>vaadinwebsite</display-name>
<context-param>
<description>Vaadin production mode</description>
<param-name>productionMode</param-name>
<param-value>${productionMode}</param-value>
</context-param>
<servlet>
<!-- <servlet-name>WmsUIServlet</servlet-name> -->
<servlet-name>WmsServlet</servlet-name>
<servlet-class>com.mobiwms.website.WmsServlet</servlet-class>
<init-param>
<param-name>UI</param-name>
<param-value>com.mobiwms.website.WmsUI</param-value>
</init-param>
</servlet>
<servlet-mapping>
<!-- <servlet-name>WmsUIServlet</servlet-name> -->
<servlet-name>WmsServlet</servlet-name>
<url-pattern>/*</url-pattern>
</servlet-mapping>
<!-- Uncomment if add more than one UI
<servlet-mapping>
<servlet-name>Vaadintutorial</servlet-name>
<url-pattern>/VAADIN/*</url-pattern>
</servlet-mapping>
-->
... <!-- some other stuff-->
</web-app>
我最近添加了第二个UI,这意味着我需要调整第一个UI的路径。因此,我做了以下工作:
- 更改了web.xml,使其使用3.0,并注释掉了web.xml中的Servlet引用,以便在代码中使用WebServlet批注。
- 根据文档将我的第一个用户界面的url模式从
@WebServlet(urlPatterns = "/*", name = "WmsServlet", asyncSupported = true)
更改为@WebServlet(urlPatterns = {"/*", "/VAADIN/*"}, name = "WmsServlet", asyncSupported = true)
。因此,这使得&根&应用程序成为我的主UI,就像我只有一个UI时一样。根据上面的web.xml片段,我的url模式始终是";/*";。 - 使用
@WebServlet(urlPatterns = "/Registration/*", name = "WmsRegistrationServlet", asyncSupported = true)
添加了新的UI和URL模式。
现在我有以下奇怪的地方:
- 安装新WAR不会强制我刷新。换句话说,我甚至没有注意到我需要刷新,直到我开始做一些事情,在这一点上,我得到了正常的黑色通信失败,就像正常一样。
- 当我在两个选项卡上登录并注销时,它肯定会使另一个选项卡中的会话无效(我看到黑色通信失败错误),但它不会像以前那样返回登录屏幕。
- 我们多次看到加载小部件集失败的错误。
- 有时,当我们进行上载文件等操作时,会出现通信失败错误。
这两个UI和Servlet基本相同,只是布局不同。较新的用户界面是一个注册用户界面,因此实际上只有一个表单、一个视图,并且非常简单。另一个是成熟的应用程序。
我在较新的应用程序(注册用户界面)上使用asyncSupported = false
进行了尝试,但不起作用。然后我将@WebServlet(urlPatterns = "/Registration/*", name = "WmsRegistrationServlet", asyncSupported = false)
注释掉,所以实际上我的新用户界面是不可访问的。这也没有解决问题。
因为我还更改了web.xml以便使用3.0(在此之前,web.xml是2.5),所以我将我的两个UIServlet的asyncSupport都更改为False,以便它与2.5的默认行为匹配。这也没有修复它。
因此,我再次注释掉了注册WebServlet注释,并将@WebServlet(urlPatterns = {"/*", "/VAADIN/*"}, name = "WmsServlet", asyncSupported = false)
更改为@WebServlet(urlPatterns = "/*", name = "WmsServlet", asyncSupported = false)
(因此去掉了VAADIN引用)。这实际上解决了问题,现在一切都像以前一样工作了。那么我是在处理2个用户界面错误吗?也许我处理的是&q;/VAADIN/*&q;错误?
推荐答案
好的,在多次阅读documentation后,我终于注意到他们提出的一个小问题:
如果您提供服务,则不必提供上述/VAADIN/*映射 小部件集和(自定义和默认)主题都静态地放在 Web应用程序中的/VAADIN目录。映射简单地允许 从瓦丁罐子里动态地为他们提供服务。静态地为他们服务 建议用于生产环境,因为它速度更快。如果你 在同一个Web应用程序中提供内容,您可能不会 拥有Vaadin Servlet的根模式/*,就像所有 请求将映射到Servlet。
因此,一旦我将@WebServlet(urlPatterns = {"/*", "/VAADIN/*"}, name = "WmsServlet", asyncSupported = false)
更改为@WebServlet(urlPatterns = "/*", name = "WmsServlet", asyncSupported = true)
,情况就好多了。因为我使用的不是VAADIN JAR文件,而是我的WAR文件中的Vaadin内容,该文件被分解为一个目录(据我所知的默认设置),它实际上是静态的,因此这是可行的。
asyncSupported = true
以避免当前链的过滤器或Servlet不支持异步操作。&错误(我提到了这个错误here),尽管老实说,我不是100%确定我必须这样做。由于它似乎不会伤害我,因此我将其保留为";true";。
这篇关于向Vaadin 7应用程序添加第二个用户界面出现问题的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!