我有一个处理http get请求的servlet,我希望能够共享一个web服务正在开发的对象。它们都在同一个web-app容器中的同一个tomcat服务器上。我不知道如何去做任何想法?在servlet和webservice之间共享一个静态对象
回答
您可以通过在ServletContext(使用setAttribute
/getAttribute
)中存储它们作为属性来跨Web应用共享内容。您可以在ServletContextListener的推动下创建对象,将其存储在ServletContext
中,然后检索并从Web服务和servlet中使用它。
我将扩展我的评论here。
在最简单的情况下,ServletContext.setAttribute/getAttribute
会很好。但有些人正确地提出了关于线程安全的问题。
为此,更好的方法是在webapp初始化过程中将共享的POJO存储在ServletContext
中,并通过ServletContext.getAttribute
将其存储在任何需要的位置。
为此,您需要实现ServletContextListener接口并在您的web.xml文件中声明它。
<listener>
<listener-class>your.package.ServletContextListenerImpl</listener-class>
</listener>
这听众当你的web应用程序是由servlet容器装载被调用一次,当它即将由servlet容器被卸载。在两种情况下,它都通过ServletContextEvent
,其手柄号码为ServletContext
。正是在这一点上,你想设置/ removeAttribute指向你的共享对象。
因此,您可能确定ServletContext.getAttribute在从Servlet.service
或do...
方法之一调用时将返回有效的对象。
至于属性名称,我会去你的共享类classname。我还要补充的静态访问方法来共享类从ServletContext
得到它,就像这样:
public class Shared
{
...
public static Shared fromServletContext (final ServletContext context)
{
return (Shared) context.getAttribute(Shared.class.getName());
}
}
如果我的问题的另一种理解是正确的,它来源于请求的数据应该存储,并然后通过网络服务撤回。如果这应该在多用户环境中运行,则可以考虑使用内存数据库(HSQLDB)临时存储数据。然后,根据我无法预知的一些标准,您可以使用您的Web服务检索它。
如果这是特定于应用程序的数据(所有用户(会话)均可访问),请使用ServletContext#set/getAttribute()
。如果这是用户(会话)特定的数据,则使用HttpSession#set/getAttribute()
。
让servlet类通过特定的属性键在所需的作用域(应用程序或会话)中设置对象,并让webservice通过相同的属性键从所需的作用域中获取对象。
我觉得你宁可需要HttpSession
。
单身故事在这里没有意义。
我有一种感觉,网络服务被不同的机器/浏览器调用,从而产生不同的会话。但这里的情况很模糊。 – Bozho 2009-12-02 21:25:13
- 1. 在webservice之间共享业务对象
- 2. Servlets之间共享对象
- 3. 静态库和共享对象是共享符号吗?
- 4. 如何在DLL和Windows之间共享静态对象二进制内存
- 5. 在Jersey Servlet和JSF Backing Bean之间共享一个作用域
- 6. 在多个进程之间共享共享对象
- 7. 在两个共享对象之间共享变量
- 8. 类之间的共享偏好(静态)?
- 9. 如何共享一个静态方法之间的几个类
- 10. 多个JInternalFrame之间的共享对象
- 11. ASP.NET Webgarden共享静态对象
- 12. 链接共享对象与静态库
- 13. 如何在多个对象之间共享一个值? C#
- 14. KineticJS在两个组之间共享一个对象
- 15. 在多个线程之间共享一个对象java
- 16. 如何在两个或多个Servlet之间共享变量或对象?
- 17. 在子系统之间共享对象
- 18. 在活动之间共享域对象
- 19. 在QML文件之间共享对象
- 20. 在线程之间共享对象
- 21. C++在对象之间共享变量。
- 22. 在类之间共享对象
- 23. 在线程之间共享XPObject对象
- 24. 在成员之间共享对象
- 25. 在标签之间共享对象Riot.js
- 26. 在类对象之间共享数据
- 27. 如何在servlet之间共享java AsyncContext?
- 28. 如何在WCF中的进程间共享静态对象?
- 29. 在静态方法和静态事件处理程序之间共享数据
- 30. 在多个进程之间共享静态数据
你想以什么方式分享?请求中的数据如何在您的Web服务中使用。 – Bozho 2009-12-02 12:58:39
该请求用于填充此对象中的数据。稍后的web服务(发生一系列事件时)会更新此数据的各个方面。 – wmitchell 2009-12-02 14:10:18