向Vaadin 7应用程序添加第二个用户界面出现问题 [英] Adding second UI to Vaadin 7 app causes problems

查看:0
本文介绍了向Vaadin 7应用程序添加第二个用户界面出现问题的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我有一个Vaadin7应用程序,而我最初只有一个用户界面。发生了以下事情,我并不介意,甚至喜欢:

  1. 安装新的WAR文件时,当前打开到该URL的所有浏览器选项卡都显示黑色";连接失败";或";会话过期";错误,迫使我刷新。此外,在部署应用程序时,我经常会在右上角看到服务器加载错误。这一点很难解释,但希望这是有道理的。所有这些都不是由我的代码直接触发的,所有这些都是我从Vaadin获得的开箱即用的行为。
  2. 如果我在多个浏览器选项卡中登录到同一网站(和同一用户),然后从一个选项卡注销,我用于注销/停用所有选项卡的代码工作得很好-它们都返回到登录屏幕,就像我编码的那样。

当时我的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的路径。因此,我做了以下工作:

  1. 更改了web.xml,使其使用3.0,并注释掉了web.xml中的Servlet引用,以便在代码中使用WebServlet批注。
  2. 根据文档将我的第一个用户界面的url模式从@WebServlet(urlPatterns = "/*", name = "WmsServlet", asyncSupported = true)更改为@WebServlet(urlPatterns = {"/*", "/VAADIN/*"}, name = "WmsServlet", asyncSupported = true)。因此,这使得&根&应用程序成为我的主UI,就像我只有一个UI时一样。根据上面的web.xml片段,我的url模式始终是";/*";。
  3. 使用@WebServlet(urlPatterns = "/Registration/*", name = "WmsRegistrationServlet", asyncSupported = true)添加了新的UI和URL模式。

现在我有以下奇怪的地方:

  1. 安装新WAR不会强制我刷新。换句话说,我甚至没有注意到我需要刷新,直到我开始做一些事情,在这一点上,我得到了正常的黑色通信失败,就像正常一样。
  2. 当我在两个选项卡上登录并注销时,它肯定会使另一个选项卡中的会话无效(我看到黑色通信失败错误),但它不会像以前那样返回登录屏幕。
  3. 我们多次看到加载小部件集失败的错误。
  4. 有时,当我们进行上载文件等操作时,会出现通信失败错误。

这两个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屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆