【发布时间】: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 使用,而不需要大量重复且容易出错的样板初始化代码?
谢谢, 菲尔
【问题讨论】:
-
Using init servlet、I want to use a method which is called only once after deploying to Server、How do I load a java class (not a servlet) when the tomcat server starts 等的可能副本。顺便说一句,
<jsp:useBean>已经死了。不要使用它。无论如何,您不应该直接在 JSP 中使用 DAO。 -
Using init servlet 的可能副本
-
你有Spring可以使用吗?
-
我从未使用过 Spring,我不排除它,但我希望这不是需要整个框架来解决的问题。
-
看起来他们都指向同一个解决方案(使用 ServletContextListener),我认为这也可以解决我的问题。谢谢你的帖子。
标签: java jsp servlets javabeans