Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/369.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 如何使用VaadinServlet为图像设置RequestHandler_Javascript_Java_Jakarta Ee_Vaadin_Vaadin7 - Fatal编程技术网

Javascript 如何使用VaadinServlet为图像设置RequestHandler

Javascript 如何使用VaadinServlet为图像设置RequestHandler,javascript,java,jakarta-ee,vaadin,vaadin7,Javascript,Java,Jakarta Ee,Vaadin,Vaadin7,我希望有一个RequestHandler能够动态地创建图像,比如说myDomain/images/id8938748.jpg,同时处理通过标准VaadinServlet的所有其他流量。要做到这一点,我知道我需要将RequestHandler放入VaadinServlet中,通过扩展它,例如: public class MyCustomServlet extends VaadinServlet { @Override protected void service(

我希望有一个
RequestHandler
能够动态地创建图像,比如说
myDomain/images/id8938748.jpg
,同时处理通过标准
VaadinServlet
的所有其他流量。要做到这一点,我知道我需要将
RequestHandler
放入
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>
当我调用域本身时,它会按照预期工作,我的Vaadin应用程序也会工作。但是当我调用domain/images或domain/images/randomText时,我得到一个空页面,
System.out.println
语句不会被输出。基本上不调用
RequestHandler


我也尝试过像映射到
/images/*
/app/*
这样的方法,但没有任何区别…

我唯一的解决方案,我认为这不是正确的解决方案,就是创建另一个
UI
类,以便:

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

    @Override
    protected void init(VaadinRequest request) 
    {
        VaadinSession.getCurrent().addRequestHandler(new RequestHandler() 
        {
            @Override
            public boolean handleRequest(VaadinSession session, VaadinRequest request, VaadinResponse response) throws IOException 
            {
                System.out.println("Test output");
            }
        });
    }
}
此代码确实有效,并向控制台显示输出。从那里我可以
response.setContentType(“…”)
并根据需要执行操作,它也可以正常工作


现在我的理解是,这不是“正确的方式”,正确的方式是通过一个
Servlet
,但与此同时,这确实非常有效。

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

  • :将您的文件(例如图像)添加到主题中,并使用此文件引用图像
  • :URL上的文件
  • :类路径上的文件,Vaadin servlet将该文件提供给浏览器
  • :服务器文件系统上的文件。Vaadin servlet将文件提供给浏览器
  • :从
    输入流生成文件。Vaadin servlet将文件提供给浏览器

    Image image = new Image();
    image.setSource(new ThemeResource("path/is/relative/to/the/theme/folder.png"));
    
一个有效的替代方法是创建一个生成和服务文件的常规servlet。那么就不能再将vaadinservlet映射到上下文根。然后,您可以使用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>

MyImageServlet
/图像/*
米瓦迪尼酒店
/用户界面/*
米瓦迪尼酒店
/瓦丁/*

我试图直接链接图像,而不是将其放在UI中。在用户界面内是非常简单的。我想在Vaadin中这样做,这样我就可以利用会话管理(您只能看到您的图像),从而使用相同的会话身份验证。现在,我确实尝试按照您的建议使用servlet映射来实现这一点,但它对我不起作用。我试图删除通配符和do/images/*和/app/*(问题的最后一行),但没有成功。从同一war文件部署的请求处理程序从未被调用…@StephaneGrenier Servlet共享相同的HttpSession,以便用于存储用户信息。这正是我想要使用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>