2013-07-17 3 views
1

я на самом деле есть программка с сервлета:Servlet INIT и класс

@WebServlet("/Controler") 
public class Controler extends HttpServlet { 

} 

мне нужно использовать свойство файла: file.properties в моей программе. Для того, чтобы загрузить его, у меня есть класс:

public class PropLoader { 

    private final static String m_propertyFileName = "file.properties"; 

    public static String getProperty(String a_key){ 

     String l_value = ""; 

     Properties l_properties = new Properties(); 
     FileInputStream l_input; 
     try { 

      l_input = new FileInputStream(m_propertyFileName); // File not found exception 
      l_properties.load(l_input); 

      l_value = l_properties.getProperty(a_key); 

      l_input.close(); 
     } catch (Exception e) { 
      e.printStackTrace(); 
     } 

     return l_value; 

    } 

} 

Мой файл свойств находится в папке WebContent, и я могу получить к нему доступ:

String path = getServletContext().getRealPath("/file.properties"); 

Но я не могу назвать тезисы методы в другом классе чем сервлет ...

Как получить доступ к моему файлу свойств в классе PropLoader?

+0

Ну, одним из вариантов является добавление пути в качестве статической переменной в класс PropLoader (вид одноэлементного). Я видел случаи, когда какой-то главный сервлет делает эти шаги в методе init(), поэтому у вас будет доступ к вашему пути на всем приложении. Вы просто должны быть уверены, что сервлет, с которым вы имеете дело, загрузится при запуске приложения. – Martin

+0

Я пробовал это решение, но сервлет не может создать путь в классе propLoader, я думаю, что это связано с методом сервлетов init() – Apaachee

ответ

2

Если вы хотите, чтобы прочитать файл внутри структуры WebAPP, то вы должны использовать ServletContext.getResourceAsStream(). И, конечно, поскольку вы загружаете его из webapp, вам нужна ссылка на объект, представляющий webapp: ServletContext. Вы можете получить такую ​​ссылку на переопределении init() сервлета, вызывая getServletConfig().getServletContext(), и передать контекст сервлета для загрузки методы файла:

@WebServlet("/Controler") 
public class Controler extends HttpServlet { 
    private Properties properties; 

    @Override 
    public void init() { 
     properties = PropLoader.load(getServletConfig().getServletContext()); 
    } 
} 

public class PropLoader { 

    private final static String FILE_PATH = "/file.properties"; 

    public static Properties load(ServletContext context) { 
     Properties properties = new Properties(); 
     properties.load(context.getResourceAsStream(FILE_PATH)); 
     return properties; 
    } 
}  

Обратите внимание, что некоторые исключения должны быть обработаны.

Другим решением было бы разместить файл под WEB-INF/classes в развернутом webapp и использовать ClassLoader для загрузки файла: getClass().getResourceAsStream("/file.properties"). Таким образом, вам не нужна ссылка на ServletContext.

+0

Hi JB Nizet! Для вашего второго решения я копирую/вставляю результат, который я рассказал Icestari: Мой файл свойств находится в корневой папке Eclipse WebContent и 'in == null' с:' InputStream in = Controler.class.getClassLoader(). getResourceAsStream (m_propertyFileName); «Тогда я не уверен, чтобы понять ваше первое решение. – Apaachee

+0

Вот почему в моем ответе вам сообщается, что для того, чтобы это решение работало, файл должен находиться под WEB-INF/classes. Я отредактирую свой ответ, чтобы сделать первую часть более четкой. –

+0

Тот же результат с моим файлом свойств в: 'WEB-INF/classes/file.properties' или' WEB-INF/file.properties', getResourceAsStream() возвращает null. – Apaachee

1

Я бы порекомендовал использовать метод getResourceAsStream (пример ниже). Для этого потребуется, чтобы файл свойств находился в пути пути WAR.

InputStream in = YourServlet.class.getClassLoader().getResourceAsStream(path_and_name); 

С уважением Луан

+0

Спасибо за ваш ответ Icestari! Мой файл свойств находится в корневой папке Eclipse WebContent и 'in == null' с:' InputStream in = Controler.class.getClassLoader(). GetResourceAsStream (m_propertyFileName); ' – Apaachee

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