1

我为我的webapp编写了一个控制器类,它继承自HttpServlet。在web.xml中初始化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(); 
} 

CommonsProvider是另一个类,其中我初始化了我在此项目中使用的所有客户端。

现在我想使用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> 

上面的代码不工作,因为参数值没有设置属性。我需要的参数值是一个新的ClientsProvider()对象。在这种情况下,是否仍然可以在web.xml中执行init()工作?谢谢!

+1

您无法在web.xml中执行该声明,但您可以使用生命周期侦听器或过滤器来解决此类横切问题。 DI框架使用相同的机制。 – eckes

回答

1

web.xml无法执行此操作,因为在启动时不会有ClientProvider实例。您可以使用这样的DI容器来做到这一点。如果您不想使用任何框架,则可以将完整的合格类名作为字符串传递,并在您的servlet中使用Class.forName(...)

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