【问题标题】:How to instantiate a common resource in a JSP/Servlet app?如何在 JSP/Servlet 应用程序中实例化公共资源?
【发布时间】:2012-02-08 03:11:14
【问题描述】:

我正在开发一个基于 Java 的 Web 应用程序,它将由几个 JSP 和一些 servlet 组成。 JSP 和 servlet 都需要访问专有的远程资源,通过 TCP 提交基于文本的请求可以访问该资源(响应也是纯文本)。

为此,我创建了一个带有各种getXbyId() 样式方法的DAO 样式对象。在内部,DAO 维护了一个SocketPool,即具有同步get()put() 方法的Socket 集合。如果池耗尽,调用get() 将导致池增长(我可能应该限制池的大小,但我还没有)。

我的上述代码适用于单个 servlet。具体来说,servlet init() 方法实例化 DAO 对象并将其存储为本地对象。我的计划是通过将 DAO 对象的单个实例放入应用程序范围(可能通过使其成为单例来强制执行)来扩展这一点。每个 JSP 和 servlet 都需要检查该对象在应用程序范围内是否存在,并在需要时对其进行初始化。 JSP 将能够使用<jsp:useBean>,而 servlet 需要以编程方式执行此操作(即,从应用程序上下文中获取它并在获取返回 null 时实例化它)。上述场景的问题在于,DAO 无法使用无参数构造函数进行有意义的初始化。它需要参数来指定远程资源的 IP 地址、端口等。这些值存储在我从 ServletContext 加载的属性文件中(通过 getResourceAsStream)。

然后的问题是,我应该如何最好地让这个 DAO 对象的单个实例可供我的应用程序中的所有 servlet 和 JSP 使用,而不需要大量重复且容易出错的样板初始化代码?

谢谢, 菲尔

【问题讨论】:

标签: java jsp servlets javabeans


【解决方案1】:

你在这里重新发明了各种各样的东西:

  • 在使用web.xml 时应定义参数,特别是端口号、IP 地址等数据,除非您有非常令人信服的理由不这样做。 (?)

  • 1234563直接从 servlet 中投入阻塞网络调用和套接字池(!)可以工作,但就 Java EE-Web 容器为您提供的保证而言,所有的赌注都是错误的,我个人永远不会允许这样的黑客/应用程序最终进入生产服务器。永远。
  • 即使您坚持这样做,使用ServletContextListener 将您的网络应用程序的生命周期与连接器的生命周期进行映射也是一种方法。

【讨论】:

  • 谢谢,JCA 点不适用,因为它实际上只是使用套接字上的文本的第三方服务(它远远早于 noSQL:) 我会看看网络。 xml 选项,但我不知道这一点。
  • JCA 旨在集成“企业信息系统”。它与 noSQL 无关。它只是允许一种标准机制来集成被动 主动外部“资源”,在您的情况下是传统的第 3 方服务。我刚刚在 Google 上搜索了这个 theserverside.com/news/1364656/… 这并不重要,但它是正确且可靠的方法。
  • 啊,我明白了。感谢您的帖子,我会进一步研究这个。干杯。
猜你喜欢
  • 2010-10-15
  • 1970-01-01
  • 2014-07-03
  • 1970-01-01
  • 1970-01-01
  • 2014-01-16
  • 2022-06-10
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多