javascript - 如何使用 VaadinServlet 为图像设置 RequestHandler

标签 javascript java jakarta-ee vaadin vaadin7

我想要一个 RequestHandler 能够在 myDomain/images/id8938748.jpg 处动态创建图像,同时通过标准处理所有其他流量VaadinServlet。为此,我明白我需要将 RequestHandler 作为 explained here 放入 VaadinServlet 中通过扩展它,例如:

public class MyCustomServlet extends VaadinServlet 
{
        @Override
        protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException 
        {
            getService().addSessionInitListener(new SessionInitListener() 
            {
                @Override
                public void sessionInit(SessionInitEvent event) throws ServiceException 
                {
                    event.getSession().addRequestHandler(myCustomRequestHandlerForImages);
                }
            });
        }
}

我的问题是如何注册新的 MyCustomServlet?我查看了在 web.xml 中执行此操作,但我似乎无法正确执行。

我的 RequestHandler 很简单:

@Override
public boolean handleRequest(VaadinSession session, VaadinRequest request, VaadinResponse response) throws IOException 
{
    System.out.println("Test it's being called");
}

对于 web.xml 我有:

<servlet>
    <servlet-name>MyCustomVaadinServlet</servlet-name>
    <servlet-class>
        com.test.MyCustomVaadinServlet
    </servlet-class>
</servlet>

<servlet-mapping>
    <servlet-name>MyCustomVaadinServlet</servlet-name>
    <url-pattern>/images/*</url-pattern>
</servlet-mapping>

然后我在带有注释的 UI 代码中定义了另一个 Servlet:

public class MyUI extends UI
{
  @WebServlet(value = "/*", asyncSupported = true)
  @VaadinServletConfiguration(productionMode = false, ui = MyUI.class, widgetset = "com.MyWidgetSet")
    public static class Servlet extends VaadinServlet 
  {
  }
  ...
}

当我调用域本身时,它一切都按预期工作并且我的 Vaadin 应用程序工作。但是,当我调用 domain/images 或 domain/images/randomText 时,我得到一个空白页面并且 System.out.println 语句没有输出。基本上 RequestHandler 不会被调用。

我也尝试过映射到 /images/*/app/* 之类的东西,但这没有任何区别......

最佳答案

如果您使用例如 Image 在 Vaadin UI 中显示这些图像组件,你可以使用 Resource .有几种可用的资源实现:

  • ThemeResource :将您的文件(例如图像)添加到您的主题中,并使用它来引用图像。
  • ÈxternalResource : URL 上的文件。
  • ClassResource : 您的类路径上的一个文件,Vaadin servlet 将该文件提供给浏览器。
  • FileResource :服务器文件系统上的文件。 Vaadin servlet 将文件提供给浏览器。
  • StreamResource :从 InputStream 生成您的文件。 Vaadin servlet 将文件提供给浏览器。

    Image image = new Image();
    image.setSource(new ThemeResource("path/is/relative/to/the/theme/folder.png"));
    

一个有效的替代方法是创建一个常规的 servlet 来生成和提供文件。然后您不能再将 Vaadin Servlet 映射到上下文根。然后您可以使用 ExternalResource 来引用您的 Vaadin 代码中的文件:

Image image = new Image();
image.setSource(new ExternalResource("/images/id8938748.jpg"));

例如,您的 servlet 映射如下所示:

<servlet-mapping>
  <servlet-name>MyImageServlet</servlet-name>
  <url-pattern>/images/*</url-pattern>
</servlet-mapping>

<servlet-mapping>
  <servlet-name>MyVaadinServlet</servlet-name>
  <url-pattern>/ui/*</url-pattern>
</servlet-mapping>

<servlet-mapping>
  <servlet-name>MyVaadinServlet</servlet-name>
  <url-pattern>/VAADIN/*</url-pattern>
</servlet-mapping>

关于javascript - 如何使用 VaadinServlet 为图像设置 RequestHandler,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31487654/

相关文章:

javascript - 如何防止修改AJAX请求

java - SSLHandshakeException : PKIX path building failed

jakarta-ee - 无法像测试 JSF ViewScoped 托管 bean 那样测试 CDI ViewScoped bean

javascript - 如何在用户单击共享时禁用共享按钮并在 3 小时后启用它

javascript - 如何自定义 Jasmine 的目录结构?

java - Hibernate - native SQL 参数的奇怪顺序

java - 如何在 CDI 环境中管理 EntityManager 生命周期(使用 Tomcat)

jakarta-ee - Jaspic:处理对未 protected 资源的访问

javascript - 如何设置 href 以 Bootstrap 导航栏 onclick 菜单它应该触发到另一个页面的标签栏

java - 如何将用户输入变量传递到构造函数中?