【问题标题】:Way to initialize HttpServlet in web.xml在 web.xml 中初始化 HttpServlet 的方法
【发布时间】:2018-02-03 22:42:01
【问题描述】:

我为我的 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();
}

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>

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

【问题讨论】:

  • 你不能在 web.xml 中做这样的声明,但你可以有一个生命周期监听器或过滤器来处理这种横切关注点。 DI 框架使用相同的机制。

标签: servlets web-applications controller initialization web.xml


【解决方案1】:

web.xml 不能这样做,因为在启动时不会有 ClientProvider 的实例。您可以使用 DI 容器,如 Spring Framework 来执行此操作。如果您不想使用任何框架,则可以将完整的限定类名作为字符串传递并在您的 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>

【讨论】:

    猜你喜欢
    • 2016-12-18
    • 2017-02-23
    • 1970-01-01
    • 1970-01-01
    • 2014-03-01
    • 2016-07-28
    • 1970-01-01
    • 2021-04-24
    • 1970-01-01
    相关资源
    最近更新 更多