0

我正在尝试使用 restlet.org 库来构建一个 RESTful Web 界面,我注意到与它的 servlet 对应物不同,它没有对 GenericServlet.init() 的补充。

除了构建另一个 servlet 来执行我的启动逻辑之外,是否有任何内置方法可以避免在第一个请求时构建我的数据库工厂等(以及我必须做的所有相称的锁定以避免多次初始化)?

4

2 回答 2

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 方法并为超类调用该方法。

于 2010-06-10T00:24:32.170 回答
0

如果您真的想在 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 独立服务器还是 webapp 中的 Restlet。

例如,对于 servlet 容器(例如 Jetty 或 Tomcat)中的部署,我使用容器的 JNDI 配置,但对于本地测试(使用独立的 Restlet 应用程序),我使用 Jetty JNDI 上下文工厂(您可以将其作为单独的码头其余部分的罐子)。

于 2010-06-24T22:51:31.137 回答