【问题标题】:How to make embedded servlet engine instantiate servlets eagerly?如何让嵌入式 servlet 引擎急切地实例化 servlet?
【发布时间】:2010-09-09 16:14:01
【问题描述】:

问题很简单,但我已经有点挣扎了。

Server server = new Server(8080);  
Context context = new Context(server, "/", Context.NO_SESSIONS);
context.addServlet(MainPageView.class, "/");
context.addServlet(UserView.class, "/signup");
server.start();

这是一段非常标准的代码,您可以在 Jetty 世界的任何地方找到它。我有一个将 Jetty 嵌入为 servlet 引擎并具有一些 servlet 的应用程序。

其中一些 servlet 的实例化需要在启动时进行大量工作。比如说——读取额外的配置文件,连接到数据库等。我怎样才能让 servlet 引擎急切地实例化所有的 servlet,这样我就可以预先完成所有的艰苦工作,而不是在第一个用户请求时完成?

【问题讨论】:

    标签: java servlets jetty


    【解决方案1】:

    我不确定为什么使用 Guice make 的 Justin's 选项不适合您。到底注入了什么?我不确定这是否会对您有所帮助,因为它与 Justin 上面写的非常相似,但如果您这样做,Jetty 将进行实际实例化。

    Context context = new Context(server, "/", Context.NO_SESSIONS);
    ServletHolder mainPageViewHolder = new ServletHolder(MainPageView.class);
    // Do this to force Jetty to instantiate the servlet
    mainPageViewHolder.getServlet();  
    context.addServlet(mainPageViewHolder, "/");
    

    【讨论】:

    • 注入 servlet 的私有字段。这个答案更好,但我仍然有点希望我可以设置一些未知的缺失标志,并且jety会急切地实例化所有内容。无论如何,我想我必须忍受这一点。
    【解决方案2】:

    使用采用ServletHolderContext.addServlet 重载。 ServletHolder 是一个接受 Class 或 Servlet 实例的类。

    Servlet myServlet = new MyServlet();
    ServletHolder holder = new ServletHolder(myServlet);
    context.addServlet(holder, "/");
    

    假设 Jetty 6。我认为它也适用于 Jetty 7。

    【讨论】:

    • 贾斯汀,这样就行了。但是由于一些原因(即隐藏的基于 Guice 的依赖注入),我需要 Jetty 为我急切地实例化 servlet。
    猜你喜欢
    • 2023-03-11
    • 1970-01-01
    • 2014-12-25
    • 2012-05-30
    • 1970-01-01
    • 2016-02-19
    • 2015-01-02
    • 2015-06-24
    • 1970-01-01
    相关资源
    最近更新 更多