2010-05-31 84 views
7

我是一种新的与Java的Web开发。 我正在开发一个web服务,我选择了REST/Jersey泽西岛/ ServletContext和启动资源加载

我想在启动服务时初始化一些东西,并在服务的整个生命周期中保持它们的 。

第一个问题:Servlet的构造函数是一个很好的地方吗?

基本上,我想要做的是加载位于我的WEB-INF目录中的config.ini文件。 正在关注this help,我知道我需要一个ServletContext来加载我的文件作为资源。

但是,我不清楚如何得到这个ServletContext的新泽西 Servlet的,因为它是不是真的一个servlet实例,而是与一些注释的POJO。 我想尝试this tip,但属性“context”在构造函数中为null。我认为可能会在构造函数之后填充它。对 ?

那么正确的方法是如何做到这一点?

这是到目前为止我的代码:

/** Main REST servlet */ 
@Path("/") 
public class Servlet { 

    // ---------------------------------------------------- 
    // Constants      
    // ---------------------------------------------------- 

    static private final String CONFIG_PATH = "/WEB-INF/config.ini"; 

    // ---------------------------------------------------- 
    // Attributes      
    // ---------------------------------------------------- 

    /** Context */ 
    @Context ServletContext context; 

    // ---------------------------------------------------- 
    // Constructor      
    // ---------------------------------------------------- 

    /** Init the servlet */ 
    public Servlet() { 

     // Load config.ini from WEB-INF 
     Config.config = new Config(
       this.context.getResourceAsStream(CONFIG_PATH)); 

     // FAIL! this.context is null ... 

    } 

    // ---------------------------------------------------- 
    // URI Handlers      
    // ---------------------------------------------------- 

    /** Welcome page */ 
    @GET 
    @Path("/") 
    @Produces(MediaType.TEXT_HTML) 
    public String welcome() { 
     return "<h1>Hi there.</h1>"; 
    } 
} 

任何帮助将非常感激。 由于提前,

拉斐尔

回答

7

我不熟悉的球衣,但一般在Java Web应用程序,我认为这样做会创建一个ContextListener正确的事情。

上下文侦听器是一个类,它实现了接口javax.servlet.ServletContextListener并在web.xml中进行了配置。它有一个方法,当应用程序首先被封装到你的容器中时执行,另一个在应用程序停止时执行,所以它是放置一次性初始化东西并清理事物的理想场所应用程序停止。

因此,步骤是:

  1. 创建监听器类中,实现contextInitialized(ServletContextEvent SCE)方法。在这种方法中,您会收到一个ServeltContextEvent,它具有getServletContext()方法,可以访问ServletContext。
  2. 配置监听器在web.xml

您会在这里找到更多的信息:tutorial

或者Sun的,呃,Oracle的网站。

顺便说一句,如果您的文件将在JAR文件中,我不确定ServletContext方法是加载它的最佳方式。我觉得你有更好somethinbg像:

this.getClass().getClassLoader().getResourceAsStream("com.company.my.file.properties"); 
+0

嗨,谢谢你的帮助。 这似乎更清楚这种方式,这工作! – 2010-05-31 12:00:55

+0

不知道你做了什么,因为这不起作用:泽西吃了它,并且在教程中编写的代码永远不会在Jersey ReST servlet下调用。 – 2012-12-28 20:28:28

8

使用ContextListener不是JAX-RS的方式做this--的ContextListener是“下一层”,因为它是在servlet API。

你可以把注释声明在构造函数中的参数,它会被传递给构造:

public Servlet(@Context ServletContext context) { 

使用的数据成员@Context注释初始化的对象后,成员构成,为你发现。

另一种方法是将Config对象的初始化移动到某种init调用中,并且只在需要时进行初始化,即延迟初始化。然后ServletContext数据成员将已经由Jersey框架设置。

祝你好运!

柯克

+0

如果多个方法需要接收相同的数据,则可以将其声明为类的属性...它会自动注入,并且更容易。不需要在构造函数中传递它! – 2013-12-16 06:07:44