【发布时间】:2010-06-10 00:09:31
【问题描述】:
我正在尝试使用restlet.org 库来构建一个RESTful Web 界面,我注意到它与对应的servlet 不同,它没有对GenericServlet.init() 的补充。
没有构建另一个 servlet 来执行我的启动逻辑,是否有任何内置方法可以避免在第一次请求时构建我的数据库工厂等(以及我必须做的所有相应锁定以避免多次初始化)?
【问题讨论】:
我正在尝试使用restlet.org 库来构建一个RESTful Web 界面,我注意到它与对应的servlet 不同,它没有对GenericServlet.init() 的补充。
没有构建另一个 servlet 来执行我的启动逻辑,是否有任何内置方法可以避免在第一次请求时构建我的数据库工厂等(以及我必须做的所有相应锁定以避免多次初始化)?
【问题讨论】:
您想在 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 方法并为超类调用该方法。
【讨论】:
如果您真的想在 servlet 环境中执行此操作,您的 webapp 中可能有两个 servlet:一个用于 Restlet 应用程序/组件,一个用于初始化,使用 load-on-startup(您不一定会映射到任何 URL,据我所知,您不必这样做)。这样,您就不必继承org.restlet.ext.servlet.ServerServlet。我认为这可能更容易,因为该 init servlet 将仅包含 init(),但这仅适用于不依赖于首先初始化 Restlet 应用程序/组件的事物。
<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 来初始化数据库连接和一些其他配置设置。这也允许我保持相同的配置和加载机制,无论我使用的是 Restlet 独立服务器还是 web 应用程序中的 Restlet。
例如,对于 servlet 容器(例如 Jetty 或 Tomcat)中的部署,我使用容器的 JNDI 配置,但对于本地测试(使用独立的 Restlet 应用程序),我使用 Jetty JNDI 上下文工厂(您可以获取作为与 Jetty 其余部分分开的 jar)。
【讨论】: