1

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

在我的CustomServlet课堂上,我有一个静态方法,可以加载custom-config.xml文件并理解本文中提到的配置。

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

4

2 回答 2

2

用静态方法做是没有意义的。从那里去是不可能的ServletContext。您需要在init()方法中执行此操作。您可以使用 astatic 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。

也可以看看:

于 2012-09-14T14:43:05.813 回答
-1

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

public abstract class BaseServlet extends HttpServlet{

public Base(){
loadXml();
}
private void loadXml(){
...
}
}

public class Servlet1 extends BaseServlet {
...
}

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

于 2012-09-14T11:58:09.913 回答