2010-05-31 4 views
7

Я как бы новичок в веб-разработке с Java. Я разрабатываю веб-сервис, и я выбрал REST/Jersey для этого.Джерси/ServletContext и загрузка ресурсов при запуске

Я хочу, чтобы начать некоторые вещи при запуске службы и сохранить их всю жизнь службы.

Первый вопрос: Является ли конструктор Джерси Сервлет - хорошее место для этого?

В принципе, я хочу загрузить файл config.ini, расположенный в моем каталоге WEB-INF. После this help, я понимаю, мне нужен ServletContext для загрузки моего файла в качестве ресурса.

Однако, мне не понятно, как получить этот ServletContext в Джерси 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, я думаю, что нужно делать было бы создать ContextListener.

Слушатель контекста - это класс, реализующий интерфейс javax.servlet.ServletContextListener и настроенный в вашем web.xml. Он имеет метод, который выполняется, когда приложение сначала помещается в ваш контейнер, а другое, которое выполняется, когда приложение остановлено, поэтому это идеальное место для размещения некоторых одноразовых файлов инициализации и очистки вещей до приложение остановлено.

Так шаги:

  1. создать класс прослушивателя, реализовать метод contextInitialized (ServletContextEvent SCE). В этом методе вы получаете ServeltContextEvent, у которого есть метод getServletContext(), который дает вам доступ к ServletContext.
  2. Настройки Слушателей в вашем web.xml

Вы найдете дополнительную информацию здесь: tutorial

Или на Солнца, гм, сайте Oracle.

Кстати, если ваш файл будет в JAR-файле, я не уверен, что метод ServletContext - лучший способ его загрузить.Я думаю, что вы лучше с somethinbg как:

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

привет, спасибо за помощь. Это кажется более ясным таким образом, и это работает! –

+0

Не уверен, что вы делали, так как это не работает: Джерси ест его, а код, как написано в учебнике, никогда не вызывается под сервлетом ReST. –

8

Использование ContextListener не JAX-RS способ сделать this-- в ContextListener является «следующий слой вниз,» как это было, в API сервлета.

Вы можете поместить аннотированный декларацию в параметрах конструктора и он будет передан в конструктор:

public Servlet(@Context ServletContext context) { 

Использование @Context аннотацию для элемента данных инициализирует этот член после того, как объект построен, как вы обнаружено.

Другой способ сделать это - перенести инициализацию объекта Config в какой-то вызов init и только инициализировать его, когда это необходимо, то есть ленивая инициализация. Затем член данных ServletContext будет уже установлен каркасом Джерси.

Удачи!

Kirk

+0

Вы можете объявить это как свойство класса в случае, если несколько методов должны получать одинаковые ... Он вводится автоматически, и это проще. Не нужно передавать его в конструкторе! –

Смежные вопросы