如何使嵌入式servlet引擎热切地实例化servlet?

时间:2020-03-05 18:56:45  来源:igfitidea点击:

问题很简单,但是我已经在挣扎了。

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,以便我可以预先进行所有艰苦的工作,而不必在第一个用户请求时进行?

解决方案

回答

使用带有ServletHolder的Context.addServlet重载。 ServletHolder是一个接受Class或者Servlet实例的类。

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

假设使用Jetty6. 我认为它也适用于Jetty 7.

回答

我不确定为什么使用Guice make的Justin选项对我们不起作用。到底注入了什么?我不确定这是否会对我们有任何帮助,因为它与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, "/");