Servlets 在web.xml中初始化HttpServlet的方法

Servlets 在web.xml中初始化HttpServlet的方法,servlets,web-applications,controller,initialization,web.xml,Servlets,Web Applications,Controller,Initialization,Web.xml,我为我的webapp编写了一个控制器类,它继承自HttpServlet public abstract class BaseController extends HttpServlet { protected ClientsProvider clientsProvider; @Override public void init() throws ServletException { clientsProvider = (ClientsProvider) getServletContex

我为我的webapp编写了一个控制器类,它继承自HttpServlet

public abstract class BaseController extends HttpServlet {
protected ClientsProvider clientsProvider;

@Override
public void init() throws ServletException {
    clientsProvider = (ClientsProvider) getServletContext().getAttribute(
        "clientsProvider");
    if (clientsProvider == null) {
        clientsProvider = new ClientsProvider();
        getServletContext().setAttribute("clientsProvider", clientsProvider);
    }
    super.init();
}
CommonProvider是另一个类,我在其中初始化了本项目中使用的所有客户端

现在我想使用web.xml来完成init()工作,而不是在这里编写这样的init()代码。像这样:

<servlet>
    <servlet-name>BaseController</servlet-name>
    <servlet-class>myproject.controller.BaseController</servlet-class>
    <load-on-startup>1</load-on-startup>

    <context-param>
        <param-name>clientsProvider</param-name>
        <param-value>clientsProvider</param-value>
    </context-param>
</servlet>

基站控制器
myproject.controller.BaseController
1.
客户提供商
客户提供商

上述代码不起作用,因为参数值未设置为属性。参数值中需要的是一个新的ClientsProvider()对象。在本例中,是否仍然可以在web.xml中执行init()工作?谢谢

web.xml无法执行此操作,因为在启动时将没有ClientProvider实例。您可以使用类似的容器来实现这一点。如果不想使用任何框架,可以将完整的限定类名作为字符串传递,并在servlet中使用

<context-param>
    <param-name>clientsProvider</param-name>
    <param-value>your.package.ClientsProvider</param-value>
    <!--<param-value>your.package.AnotherClientsProvider</param-value>-->
</context-param>

客户提供商
您的.package.ClientsProvider

您不能在web.xml中使用声明性语言,但您可以使用生命周期侦听器或过滤器来处理此类交叉问题。DI框架使用相同的机制。