Как загрузить файл .properties в jsp

Я дошел до этого:

private Properties logoUrls = new Properties();
logoUrls.load(new FileInputStream("channelLogos.properties"));

где channelLogos.properties находится в том же каталоге, что и мой JSP. Я получаю исключение FileNotFound. Где мое приложение на самом деле думает, что я имею в виду «channelLogos.properties», если не тот же каталог, что и JSP? Как определить правильный путь для загрузки файла свойств?


person morgancodes    schedule 16.07.2009    source источник
comment
связанные stackoverflow.com/questions/ 3920088/   -  person Adrien Be    schedule 29.11.2013


Ответы (6)


Это сделает работу:

<%@page import="java.io.InputStream" %>
<%@page import="java.util.Properties" %>

<%
    InputStream stream = application.getResourceAsStream("/some.properties");
    Properties props = new Properties();
    props.load(stream);
%>

В любом случае, я действительно думаю, что вы должны иметь файл свойств в classpath и использовать сервлет

person victor hugo    schedule 16.07.2009
comment
Да, это был бы правильный способ сделать это. Я, по общему признанию, делаю это быстро, безобразно, грязно, плохо. - person morgancodes; 17.07.2009
comment
Да, я знаю, хе-хе... Я только что ответил на ваш вопрос ;) - person victor hugo; 17.07.2009
comment
К вашему сведению, есть application.getResourceAsStream(...), который сэкономит вам несколько строк кода. - person Jack Leow; 17.07.2009

Я бы настоятельно рекомендовал прочитать о Сервлеты модели 2. Я рекомендую его всем, кто все еще работает с сервлетами Model 1, то есть выполняет «настоящую работу» в JSP.

Что касается вашего вопроса: сначала добавьте файл свойств в свой путь к классам, затем прочитайте файл с помощью getResourceAsSttream:

Thread.currentThread().getContextClassLoader().getResourceAsStream("channelLogos.properties");

Конечно, вариантов много, и каждый найдет свой любимый.

person Don Branson    schedule 16.07.2009
comment
Я полностью согласен с тем, что в правиле jsp нельзя делать реальных вещей, но я нарушаю его в этом случае. - person morgancodes; 17.07.2009
comment
@morgancodes: Я полностью согласен время от времени нарушать собственные правила. ;) - person Don Branson; 17.07.2009

Когда вы говорите «тот же каталог, что и JSP», что именно вы имеете в виду? Что ваш JSP находится где-то, скажем, в /mywebapp/somefolder/my.jsp, где mywebapp является корнем вашего приложения, а ваш файл свойств - /mywebapp/somefolder/channelLogos.properties?

Если это так, то, скорее всего, они НЕ находятся в одном каталоге. JSP был скомпилирован, и его фактическое расположение может варьироваться в зависимости от контейнера сервлета. Лучше всего использовать ServletContext.getRealPath(), как предлагает pkaeding, с путем к файлу свойств относительно контекста веб-приложения в качестве аргумента. Используя приведенный выше пример:

private Properties logoUrls = new Properties();
logoUrls.load(new FileInputStream(servletContext.getRealPath("/somefolder/channelLogos.properties")));

Тем не менее, имейте в виду, что если вы настаиваете на размещении своих свойств в той же папке, что и JSP, вы должны позаботиться о том, чтобы ограничить их общедоступность (если это не намерение).

person ChssPly76    schedule 16.07.2009
comment
Спасибо. Это работает. Однако я планировал сделать все это внутри jspInit, у которого нет простого доступа к servletContext. Возможно, подход classpath действительно лучше. - person morgancodes; 17.07.2009
comment
getServletConfig().getServletContext() даст вам servletContext из метода jspInit. Тем не менее, подход classpath полностью лучше, а MVC еще лучше :-) Я предоставил этот ответ только потому, что вы настаивали на том, что хотите сделать это только в JSP. - person ChssPly76; 17.07.2009

Взгляните на ServletContext.getRealPath(). Это должно дать вам полный путь к файлу свойств.

person pkaeding    schedule 16.07.2009
comment
Приятно знать об этом. Спасибо! Используя этот метод, он показывает мне, что мой путь к моему файлу свойств кажется правильным, но я все равно получаю исключение файла не найдено. Любые идеи? - person morgancodes; 17.07.2009

JSP работает в контейнере сервлетов, поэтому его текущий рабочий каталог определяется контейнером. Обычно это каталог, в котором установлен контейнер, или его каталог bin. В любом случае это не то место, где вы хотите хранить свой файл пользовательских свойств.

Есть 2 типичных подхода к тому, что вам нужно.

Первый подход хорош, если ваш файл является частью вашего приложения и вы никогда не меняете его при развертывании. В этом случае прочитайте его из ресурсов:

props.load(getClass().getResourceAsStream())

или даже лучше

props.load(Thread.currentThread().getContextClassLoader().getResourceAsStream())

*

Второй подход хорош, если вы хотите изменить файл свойств в среде развертывания.

*. В этом случае поместите его где-нибудь в файловой системе за пределами вашего контейнера. Например, /opt/mycompany/conf/myproperties.properties в Linux или в любом другом месте, которое вам нравится. Теперь вы должны использовать абсолютный путь при создании FileInputStream.

Чтобы сделать систему более конфигурируемой, вы не должны указывать путь к файлу конфигурации внутри кода. Лучший подход - передать его приложению, используя системные свойства, например. добавьте параметр, например -Dmycompany.conf=/opt/mycompany/myprops.properties, когда вы запускаете свой сервер приложений. Если вы хотите прочитать файл, сделайте следующее:

новый FileInputStream(System.getProperties("mycompany.conf"))

Теперь конфигурация вашей системы может независимо контролироваться развертывателем.

person VAYU    schedule 08.08.2018

В файле свойств свойства перечислены ниже:

     label.esme.interface.dependenciesDelete = "Dependencies present. Cannot delete."

Если вы используете инфраструктуру Struts, она может присутствовать в struts-config.xml, например:

    <message-resources parameter="pathToApplcnRsrc"/>

или struts.properties, например:

    struts.custom.i18n.resources = ApplicationResource

Используйте свойство из файла свойств, как показано ниже в JSP:

    '<s:text name="label.esme.interface.dependenciesDelete" />'
person Nancy    schedule 04.02.2020