Servlets 使用特殊的自动启动servlet在启动时初始化并共享应用程序数据

Servlets 使用特殊的自动启动servlet在启动时初始化并共享应用程序数据,servlets,initialization,data-sharing,Servlets,Initialization,Data Sharing,我需要获得一些配置,连接到某个地方的外部资源/对象/系统,并将其存储在应用程序范围中 我可以看到两种设置应用程序的方法: 重写现有servlet中的init() 拥有某种初始化servlet,并使用其init()来完成工作。然后将创建的对象存储在ServletContext中,与我的其他servlet共享 以上哪种方法更好?有没有更好的方法在servlet之间共享对象?直接从另一个或其他地方调用它们……?两者都不是更好的方法。servlet用于侦听HTTP事件(HTTP请求),而不是部署事件

我需要获得一些配置,连接到某个地方的外部资源/对象/系统,并将其存储在应用程序范围中

我可以看到两种设置应用程序的方法:

  • 重写现有servlet中的
    init()
  • 拥有某种初始化servlet,并使用其
    init()
    来完成工作。然后将创建的对象存储在
    ServletContext
    中,与我的其他servlet共享

以上哪种方法更好?有没有更好的方法在servlet之间共享对象?直接从另一个或其他地方调用它们……?

两者都不是更好的方法。servlet用于侦听HTTP事件(HTTP请求),而不是部署事件(启动/关闭)


CDI/JSF/EJB不可用?使用 如果您尚未使用Servlet 3.0,无法升级,因此无法使用
@WebListener
注释,则需要在
/WEB-INF/WEB.xml
中手动注册它,如下所示:

<listener>
    <listener-class>com.example.Config</listener-class>
</listener>
然后在servlet中获取它:

    protected void doGet(HttpServletRequest request, HttpServletResponse response) {
        Config config = (Config) getServletContext().getAttribute("config");
        // ...
    }
它也可以在jspel中通过
${config}
获得。所以你也可以把它做成一个简单的bean


CDI可用吗?用于 这在servlet中通过
@Inject
提供。如有必要,也将其命名为
,以便也可以通过EL中的{config}访问

值得注意的是,这是自CDI 1.1以来的新功能。如果您仍然使用CDI 1.0,并且无法升级,那么请选择另一种方法


JSF可用吗?使用 这也可以通过EL中的
{config}
获得


EJB可用吗?考虑 这可以通过
@EJB
在servlet中获得。我说的是“考虑”,因为您不应该为了启动挂钩而滥用EJB。此外,
@Singleton
在默认情况下是读/写锁定的,主要用于事务处理,例如调度后台作业

另见:

    • 两者都不是更好的方法。servlet用于侦听HTTP事件(HTTP请求),而不是部署事件(启动/关闭)


      CDI/JSF/EJB不可用?使用 如果您尚未使用Servlet 3.0,无法升级,因此无法使用
      @WebListener
      注释,则需要在
      /WEB-INF/WEB.xml
      中手动注册它,如下所示:

      <listener>
          <listener-class>com.example.Config</listener-class>
      </listener>
      
      然后在servlet中获取它:

          protected void doGet(HttpServletRequest request, HttpServletResponse response) {
              Config config = (Config) getServletContext().getAttribute("config");
              // ...
          }
      
      它也可以在jspel中通过
      ${config}
      获得。所以你也可以把它做成一个简单的bean


      CDI可用吗?用于 这在servlet中通过
      @Inject
      提供。如有必要,也将其命名为,以便也可以通过EL中的{config}访问

      值得注意的是,这是自CDI 1.1以来的新功能。如果您仍然使用CDI 1.0,并且无法升级,那么请选择另一种方法


      JSF可用吗?使用 这也可以通过EL中的
      {config}
      获得


      EJB可用吗?考虑 这可以通过
      @EJB
      在servlet中获得。我说的是“考虑”,因为您不应该为了启动挂钩而滥用EJB。此外,
      @Singleton
      在默认情况下是读/写锁定的,主要用于事务处理,例如调度后台作业

      另见:

      如果有人遇到类似问题,请注意:在注册servlet之前,似乎必须在
      /WEB-INF/WEB.xml
      中注册
      。我不知道。此外,GWT可能在注释方法上存在问题,因此最好手动注册
      ,而不是依赖注释,即使IDE没有给出错误,也要注意,以防有人遇到类似问题:在注册servlet之前,似乎必须先在
      /WEB-INF/WEB.xml
      中注册
      。我不知道。此外,GWT可能在注释方法上有问题,因此最好手动注册
      ,而不是依赖注释,即使IDE没有给出错误。
      import javax.enterprise.context.ApplicationScoped;
      
      @ApplicationScoped
      public class Config {
      
          public void init(@Observes @Initialized(ApplicationScoped.class) ServletContext context) {
              // Do stuff during webapp's startup.
          }
      
          public void destroy(@Observes @Destroyed(ApplicationScoped.class) ServletContext context) {
              // Do stuff during webapp's shutdown.
          }
      }
      
      import javax.faces.bean.ManagedBean
      import javax.faces.bean.ApplicationScoped;
      
      @ManagedBean(eager=true)
      @ApplicationScoped
      public class Config {
      
          @PostConstruct
          public void init() {
              // Do stuff during webapp's startup.
          }
      
          @PreDestroy
          public void destroy() {
              // Do stuff during webapp's shutdown.
          }
      }
      
      @Startup
      @Singleton
      public class Config {
      
          @PostConstruct
          public void init() {
              // Do stuff during webapp's startup.
          }
      
          @PreDestroy
          public void destroy() {
              // Do stuff during webapp's shutdown.
          }
      }