我有一个普通的Java EE
Web应用程序,它不使用任何框架,如Struts
,JSF
等。在这个 Web 应用程序中,我有一个自定义的 XML (custom-config.xml
) 文件 其中包含特定于该应用程序的配置列表。我不想web.xml
文件中提及此配置信息。现在当容器第一次 初始化任何 servlet,我需要读取custom-config.xml
文件中提到的配置信息。为了实现这一点,我创建了一个自定义的 Servlet 类,比如CustomServlet
从HttpServlet
扩展,我所有的 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 文件。