Чтение файла свойств в веб-приложении Java

В настоящее время я использую ServletContextListener для установки путей JSP в веб-приложении. Пути хранятся как параметры контекста в web.xml и извлекаются слушателем:

    @Override
    public void contextInitialized(ServletContextEvent sce) {        
        ServletContext sc = sce.getServletContext();                           
        sc.setAttribute("urlOfThisPage", sc.getInitParameter("urlOfThisPage"));   
        sc.setAttribute("urlOfThatPage", sc.getInitParameter("urlOfThatPage"));    

В сервлетах приложения путь к конкретному JSP можно легко получить из ServletContext.

Мой вопрос относится к обработке файла свойств таким же образом. Я много читал об этом на других страницах StackOverflow, таких как 2161045.

Правильно ли я предполагаю, что файл свойств должен быть прочитан прослушивателем и сохранен в ServletContext с использованием объекта Property? но тогда, если это так, как мне получить конкретное свойство из файла свойств?

На данный момент я использую такой код в своих сервлетах, чтобы получить значение атрибута из ServletContext.

String url = (String) sc.getAttribute("urlOfThisPage");  // Use ServletContext to get JSP's URL.    

Но я не уверен, как расширить это до доступа к файлу свойств.

Я пробовал следующее в ServletContextListener:

    Properties properties = new Properties();
    properties.setProperty("name", "Akechi Jinsai");
    sc.setAttribute("properties", properties);

И в сервлете, используя код:

   ServletContext sc = request.getSession().getServletContext();        
   Properties properties = (Properties) sc.getAttribute("properties");
   System.out.println("Here: " + properties.getProperty("name"));

Отображается «Здесь: Акэти Дзинсай», но есть ли лучший способ получить одно свойство в сервлете, не просматривая вещи таким образом?


person Mr Morgan    schedule 30.05.2014    source источник
comment
Правильно ли я предполагаю, что файл свойств должен быть прочитан слушателем - нет.   -  person Nir Alfasi    schedule 31.05.2014
comment
Тогда где в веб-приложении будет лучшее место для чтения файла свойств и его сохранения?   -  person Mr Morgan    schedule 31.05.2014
comment
Файл свойств должен быть прочитан во время запуска и сохранен в памяти. Например, он может храниться в служебном классе (может быть синглтоном) как статическое поле.   -  person Nir Alfasi    schedule 31.05.2014
comment
Или через метод инициализации сервлета, я полагаю?   -  person Mr Morgan    schedule 31.05.2014
comment
Вы можете использовать как getServletContext().getResourceAsStream(...) (если файл находится в пути к классам), так и использовать абсолютный путь, но я не вижу никакой связи с этим фактом, когда слушатель должен читать файл свойств. Слушатель прослушивает события и запускает обратные вызовы при возникновении этих событий - он не имеет ничего общего с загрузкой файла свойств.   -  person Nir Alfasi    schedule 31.05.2014
comment
Правда, нет абсолютной необходимости использовать прослушиватель, но я думаю об использовании прослушивателя правильного типа, то есть ServletContextListener, для установки свойств при запуске ServletContext. Или вызвать класс, который может это сделать. Я пересмотрел вопрос, чтобы показать это.   -  person Mr Morgan    schedule 31.05.2014


Ответы (1)


Просто загрузите файл свойств в Servlet и переместите значения в HashMap и сохраните его как атрибут приложения. Теперь откройте его в JSP, используя Стандартную библиотеку тегов страниц JavaServer.

Узнайте больше о Загрузить файл свойств в Servlet/JSP.


Образец кода:

JSP: (Разные способы доступа к карте)

<c:forEach items="${map}" var="entry">
    Key="${entry.key}" Value=${entry.value}
</c:forEach>

URL Of This Page = ${map.urlOfThisPage }
URL Of That Page = ${map.urlOfThatPage }


URL Of This Page = ${map['urlOfThisPage'] }
URL Of That Page = ${map['urlOfThatPage'] }

ServletContextListener

public class MyServletContextListener implements ServletContextListener {

    @Override
    public void contextDestroyed(ServletContextEvent sc) {

    }

    @Override
    public void contextInitialized(ServletContextEvent sce) {
        ServletContext sc = sce.getServletContext();
        // load the properties file if needed
        // read the path from web.xml as init parameter 

        Map<String, String> map = new HashMap<String, String>();
        map.put("urlOfThisPage", sc.getInitParameter("urlOfThisPage"));
        map.put("urlOfThatPage", sc.getInitParameter("urlOfThatPage"));

        sc.setAttribute("map", map);
    }

}

веб.xml:

<context-param>
    <param-name>urlOfThisPage</param-name>
    <param-value>url</param-value>
</context-param>
<context-param>
    <param-name>urlOfThatPage</param-name>
    <param-value>url</param-value>
</context-param>

<listener>
    <listener-class>com.x.y.z.MyServletContextListener</listener-class>
</listener>
person Braj    schedule 30.05.2014
comment
Я бы использовал объект свойств вместо карты, но основной принцип тот же. - person Mr Morgan; 31.05.2014
comment
Свойства расширяет Hashtable. Да, основная концепция та же. - person Braj; 31.05.2014
comment
Во всяком случае, это соответствует тому, что я хочу. - person Mr Morgan; 31.05.2014
comment
Должен ли я кодировать для вас, используя файл свойств, или вы можете сделать это, просто используя Hashtable вместо HashMap в моем коде. - person Braj; 31.05.2014
comment
Если я прав, все, что мне нужно сделать, это загрузить свойства, используя что-то вроде properties.load(getServletContext().getResourceAsStream("/WEB-INF/properties/sample.properties")). Я предполагаю, что после этого свойства будут загружены в атрибут в ServletContext, а затем в сервлете будет выполняться поиск определенного свойства, как показано в моем примере кода выше в вопросе? Или есть лучший способ получить свойство в сервлете? - person Mr Morgan; 31.05.2014
comment
Сначала прочитайте путь из web.xml, как я предложил, а не жестко кодируйте его в самом классе слушателя. - person Braj; 31.05.2014
comment
Конечно, я просто скопировал код с другой страницы. - person Mr Morgan; 31.05.2014
comment
Это нормально, а как насчет JSP? Как получить доступ к свойству на странице JSP? - person Braj; 31.05.2014
comment
Я пытаюсь избежать использования каких-либо свойств в JSP. Все пути к JSP в любом случае хранятся в web.xml, читаются прослушивателем и сохраняются в атрибутах ServletContext. Вот почему я решил использовать атрибут в ServletContext для свойств. Пути JSP также могут стать свойствами. Но является ли сохранение свойств как атрибута в ServletContext лучшим способом ведения дел? - person Mr Morgan; 31.05.2014
comment
Вы можете просто создать статический член типа Properties в самом классе ServletContextListner и получить к нему статический доступ. В контекст вообще не надо вдаваться. - person Braj; 31.05.2014
comment
Статический экземпляр свойства? Хорошая идея. Никогда об этом не думал. - person Mr Morgan; 31.05.2014
comment
Он всегда будет доступен приложению, поскольку он инициализируется при запуске приложения. - person Braj; 31.05.2014
comment
да. и читаются только один раз при запуске. Мне нравится!-) Большое спасибо, Брай. - person Mr Morgan; 31.05.2014
comment
Работает очень хорошо. Еще раз спасибо Брадж. - person Mr Morgan; 01.06.2014