如何使嵌入式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, "/");