如何在JSP / Servlet应用程序中实例化公共资源?

时间:2012-01-11 18:37:32

标签: java jsp servlets javabeans

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

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

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

接下来的问题是,我应该如何才能最好地将这个DAO对象的单个实例用于我的应用程序中的所有servlet和JSP,而不需要大量重复且容易出错的样板初始化代码?

谢谢, 菲尔

1 个答案:

答案 0 :(得分:0)

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

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

  • 鉴于您(我猜)尝试将noSQL后端挂钩到您的Web应用程序,理想情况下您应该使用JCA(Java连接器体系结构)机制来隔离驱动程序。直接从servlet中阻止网络调用和套接字池(!)可以正常工作,但是所有的赌注都取决于Java EE-Web容器为您提供的保证,我个人绝不会允许这样的黑客/应用程序最终生产服务器。如初。

  • 即使您坚持这样做,使用ServletContextListener映射您的网络应用程序的生命周期与连接器的生命周期是这样做的方法。