在 WEB-INF 中只加载一次自定义 XML 文件,该 servlet 由许多 Servlet 扩展



我有一个普通的Java EEWeb应用程序,它不使用任何框架,如StrutsJSF等。在这个 Web 应用程序中,我有一个自定义的 XML (custom-config.xml) 文件 其中包含特定于该应用程序的配置列表。我不想web.xml文件中提及此配置信息。现在当容器第一次 初始化任何 servlet,我需要读取custom-config.xml文件中提到的配置信息。为了实现这一点,我创建了一个自定义的 Servlet 类,比如CustomServletHttpServlet扩展,我所有的 Servlet 都会在这个CustomServlet扩展 frm .因此,当Serlvet类加载时,我的CustomServlet类也将加载。

在我的CustomServlet课上,我有一个静态方法,它应该加载custom-config.xml文件并理解这里提到的配置。

我有两个问题。 这是正确的方法吗?还是我应该把它放在CustomServlet类的init()方法中? 如何从类路径加载custom-config.xml文件?我无法使用ServletConfig.getResourceAsStream(),因为我正在尝试从静态方法加载custom-config.xml

在静态方法中执行此操作是没有意义的。不可能从那里获得ServletContext。您需要在init()方法中执行此操作。您可以使用static AtomicBoolean来检查它是否已加载到当前 JVM 中。

public abstract class CustomServlet extends HttpServlet {
private static AtomicBoolean loaded = new AtomicBoolean();
@Override
public void init() throws ServletException { 
if (!loaded.getAndSet(true)) {
InputStream input = getServletContext().getResourceAsStream("/WEB-INF/custom-config.xml");
// ...
}
}
// ...
}

或者,使用ServletContextListener.

@WebListener
public class Config implements ServletContextListener {
@Override
public void contextInitialized(ServletContextEvent event) {
InputStream input = event.getServletContext().getResourceAsStream("/WEB-INF/custom-config.xml");
// ...
}
// ...
}

您可以将解析的 XML 结果放在应用程序范围内,以使其可供所有 Servlet 使用。

另请参阅:

  • servlet 如何工作?实例化、会话、共享变量和多线程

首先,为什么你有一个静态方法来加载XML文件? 静态方法属于类而不是对象。在超类中有一个默认构造函数,并使其加载 xml。

public abstract class BaseServlet extends HttpServlet{
public Base(){
loadXml();
}
private void loadXml(){
...
}
}
public class Servlet1 extends BaseServlet {
...
}

如果 xml 是类路径,则可以使用 FileInputStream() 加载 xml 文件。

最新更新