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>