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()
中,与我的其他servlet共享ServletContext
以上哪种方法更好?有没有更好的方法在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
在默认情况下是读/写锁定的,主要用于事务处理,例如调度后台作业
另见:
/WEB-INF/WEB.xml
中注册
。我不知道。此外,GWT可能在注释方法上有问题,因此最好手动注册
,而不是依赖注释,即使IDE没有给出错误。
public void contextInitialized(ServletContextEvent event) {
event.getServletContext().setAttribute("config", this);
// ...
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) {
Config config = (Config) getServletContext().getAttribute("config");
// ...
}
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.
}
}