我有几个jsp页面,其中都有一个带有scope =“application”的javabean。第一个被调用的页面实例化对象(让我们称之为obj1),然后所有页面共享它(很棒!)。
但是,我也有一些Servlet映射到该类。无论何时进行其中一个调用,都会实例化该类的第二个实例(将其称为obj2)。使用特定servlet映射的进一步调用由obj2提供服务。
如何让Tomcat使用obj1来处理servlet映射调用?
答案 0 :(得分:2)
您需要ServletContextListener
来创建它。
@WebListener
public class Config implements ServletContextListener {
@Override
public void contextInitialized(ServletContextEvent event) {
event.getServletContext().setAttribute("data", new Data());
}
// ...
}
这样你就可以在每个servlet中抓取它,如下所示
Data data = (Data) getServletContext().getAttribute("data");
// ...
并在每个JSP中访问如下
${data}
请注意,不需要旧版<jsp:useBean>
标记。
答案 1 :(得分:0)
我认为您必须发布部分web.xml文件才能解决此问题,但如果您在同一个应用程序中获得同一个bean的两个实例,那么根据定义它不是应用程序作用域。
您能告诉我们您的servlet映射引用是什么样的吗?我怀疑它们是以上下文不同的方式调用的,因此容器看不到两个引用都在同一个应用程序中。它或者是bean的范围没有被正确声明。
答案 2 :(得分:0)
问题不是很清楚。如果您有疑问
如何让tomcat为应用程序创建servlet实例。这就是答案!
没有应用程序无法告诉容器将某个应用程序创建的实例用作servlet。容器将创建对象并自行销毁。
答案 3 :(得分:0)
根据您的评论,您的方法是错误的,不会将servlet用作应用程序中的bean。 Sevlets充当mvc范例中的控制器,您的应用程序bean是模型的一部分。因此,您将控制器与您的模型耦合,这是不好的。而且,你想要做的事情根本无法发挥作用。请参阅BalusC关于正确实施的答案。