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"));
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>