我希望有一个RequestHandler,以便能够动态地通过标准VaadinServlet在myDomain/images/id8938748.jpg和处理所有其他流量时创建图像。要做到这一点,我理解需要将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>然后,我在Servlet代码中定义了另一个带有注释的UI:
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/*之类的东西,但是这并没有什么区别.
发布于 2015-07-18 05:15:09
如果使用例如Image组件在Vaadin中显示这些图像,则可以使用Resource。有几个可用的资源实现:
ThemeResource:将您的文件(例如图像)添加到您的主题中,并使用它来引用图像。ÈxternalResource:URL上的文件。ClassResource:类路径上的一个文件,Vaadin将该文件提供给浏览器。FileResource:服务器文件系统上的文件。将文件提供给浏览器。StreamResource:从InputStream生成文件。将文件提供给浏览器。
图像=新图像();image.setSource(新的图像)一个有效的替代方法是创建一个生成和服务文件的常规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>发布于 2015-07-18 04:31:01
我唯一的解决方案(我不认为是正确的解决方案)是创建另一个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,但在此期间,这是非常好的工作。
https://stackoverflow.com/questions/31487654
复制相似问题