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

时间:2011-05-26 00:26:39

标签: jsp scope

我有几个jsp页面,其中都有一个带有scope =“application”的javabean。第一个被调用的页面实例化对象(让我们称之为obj1),然后所有页面共享它(很棒!)。

但是,我也有一些Servlet映射到该类。无论何时进行其中一个调用,都会实例化该类的第二个实例(将其称为obj2)。使用特定servlet映射的进一步调用由obj2提供服务。

如何让Tomcat使用obj1来处理servlet映射调用?

4 个答案:

答案 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关于正确实施的答案。