如何在servlet中访问具有应用程序范围的javabean

问题描述

|| 我有几个jsp页面,所有页面中都有一个javabean,范围为“ \” application \”。第一个调用页面实例化该对象(将其称为obj1),然后所有页面都共享该对象(很棒!)。 但是,我也有一些到该类的Servlet映射。每当进行这些调用之一时,都会实例化该类的第二个实例(将此对象称为obj2)。使用特定servlet映射的进一步调用由obj2提供服务。 如何让Tomcat使用obj1处理servlet映射调用?     

解决方法

您需要一个“ 0”来创建它。
@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>
标签。     ,我认为您必须发布web.xml文件的各个部分才能解决此问题,但是如果您在同一应用程序中获得同一bean的两个实例,那么根据定义,它不在应用程序范围内。 您能告诉我们您的servlet映射引用是什么样的吗?我怀疑它们的调用方式使上下文不同,因此容器不会将两个引用都视为在同一应用程序中。可能是由于未正确声明bean的作用域。     ,问题不是很清楚。如果您的问题是   如何使tomcat为您的应用程序创建servlet实例。这就是答案! 没有应用程序不能告诉容器将应用程序创建的某些实例用作Servlet。容器将创建对象并自行销毁。     ,根据您的评论,您的方法是错误的,servlet不能在应用程序中用作bean。 Sevlet在mvc pradigm中充当控制器,您的应用程序bean是模型的一部分。因此,您将控制器与模型耦合在一起是不好的。而且,您尝试执行的操作根本无法正常工作。有关正确的实现,请参见BalusC的答案。