首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何使用RequestHandler为图像设置VaadinServlet

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

Stack Overflow用户
提问于 2015-07-18 04:02:15
回答 2查看 702关注 0票数 1

我希望有一个RequestHandler,以便能够动态地通过标准VaadinServletmyDomain/images/id8938748.jpg和处理所有其他流量时创建图像。要做到这一点,我理解需要将RequestHandler作为在此解释放在VaadinServlet中,方法是扩展它,例如:

代码语言:javascript
复制
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很简单:

代码语言:javascript
复制
@Override
public boolean handleRequest(VaadinSession session, VaadinRequest request, VaadinResponse response) throws IOException 
{
    System.out.println("Test it's being called");
}

对于web.xml,我有:

代码语言:javascript
复制
<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>

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

代码语言:javascript
复制
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应用程序也能工作。但是,当我调用域/图像或域/图像/随机文本时,我会得到一个空页面,并且不会输出System.out.println语句。基本上,RequestHandler没有被调用。

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

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2015-07-18 05:15:09

如果使用例如Image组件在Vaadin中显示这些图像,则可以使用Resource。有几个可用的资源实现:

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

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

代码语言:javascript
复制
Image image = new Image();
image.setSource(new ExternalResource("/images/id8938748.jpg"));

例如,servlet映射如下所示:

代码语言:javascript
复制
<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>
票数 3
EN

Stack Overflow用户

发布于 2015-07-18 04:31:01

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

代码语言:javascript
复制
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,但在此期间,这是非常好的工作。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/31487654

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档