我正在尝试使用restlet.org库来构建一个RESTful Web界面,我注意到它不同于它的servlet对应物,它没有对GenericServlet.init()的补充。
没有构建另一个servlet来执行我的启动逻辑,是否有任何内置方法可以避免在第一次请求时构建我的数据库工厂等(以及为避免多次初始化而必须进行的所有相应锁定)?
答案 0 :(得分:3)
您是否要在servlet容器中运行它?如果没有,文档将向您展示如何独立运行它:
public static void main(String[] args) throws Exception {
// Create a new Component.
Component component = new Component();
// Add a new HTTP server listening on port 8182.
component.getServers().add(Protocol.HTTP, 8182);
// Attach the sample application.
component.getDefaultHost().attach("/firstSteps",
new FirstStepsApplication());
// Start the component.
component.start();
}
你当然可以在那里进行初始化。
如果要使用servlet方法,请尝试编写新的servlet并扩展它们。实现你的init方法并为超类调用它。
答案 1 :(得分:0)
如果你真的想在servlet环境中这样做,你可能在你的webapp中有两个servlet:一个用于Restlet应用程序/组件,一个用于初始化,使用load-on-startup
(你不会必须映射到任何URL,据我所知你没有)。这样,您就不必继承org.restlet.ext.servlet.ServerServlet
。我认为这可能更容易,因为init servlet只包含init()
,但这只适用于那些不依赖于要首先初始化的Restlet app / component的东西。
<context-param>
<param-name>org.restlet.clients</param-name>
<param-value>HTTP HTTPS CLAP FILE</param-value>
</context-param>
<servlet>
<servlet-name>ExampleInit</servlet-name>
<servlet-class>example.TestInitServlet</servlet-class>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet>
<servlet-name>Example</servlet-name>
<servlet-class>org.restlet.ext.servlet.ServerServlet</servlet-class>
<init-param>
<param-name>org.restlet.application</param-name>
<param-value>example.TestApplication</param-value>
</init-param>
<init-param>
<param-name>org.restlet.autoWire</param-name>
<param-value>true</param-value>
</init-param>
</servlet>
<servlet-mapping>
<servlet-name>Example</servlet-name>
<url-pattern>/*</url-pattern>
</servlet-mapping>
或者(或者也许补充一下),我倾向于使用JNDI初始化数据库连接和一些其他配置设置。这也允许我保持相同的配置和加载机制,无论我是在Web应用程序中使用Restlet独立服务器还是Restlet。
例如,对于servlet容器(例如Jetty或Tomcat)中的部署,我使用容器的JNDI配置,但是对于本地测试(使用独立的Restlet应用程序),我使用Jetty JNDI上下文工厂(您可以获得)作为与Jetty其他部分分开的罐子。)