JPA/Hibernate и PostgreSQL: примеры настройки
Перед тем, как соединяться из Hibernate с PostgreSQL, не забудьте создать пользователя, базу данных и предоставить пользователю права на неё:
CREATE ROLE test WITH PASSWORD ‘test’; ALTER ROLE test WITH LOGIN; CREATE DATABASE test OWNER test;
CREATE ROLE test WITH PASSWORD ‘test’; ALTER ROLE test WITH LOGIN; CREATE DATABASE test OWNER test; |
Команды выше создают пользователя test с паролем test, создают базу данных test и назначают пользователя владельцем базы. В условиях реального приложения, разумеется, следует выбрать пароль посложнее.
Перед тем, как использовать PostgreSQL, необходимо добавить его JDBC драйвер в зависимости maven:
<properties> <postgresql.version>9.4.1212.jre7</postgresql.version> </properties> <dependencies> <dependency> <groupId>org.postgresql</groupId> <artifactId>postgresql</artifactId> <version>${postgresql.version}</version> </dependency> </dependencies>
<properties> <postgresql.version>9.4.1212.jre7</postgresql.version> </properties>
<dependencies> <dependency> <groupId>org.postgresql</groupId> <artifactId>postgresql</artifactId> <version>${postgresql.version}</version> </dependency> </dependencies> |
С драйвером PostgreSQL в classpath можно настраивать Hibernate как JPA провайдер. Напоминаю, что все настройки JPA находятся в файле META-INF/persistence.xml
<persistence xmlns=»http://java.sun.com/xml/ns/persistence» xmlns:xsi=»http://www.w3.org/2001/XMLSchema-instance» xsi:schemaLocation=»http://java.sun.com/xml/ns/persistence http://java.sun.com/xml/ns/persistence/persistence_2_0.xsd» version=»2.0″> <persistence-unit name=»ru.easyjava.data.jpa.hibernate»> <properties> <property name=»hibernate.hbm2ddl.auto» value=»update»/> <property name=»hibernate.connection.url» value=»jdbc:postgresql://127.0.0.1:5432/test»/> <property name=»hibernate.connection.username» value=»test»/> <property name=»hibernate.connection.password» value=»test»/> <property name=»hibernate.dialect» value=»org.hibernate.dialect.PostgreSQL94Dialect»/> </properties> </persistence-unit> </persistence>
<persistence xmlns=»http://java.sun.com/xml/ns/persistence» xmlns:xsi=»http://www.w3.org/2001/XMLSchema-instance» xsi:schemaLocation=»http://java.sun.com/xml/ns/persistence http://java.sun.com/xml/ns/persistence/persistence_2_0.xsd» version=»2.0″> <persistence-unit name=»ru.easyjava.data.jpa.hibernate»> <properties> <property name=»hibernate.hbm2ddl.auto» value=»update»/> <property name=»hibernate.connection.url» value=»jdbc:postgresql://127.0.0.1:5432/test»/> <property name=»hibernate.connection.username» value=»test»/> <property name=»hibernate.connection.password» value=»test»/> <property name=»hibernate.dialect» value=»org.hibernate.dialect.PostgreSQL94Dialect»/> </properties> </persistence-unit> </persistence> |
JDBC url у PostgreSQL имеет следующий формат: jdbc:postgresql://хост:порт/имябазы, например jdbc:postgresql://127.0.0.1:5432/test. Имя пользователя и пароль передаются отдельными параметрами. Наконец, надо не забыть переключить диалект Hibernate на PostgreSQL, что делается в последней строке.
Однако, как мы знаем, одно соединение не очень удобно использовать в реальном приложении. Поэтомунастроим пул c3p0 для совместного использования сJPA/Hibernate и PostgreSQL.
Для этого, кроме PostgreSQL JDBC драйвера, надо добавить непосредственно c3p0 и библиотеку hibernate-cp30 к зависимостям maven:
<properties> <hibernate.version>5.2.1.Final</hibernate.version> <c3p0.version>0.9.5.2</c3p0.version> </properties> <dependencies> <dependency> <groupId>com.mchange</groupId> <artifactId>c3p0</artifactId> <version>${c3p0.version}</version> </dependency> <dependency> <groupId>org.hibernate</groupId> <artifactId>hibernate-c3p0</artifactId> <version>${hibernate.version}</version> </dependency> </dependencies>
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 | <properties> <hibernate.version>5.2.1.Final</hibernate.version> <c3p0.version>0.9.5.2</c3p0.version> </properties>
<dependencies> <dependency> <groupId>com.mchange</groupId> <artifactId>c3p0</artifactId> <version>${c3p0.version}</version> </dependency>
<dependency> <groupId>org.hibernate</groupId> <artifactId>hibernate-c3p0</artifactId> <version>${hibernate.version}</version> </dependency> </dependencies> |
Для включения c3p0 достаточно добавить по меньшей мере один параметр c3p0 к настройкам Hibernate:
<persistence xmlns=»http://java.sun.com/xml/ns/persistence» xmlns:xsi=»http://www.w3.org/2001/XMLSchema-instance» xsi:schemaLocation=»http://java.sun.com/xml/ns/persistence http://java.sun.com/xml/ns/persistence/persistence_2_0.xsd» version=»2.0″> <persistence-unit name=»ru.easyjava.data.jpa.hibernate»> <properties> <property name=»hibernate.hbm2ddl.auto» value=»update»/> <property name=»hibernate.connection.url» value=»jdbc:postgresql://127.0.0.1:5432/test»/> <property name=»hibernate.connection.username» value=»test»/> <property name=»hibernate.connection.password» value=»test»/> <property name=»hibernate.dialect» value=»org.hibernate.dialect.PostgreSQL94Dialect»/> <property name=»hibernate.c3p0.min_size» value=»5″/> </properties> </persistence-unit> </persistence>
<persistence xmlns=»http://java.sun.com/xml/ns/persistence» xmlns:xsi=»http://www.w3.org/2001/XMLSchema-instance» xsi:schemaLocation=»http://java.sun.com/xml/ns/persistence http://java.sun.com/xml/ns/persistence/persistence_2_0.xsd» version=»2.0″> <persistence-unit name=»ru.easyjava.data.jpa.hibernate»> <properties> <property name=»hibernate.hbm2ddl.auto» value=»update»/> <property name=»hibernate.connection.url» value=»jdbc:postgresql://127.0.0.1:5432/test»/> <property name=»hibernate.connection.username» value=»test»/> <property name=»hibernate.connection.password» value=»test»/> <property name=»hibernate.dialect» value=»org.hibernate.dialect.PostgreSQL94Dialect»/> <property name=»hibernate.c3p0.min_size» value=»5″/> </properties> </persistence-unit> </persistence> |
Остальные параметры остаются такими же, как и для PostgreSQL без c3p0.
К сожалению, в Hibernate нет настолько высококачественной поддержки HikariCP, аналогичной c3p0. Поэтому настройка HikariCP требует чуть чуть больше работы.
В первую очередь, конечно же, надо добавить ещё и артефакт HikariCP в зависимости (не забываем про PostgeSQL JDBC драйвер):
<properties> <hikaricp.version>2.4.3</hikaricp.version> </properties> <dependencies> <dependency> <groupId>com.zaxxer</groupId> <artifactId>HikariCP</artifactId> <version>${hikaricp.version}</version> </dependency> </dependencies>
<properties> <hikaricp.version>2.4.3</hikaricp.version> </properties>
<dependencies> <dependency> <groupId>com.zaxxer</groupId> <artifactId>HikariCP</artifactId> <version>${hikaricp.version}</version> </dependency> </dependencies> |
Потом необходимо изменить конфигурацию JPA/Hibernate для работы с HikariCP:
<persistence xmlns=»http://java.sun.com/xml/ns/persistence» xmlns:xsi=»http://www.w3.org/2001/XMLSchema-instance» xsi:schemaLocation=»http://java.sun.com/xml/ns/persistence http://java.sun.com/xml/ns/persistence/persistence_2_0.xsd» version=»2.0″> <persistence-unit name=»ru.easyjava.data.jpa.hibernate»> <properties> <property name=»hibernate.hbm2ddl.auto» value=»update»/> <property name=»hibernate.connection.provider_class» value=»com.zaxxer.hikari.hibernate.HikariConnectionProvider»/> <property name=»hibernate.hikari.dataSourceClassName» value=»org.postgresql.ds.PGSimpleDataSource»/> <property name=»hibernate.hikari.dataSource.url» value=»jdbc:postgresql://127.0.0.1:5432/test»/> <property name=»hibernate.hikari.username» value=»test»/> <property name=»hibernate.hikari.password» value=»test»/> <property name=»hibernate.dialect» value=»org.hibernate.dialect.PostgreSQL94Dialect»/> </properties> </persistence-unit> </persistence>
<persistence xmlns=»http://java.sun.com/xml/ns/persistence» xmlns:xsi=»http://www.w3.org/2001/XMLSchema-instance» xsi:schemaLocation=»http://java.sun.com/xml/ns/persistence http://java.sun.com/xml/ns/persistence/persistence_2_0.xsd» version=»2.0″> <persistence-unit name=»ru.easyjava.data.jpa.hibernate»> <properties> <property name=»hibernate.hbm2ddl.auto» value=»update»/> <property name=»hibernate.connection.provider_class» value=»com.zaxxer.hikari.hibernate.HikariConnectionProvider»/> <property name=»hibernate.hikari.dataSourceClassName» value=»org.postgresql.ds.PGSimpleDataSource»/> <property name=»hibernate.hikari.dataSource.url» value=»jdbc:postgresql://127.0.0.1:5432/test»/> <property name=»hibernate.hikari.username» value=»test»/> <property name=»hibernate.hikari.password» value=»test»/> <property name=»hibernate.dialect» value=»org.hibernate.dialect.PostgreSQL94Dialect»/> </properties> </persistence-unit> </persistence> |
Все настройки соединения с PostgreSQL переименовываются и к ним добавляется два дополнительных параметра. Вначале в Hibernate настраивается использование HikariCP, затем указывается какой класс использовать для соединения с PostgreSQL.
Spring .properties файл: получить элемент как массив
I’m loading properties attributes from a .properties
file using Spring as follows:
file: elements.properties
base.module.elementToSearch=1
base.module.elementToSearch=2
base.module.elementToSearch=3
base.module.elementToSearch=4
base.module.elementToSearch=5
base.module.elementToSearch=6
The spring xml file
file: myapplication.xml
<bean
>
<property name="property" value="#{base.module.elementToSearch}" />
</bean>
And my Class.java
file: Class.java
public void setProperty(final List<Integer> elements){
this.elements = elements;
}
But when debugging, the parameter elements only get the last element into the list, so, there is a list of one element with value «6», instead of a list with 6 elements.
I tried other approaches, like adding in value only #{base.module}
but then it finds no parameter in the properties file.
A workaround is to have in elements.properties file a list separated by commas, like:
base.module.elementToSearch=1,2,3,4,5,6
and use it as a String and parse it, but is there a better solution?
я загружаю свойства атрибутов из .properties
файла, используя Spring следующим образом:
file: elements.properties
base.module.elementToSearch=1
base.module.elementToSearch=2
base.module.elementToSearch=3
base.module.elementToSearch=4
base.module.elementToSearch=5
base.module.elementToSearch=6
весна XML файл
file: myapplication.xml
<bean
>
<property name="property" value="#{base.module.elementToSearch}" />
</bean>
И мой класс. java
file: Class.java
public void setProperty(final List<Integer> elements){
this.elements = elements;
}
Но при отладке элементы параметров получают только последний элемент в списке, s o, есть список одного элемента со значением «6», а не список из 6 элементов.
Я пробовал другие подходы, такие как добавление только значения #{base.module}
, но затем он не обнаружил никаких параметров в файле свойств.
Обойти это иметь в elements.properties файл списка разделенных запятыми, например:
base.module.elementToSearch=1,2,3,4,5,6
и использовать его в виде строки и разобрать его, но есть лучшее решение?
java spring placeholder properties-file60k
Структура проекта плагина | 1C:Enterprise Development Tools Plugin Developer Guide
Откройте панель Package Explorer. Проект демонстрационного плагина имеет следующую структуру.
.
├── README.md README
├── checkstyle.xml Правила проверки кодстайла // https://checkstyle.sourceforge.io/
├── LICENSE Файл с лицензией
├── pom.xml Корневой POM-файл
├── bom
| └── pom.xml Родительский POM-файл с описанием плагинов и их версий
├── bundles
├── org.example Плагин с расширением валидации модуля
...
└── org.example.ui Плагин с примером конструктор движений
| ├── .settings/ Настройки Eclipse плагина
| ├── META-INF Дескриптор OSGi-модуля
| ├── src/org/example/ui/ Java код плагина
| ├── resources Дополнительные файлы для плагина
| ├── .project Дескриптор проекта Eclipse
| ├── .classpath Настройки компиляции
| ├── build.properties Настройки компиляции
| ├── plugin.properties Локализация плагина
| ├── plugin.xml Дескриптор плагина
| └── pom.xml POM-файл плагина
└── pom.xml Корневой POM-файл плагинов
├── features
├── org.example.feature Eclipse фича с плагином
| └── feature.xml Дескриптор фичи
└── org.example.sdk.feature Eclipse фича с плагином + исходники плагина
├── repositories
├── org.example.repository P2 репозиторий с плагином
└── org.example.repository.sdk SDK P2 репозиторий с плагином
└── targets
└── default
└── default.target Файл описания целевой платформы для Eclipse
└── tests
├── org.example.itests Интеграционные тесты плагина
| ├── .settings/ Настройки Eclipse плагина
| ├── META-INF Дескриптор OSGi-модуля
| ├── src/org/example/itests/ Java код интеграционных тестов
| ├── workspace Папка с проектами для тестов
| └── test Тестовый проект с конфигурацией
| ├── .project Дескриптор проекта Eclipse
| ├── .classpath Настройки компиляции
| ├── build.properties Настройки компиляции
| ├── plugin.properties Локализация плагина
| ├── plugin.xml Дескриптор плагина
| └── pom.xml POM-файл плагина
└── pom.xml Корневой POM-файл тестов
Создание приложения Swing Maven с использованием Hibernate
Поскольку POJO представляет собой простой класс Java, вы можете использовать мастер создания классов Java, чтобы создать класс, а затем изменить класс в редакторе исходного кода, чтобы добавить необходимые поля и методы получения и установки. После создания объекта POJO мастер также можно использовать для создания файла сопоставления библиотеки Hibernate, обеспечивающего сопоставления класса с таблицей, и добавления информации о сопоставлении в файл hibernate.cfg.xml
. При создании файла сопоставления «с нуля» необходимо сопоставить поля и столбцы в редакторе XML.
Примечание. Это упражнение является необязательным и описывает создание POJO и файла сопоставления, созданных с помощью файлов сопоставления библиотеки Hibernate и POJO из мастера баз данных.
Щелкните правой кнопкой мыши узел «Source Packages» в окне «Projects» и выберите «New > Java Class» для открытия мастера создания класса Java.
В мастере введите Actor в качестве имени класса и sakila.entity в качестве имени пакета. Нажмите кнопку «Завершить».
Внесите в класс следующие изменения (выделены полужирным шрифтом) для реализации интерфейса «Serializable» и добавьте поля для столбцов таблицы.
public class Actor *implements Serializable* {
*private Short actorId;
private String firstName;
private String lastName;
private Date lastUpdate;*
}
Создайте методы получения и установки для полей, поместив курсор вставки в редактор исходного кода и введя Alt-Insert, а затем выбрав Getter и Setter.
В диалоговом окне «Generate Getters and Setters» выберите все поля и нажмите кнопку «Generate».
Figure 17. Диалоговое окно ‘Создание методов получения и установки’
В диалоговом окне «Generate Getters and Setters» можно использовать стрелку вверх на клавиатуре для перемещения выбранного элемента к узлу «Actor», а затем нажать клавишу «пробел» и выбрать все поля «Actor».
Исправьте операторы импорта и сохраните измененные данные.
После создания объекта POJO для таблицы необходимо создать файл сопоставления библиотеки Hibernate для класса Actor.java
.
Щелкните правой кнопкой мыши узел исходных файлов
sakila.entity
в окне «Projects» и выберите «New > Other» для открытия мастера создания файла «New File».Выберите «Файл сопоставления Hibernate» в категории «Hibernate». Нажмите кнопку «Далее».
Введите Actor.hbm в поле «Имя файла» и укажите в качестве папки src/sakila/entity. Нажмите кнопку «Далее».
Введите sakila.entity.Actor в поле «Класс для размещения».
Выберите actor из раскрывающегося списка «Таблица базы данных», если это значение не было выбрано ранее. Нажмите кнопку «Завершить».
Figure 18. Мастер создания файлов сопоставления Hibernate
После выбора ‘Готово’ файл сопоставления Hibernate Actor.hbm.xml
открывается в редакторе исходного кода. Также в среде IDE выполняется автоматическое добавление записи для ресурса сопоставления в hibernate.cfg.xml
. В целях просмотра подробных данных разверните узел «Mapping» в режиме проектирования hibernate.cfg.xml
или в режиме XML. Запись mapping
в обзоре XML будет выглядеть следующим образом:
<mapping resource="sakila/entity/Actor.hbm.xml"/>
</session-factory>
</hibernate-configuration>
Сопоставьте поля в
Actor.java
со столбцами в таблице «ACTOR» путем внесения следующих изменений (выделены полужирным шрифтом) вActor.hbm.xml
.
<hibernate-mapping>
<class name="sakila.entity.Actor" *table="actor">
<id name="actorId" type="java.lang.Short">
<column name="actor_id"/>
<generator/>
</id>
<property name="firstName" type="string">
<column length="45" name="first_name" not-null="true"/>
</property>
<property name="lastName" type="string">
<column length="45" name="last_name" not-null="true"/>
</property>
<property name="lastUpdate" type="timestamp">
<column length="19" name="last_update" not-null="true"/>
</property>
</class>*
</hibernate-mapping>
Для заполнения значений при изменении файла сопоставления можно использовать функцию автозавершения кода.
Примечание. По умолчанию у созданного элемента class
имеется закрывающий тег. Поскольку элементы свойства необходимо добавить между открывающим и закрывающим тегами элемента class
, следует внести следующие изменения (выделены полужирным шрифтом). После внесения изменений можно использовать функцию автозавершения кода между тегами class
.
<hibernate-mapping>
<class name="sakila.entity.Actor" *table="actor">
</class>*
</hibernate-mapping>
Нажмите кнопку «Validate XML» на панели инструментов и сохраните изменения.
Создание объектов POJO и файлов сопоставления библиотеки Hibernate может эффективно использоваться для дальнейшей настройки приложения.
Настройка загрузки набора ресурсов при помощи класса ResourceBundle.Control
В советах от 17 июня 2005 года Beyond J2SE 5.0 и Collaborating With Sun on Mustang были приведены сведения по использованию Java SE 6. Данная платформа все еще находится на раннем этапе разработки, но существует возможность отсеживать новые тенденции и тестировать новые возможности. Одной из новых возможностей является расширенный контроль использования наборов ресурсов (окончательное включение данной возможности находится на рассмотрении в JCP).
Наборы ресурсов применяются для локализации приложений. Их использоание обсуждалось в совете от 14 декабря 2004 года Resource Bundle Loading. Основной функцией наборов ресурсов является сопоставление различных строк локализованным ресурсам, таким образом, что изображения и строки отображаются на различных языках.
Управление набором ресурсов производится классом ResourceBundle
, находящимся в пакете java.util package
. Основой процесса работы с набором ресурсов является получение набора при помощи метода getBundle()
класса ResourceBundle
. Ниже приводится пример использования данного метода:
import java.util.*;public class Test1 {
public static void main(String args[]) {
Locale locale = Locale.ENGLISH;
ResourceBundle myResources = ResourceBundle.getBundle("MyResources",
locale);
String string = myResources.getString("HelpKey");
System.out.println("HelpKey: " + string);
}
}
Программа Test1
получает набор под названием MyResources
. Затем она получает из набора ресурс HelpKey
и выводит значение данного ресурса.
Файл MyResources
может быть представлен либо в виде класса:
import java.util.*;public class MyResources extends ListResourceBundle {
public Object[][] getContents() {
return new Object[][] { { "OkKey", "OK" }, { "CancelKey", "Cancel" },
{ "HelpKey", "Help" }, { "YesKey", "Yes" }, { "NoKey", "No" }, };
}
}
либо в виде файла, именуемого MyResources.properties
, содержащего пары ключ-значение:
OkKey=OK
CancelKey=Cancel
HelpKey=Help
YesKey=Yes
NoKey=No
Что если вы хотите сохранять набор ресурсов в XML файле? Существует два способа загрузки файлов при помощи класса java.util.Properties
. Первый способ позволяет читать файлы вида key=value
, используя метод load()
. Второй способ дает возможность чтения свойств из XML файла при помощи метода loadFromXML()
. Благодаря наличию нового встроенного класса Control
в наборе классов ResourceBundle
, вы можете получать доступ к набору ресурсов, хранящемуся в виде XML файла.
Для дальнейшего тестирования вам необходимо загоусить последнюю версию Mustag с адреса Mustang project home page.
В классе ResourceBundle.Control
существует набор внешних методов, вызываемых методом ResourceBundle.getBundle()
во время поиска и загрузки наборов. Создав свой класс Control
, вы можете изменить поведение по-умолчанию для загрузки и кеширования.
В данном случае вам необходимо создать реализацию двух методов класса Control
: getFormats()
и newBundle()
. Метод getFormats()
отвечает за поддержку формата XML, а newBundle()
работает с набором ресурсов. В базовом классе Control
существуют вспомогательные методы, предназначенные для преобразования основных имен наборов в действительные имена ресурсов.
В данную реализацию класса ResourceBundle.Control
включен подкласс XMLResourceBundle
. Данный подкласс используется для загрузки данных из XML файла и использовании их в методе ResourceBundle
.
Ниже приводится описание класса Control
и реализация метода ResourceBundle
:
import java.io.*;
import java.net.*;
import java.util.*;public class XMLResourceBundleControl extends ResourceBundle.Control {
private static String XML = "xml";
public List getFormats(String baseName) {
return Collections.singletonList(XML);
}
public ResourceBundle newBundle(String baseName, Locale locale,
String format, ClassLoader loader, boolean reload)
throws IllegalAccessException, InstantiationException, IOException {
if ((baseName == null) || (locale == null) || (format == null)
|| (loader == null)) {
throw new NullPointerException();
}
ResourceBundle bundle = null;
if (format.equals(XML)) {
String bundleName = toBundleName(baseName, locale);
String resourceName = toResourceName(bundleName, format);
URL url = loader.getResource(resourceName);
if (url != null) {
URLConnection connection = url.openConnection();
if (connection != null) {
if (reload) {
connection.setUseCaches(false);
}
InputStream stream = connection.getInputStream();
if (stream != null) {
BufferedInputStream bis = new BufferedInputStream(
stream);
bundle = new XMLResourceBundle(bis);
bis.close();
}
}
}
}
return bundle;
}
private static class XMLResourceBundle extends ResourceBundle {
private Properties props; XMLResourceBundle
(InputStream stream) throws IOException {
props = new Properties();
props.loadFromXML(stream);
}
protected Object handleGetObject(String key) {
return props.getProperty(key);
}
public Enumeration getKeys() {
Set handleKeys = props.stringPropertyNames();
return Collections.enumeration(handleKeys);
}
}
public static void main(String args[]) {
ResourceBundle bundle = ResourceBundle.getBundle("Test2",
new XMLResourceBundleControl());
String string = bundle.getString("HelpKey");
System.out.println("HelpKey: " + string);
}
}
В данную реализацию включена тестовая программа из трех строчек:
ResourceBundle bundle = ResourceBundle.getBundle("Test2", new XMLResourceBundleControl());
String string = bundle.getString("HelpKey");
System.out.println("HelpKey: " + string);
Наибольший интерес здесь представляет первая строка. Вам необходимо передать ваш элемент Control
методу getBundle()
. После этого вы можете использовать набор, как и в любом другом случае.
Ниже преводится пример XML файла Test2.xml
:
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE properties SYSTEM "http://java.sun.com/dtd/properties.dtd"> <properties> <entry key="OkKey">OK</entry> <entry key="CancelKey">Cancel</entry> <entry key="HelpKey">Help</entry> <entry key="YesKey">Yes</entry> <entry key="NoKey">No</entry> </properties>
Результатом выполнения программы XMLResourceBundleControl
будет:
> java XMLResourceBundleControl HelpKey: Help
В приведенной реализации не используются методы getTimeToLive()
и needsReload()
:
public long getTimeToLive(String baseName, Locale locale)public boolean needsReload(String baseName,
Locale locale,
String format,
ClassLoader loader,
ResourceBundle bundle,
long loadTime)
Метод getTimeToLive()
возвращает время жизни для наборов ресурсов, созданных при помощи ResourceBundle.Control
. Наборы ресурсов сохраняются в кеше для убыстрения процесса повторной загрузки. Таким образом, при повторной загрузке набора, он будет находиться в кеше. Положительное значение времени жизни затает в милисекундах продолжительность сохранения набора в кеше без повторной проверки. По-умолчанию значением, возвращаемым методом getTimeToLive()
является TTL_NO_EXPIRATION_CONTROL
, отключающее проверку истечения времени хранения в кеше. Если вы не хотите кешировать набор, то верните значение TTL_DONT_CACHE
. Если возвращается значение 0, то набор кешируется, но при каждом вызове метода getBundle()
происходит его проверка. Для очистки кеша вызовите статичный метод clearCache()
класса ResourceBundle
. В нем есть не обязательный аргумент ClassLoader
, позволяющий очищать кеши, созданные определенным загрузчиком.
Метод needsReload()
определяет необходимость перезагрузки кешированного набора. Значение true
означает, что набор необходимо перезагрузить, а false
, что не его перезагружать не надо. Вы можете контролировать необходимость перезагрузки набора ресурсов при помощи перегрузки метода needsReload()
. Например, если вы хотите, чтобы набор ресурсов всегда перезагружался, метод needsReload()
должен всегда возвращать значние true
. В этом случае метод getTimeToLive()
должен возвращать всегда значение 0. Иначе набор будет сохраняться дольше, чем положено.
Для получения дополнительной информации об улучшениях, связанных с процессами интернационализации в Mustang, вы можете обратиться к блогу Джона Оконера, разработчика програмнного обеспечения фирмы Sun, по адресу Overview of Mustang’s internationalization features.
Java Properties — Справочный центр Smartling
Файл примера свойств Java:
#Global
selfservice.global.buttons.ok = Ok
selfservice.global.buttons.cancel = Отменить
selfservice.global.buttons.save = Сохранить
selfservice.global.buttons.saveChanges = Сохранить изменения
selfservice.global. buttons.close = Закройте
selfservice.global.buttons.edit = Отредактируйте
selfservice.global.buttons.enable = Включить
selfservice.global.buttons.disable = Отключить
selfservice.global.buttons.next = Далее
selfservice.global.buttons.continue = Продолжить
selfservice.global.buttons.back = Назад
selfservice.global.buttons. finish = Finish
selfservice.global.state.on = On
selfservice.global.state.off = Off
# Menus
selfservice.menu.settings.title = Настройки
selfservice.menu.settings.subtitle = Настройки
selfservice.menu.settings.languageSelector = Выбор языка
selfservice.menu.settings.siteOwnerInfo = Информация о владельце сайта
# Welcome
selfservice.intro = Здравствуйте {0}, добро пожаловать
Каждая строка создается с метаданными ключа / варианта на основе ключей в файле. Если ключи разные для двух строк с одинаковым значением, Smartling создаст две строки, используя ключ в качестве метаданных контекста. Недопустимо иметь один и тот же ключ в одном файле ресурсов, хотя Smartling не будет сообщать об ошибках для такого файла.
Просмотрите раздел «Форматирование и экранирование», внимательно просмотрите свои исходные файлы и протестируйте двусторонний переход с помощью Smartling с использованием загрузки псевдо-перевода, чтобы определить правильную интеграцию, прежде чем начинать перевод со строками из файлов свойств Java.
При захвате строк из файла свойств Java Smartling предполагает, что строки используются для Format и MessageFormat. Это имеет два специфических значения для того, как мы захватываем и доставляем строки, а также обрабатываем автоматическую интеграцию переменных в качестве заполнителей.
Поведение по умолчанию такое же, как если бы вы интегрировались со следующими командами
placeholder_format = JAVA
string_format = MESSAGE_FORMAT
placeholder_format = JAVA подразумевает, что строки форматируются с использованием java.util.Formatter. Строка, использующая этот класс, будет иметь стандартные спецификаторы формата c-style / printf для переменных, и потому что эти переменные используют символ процента ‘%’, чтобы пометить их, когда вы хотите, чтобы фактический символ процента отображался в вашей строке, вы должны экранировать его как ‘ %% ‘(как в исходной, так и в переведенной строке).
string_format = MESSAGE_FORMAT означает, что строки форматируются с использованием java.text.MessageFormat. Строка, использующая этот класс, будет иметь FormatElements в фигурных скобках, и поскольку символ одинарной кавычки используется для экранирования специальных символов {и}, одиночная кавычка, которая должна отображаться как символ, должна быть экранирована как » (как в оригинале, так и в в переведенных строках)
Наиболее частые проблемы интеграции, возникающие в Smartling при использовании файлов свойств java, вызваны тем, что ваш файл не интегрируется для получения поведения, необходимого для строк в отношении форматирования заполнителей и экранирования специальных символов.
Например, если в исходном файле:
строка = На вашу подписку действует скидка% d%.
Строка, захваченная Smartling, будет иметь некорректную интеграцию заполнителя и не сможет быть правильно переведена. Строго говоря, «% o» — допустимый спецификатор формата. Есть два способа избежать этой проблемы интеграции.
Если ваши строки отформатированы с помощью Formatter,% в файле ресурсов следует экранировать:
string1 = На вашу подписку действует скидка% d %%.
И наоборот, если у вас есть такая строка:
string = Ваша подписка со скидкой 50%.
Это НЕ форматируется с помощью Formatter Smartling по-прежнему будет определять заполнитель («% o») по той же причине. Чтобы избежать захвата этой строки с помощью заполнителя, отключите форматирование, а затем снова включите его, если вам нужно, чтобы следующие строки были захвачены и готовы к форматированию:
smartling.placeholder_format = NONE
string = Ваша подписка со скидкой 50%.
# smartling.placeholder_format = JAVA
С этой интеграцией строка будет захвачена без заполнителя, и, если предположить, что% char все еще присутствует в переводе, он не будет экранирован как %% при загрузке переведенных файлов.
Аналогичные проблемы наблюдаются для поведения MessageFormat. Если в исходном файле есть эта строка, которая будет передана через MessageFormat:
string1 = Вы не можете удалить {0}
.
Символ ‘следует экранировать, если он проходит через MessageFormat:
string1 = Вы не можете удалить {0}
Аналогично, если у вас есть строка с буквенными символами {} или символом, который НЕ проходит через MessageFormat:
string1 = Вы не можете удалить его.{Мы вам не позволим!}
Вы можете обеспечить надлежащий захват и доставку перевода, отключив MessageFormat, а затем снова включив его, когда это необходимо, после строки, чтобы гарантировать, что последующие строки получат обработку MessageFormat:
smartling.string_format = NONE
string1 = Вы не можете удалить его. {Мы вам не позволим!}
# smartling.string_format = MESSAGE_FORMAT
При интеграции директив «inline» в ваш файл, как только вы установите директиву, она будет применяться ко всем последующим строкам.Так, например, если вы знаете, что ваш файл полностью состоит из строк, для которых требуется MESSAGE_FORMAT, но не форматирование JAVA, вы можете разместить следующее в верхней части файла:
smartling.string_format = MESSAGE_FORMAT
smartling.placeholder_format = НЕТ
Помните, что это поведение будет справедливо для захвата строк и доставки переводов. Переводчики очень часто используют символ одинарной кавычки как часть своего перевода, даже если в строке исходного языка не было никаких кавычек.
Мы рекомендуем загрузить полный набор файлов свойств Java, а затем загрузить псевдоперевод, а затем использовать его, чтобы запустить приложение с псевдолокализацией, чтобы проверить наличие проблем или ошибок.
Дополнительные сведения о заполнителях см. В разделе «Заполнители» в файлах ресурсов.
Для файлов, использующих Parser версии 3, Smartling автоматически захватывает и отображает комментарии к файлам в качестве инструкций для переводчиков. Комментарии должны непосредственно предшествовать строке.
Например, для следующего комментария текст «Метка кнопки« Назад »будет записан как файловая инструкция.
# Метка кнопки "Назад"
Назад = Назад
При использовании file / get для загрузки файлов свойств из Smartling параметр includeOriginalStrings = false гарантирует, что если переводы недоступны, Smartling вернет пустую строку. Если для параметра установлено значение true, Smartling возвращает исходную строку.
Формат# smartling.[имя_директивы] = [значение] |
Точная доставка зависит от типа файла.
Значения | авто (по умолчанию) истина (или да) ложь (или нет) |
Описание | Может контролировать, будут ли символы «экранированы» в сущности при доставке переводов. Это можно установить универсально для всего файла через API или установив директиву в верхней части / начале файла.Директива также может быть встроена для управления поведением определенных строк. |
Примеры | Для использования inline: Строка: |
Например, ваш перевод может выглядеть так:
Smartling HTML с экранированием <> & "пример строки4
По умолчанию, используя настройку «авто», мы предполагаем, что это HTML из тега
, и он будет преобразован в:
Smartling HTML с экранированием & lt; & gt; & amp; & quot; пример string4
Используя smartling.entity_escaping = false
позволит Smartling HTML с экранированием <> & "пример строки4
отображаться должным образом.
Значения | размножить | нет |
Описание | Используется для сохранения экранирования объекта для всех неосновных объектов. Например, обычно мы переворачиваем & copy; в ©, но если мы используем эту новую директиву, перевод автоматически обновится, чтобы использовать экранирование из источника.Для каждого символа сущности мы проверим, был ли он экранирован в источнике, и попытаемся сопоставить (распространить) его в цели. По умолчанию нет , что является текущим поведением, которое распознает только сущности HTML4 — если также требуются сущности HTML5, вы должны использовать директиву entity_escaping_type = распространять. Эта директива может быть встроена в API или в шаблон (проконсультируйтесь с вашим SA по поводу настройки шаблонов директив). Это вообще не влияет на исходный контент, поэтому его использование не приведет к появлению новых строк. Числовые объекты вообще не рассматриваются этой директивой и обрабатываются как обычно. |
Примеры | Чтобы использовать встроенный: |
Значения | Последовательность символов, которую нужно убрать с помощью бегунка «\» при загрузке.Пробелы игнорируются. |
Описание | Применяет экранирование обратной косой черты для пользовательских символов. |
Примеры | # smartling.backslash_escaping_characters = «@% |
Значения | НЕТ; C; IOS; ПИТОН; ЯВА; YAML; QT, RESX |
Описание | Используется для указания стандартного формата заполнителя. |
Примеры | # smartling.placeholder_format = iOS Задает заполнители в стиле iOS для файла. |
Значения | 1) Пользовательское регулярное выражение, совместимое с Perl. 2) NULL — отключает любые текущие пользовательские заполнители |
Описание | Задает настраиваемый формат заполнителя.Любой текст в вашем файле, соответствующий указанному вами регулярному выражению, будет записан как заполнитель. |
Примеры | # smartling.placeholder_format_custom = \ [. +? \] Любые символы, заключенные в квадратные скобки, будут рассматриваться как заполнители. |
Значения | integer — допустимые значения 0-100 |
Описание | Устанавливает процент увеличения исходных строк при загрузке псевдопереводов.Если эта директива не установлена, псевдотрансляции на 30 процентов длиннее исходных строк. |
Примеры | # smartling.pseudo_inflation = 80 Загруженные псевдопереводы увеличивают длину исходных строк на 80 процентов. |
Значения | MESSAGE_FORMAT (по умолчанию) или НЕТ |
Описание | Формат строки — это директива синтаксического анализатора для специализированной обработки файлов, которая включает правила экранирования строк и предварительной обработки, определенные различными сторонними обработчиками ресурсов.По умолчанию используется MessageFormat, стандартный обработчик ресурсов Java. |
Примеры |
Значения | Значение этой директивы выражается как [формат]: [ключи]. |
Описание | Определяет формат строк для указанных путей и может включать другие форматы внутри файлов свойств.
|
Примеры | Smartling анализирует значения всех ключей как HTML. # smartling.string_format_paths = html: * … разбор двух разных типов контента # smartling.string_format_paths = HTML: html. *, Markdown: md. * … сброс синтаксического анализа до формата свойств Java по умолчанию для определенных ключей. # smartling.string_format_paths = @default: * … полностью сбросить синтаксический анализ до формата свойств Java по умолчанию # smartling.string_format_paths = none |
Значения | НЕТ (по умолчанию) ИЛИ ESCAPE_UNICODE |
Описание | ESCAPE_UNICODE указывает, что все символы, отличные от Latin1 (не в диапазоне 0000–007F юникода) после этого комментария, должны быть экранированы выражением экранирования \ uXXXX в процессе загрузки файла. |
Примеры | # smartling.download_format = ESCAPE_UNICODE Здравствуйте? будет преобразован как Hello \ u1D25 при загрузке. |
Значения | перевести ИЛИ notranslate |
Описание | Используйте эту директиву, чтобы включить или отключить обработку строк перевода в файле.Вы должны снова включить перевод после строк, которые хотите исключить. |
Примеры | # smartling.sltrans = notranslate Строки под этой директивой будут захвачены как строки, но исключены из перевода. # smartling.sltrans = перевести Строки под этой директивой будут переведены. |
Была ли эта статья полезной?
mattdsteele / java-properties: Узловой модуль для чтения и интерполяции Java.файлы свойств
GitHub — mattdsteele / java-properties: модуль узла для чтения и интерполяции файлов Java .propertiesМодуль узла для чтения и интерполяции файлов Java .properties
Файлы
Постоянная ссылка Не удалось загрузить последнюю информацию о фиксации.Тип
Имя
Последнее сообщение фиксации
Время фиксации
Читать Java.файлы свойств. Поддерживает динамическое добавление некоторых файлов и значения ключа массива (один и тот же ключ несколько раз)
Начало работы
Установите модуль с помощью: npm install java-properties
Документация
var properties = require ('java-properties'); // Ссылка на файл свойств var values = properties.of ('values.properties'); // Считываем значение из файла свойств values.get ('ключ'); // возвращает значение a.key // Добавляем дополнительные свойства файла значения.добавить ('другой файл.properties'); // Удаляем все значения values.reset (); ... // возвращает значение ключа 'defaultValue', если ключ не найден values.get ('a.key', 'defaultValue'); ... // возвращает значение a.int.key как int или 18 values.getInt ('a.int.key', 18); ... // возвращает значение a.float.key в виде числа с плавающей запятой или 18,23 values.getFloat ('a.float.key', 18.23); ... // возвращает значение a.bool.key как логическое. Разбирайте истину или ложь с любым регистром или 0 или 1 значения.getBoolean ('a.bool.key', правда); ... // возвращает все ключи values.getKeys (); ... // добавляет еще один файл в список свойств values.addFile ('anotherFile.properties'); ... // очищаем ранее загруженные ключи values.reset (); ... [- файл .properties an.array.key = значение1 an.array.key = значение2 ] values.get ('an.array.key'); // возвращает [значение1, значение2] // Множественные контексты var myFile = новый файл свойств ( 'example.properties', 'arrayExample.характеристики'); myFile.get ('arrayKey'); var myOtherFile = новый файл свойств (); myOtherFile.addFile ('example.properties'); myOtherFile.addFile ('example2.properties');
Содействие
Вместо формального руководства по стилю позаботьтесь о сохранении существующего стиля кодирования. Добавьте модульные тесты для любых новых или измененных функций. Линт и проверьте свой код.
История выпусков
- 0.1.0 Начальная фиксация
- 0.1.5 Поддержка пустых строк
- 0.1.6 Новый API:
getKeys
- 0.1.7 Новые API:
addFile
исбросить
- 0.1.8 Добавить ключ массива (один и тот же ключ много раз в файлах)
- 0.2.0 Оберните объекты в класс, чтобы иметь возможность иметь несколько рабочих контекстов
- 0.2.1 Добавьте значение по умолчанию для получения метода. Добавьте getInt и getFloat, чтобы получить целое число или значение с плавающей запятой
- 0.2.2 Добавьте метод getBoolean, чтобы получить значение как логическое. Допустимые значения: истина, ИСТИНА, ложь, ЛОЖЬ, 0, 1 .
- 0.2.3 Добавление метода getMatchingKeys
- 0.2.4 Разрешить многострочные свойства
- 0.2.5 Рефакторинг, новых функций нет
- 0.2.6 FIX интерполяция, когда свойство многозначно
- 0.2.7 Получить только последнее значение для int и boolean в случае многозначного атрибута
- 0.2.8 FIX unicode \ uxxxx декодирование символов
- 0.2.9 Разрешить использование нескольких двойных кавычек
- 0.2.10 исправить ошибку с экранированием: & = (спасибо @Drapegnik)
- 1.0.0 Переписать как Машинопись.Поддержка только Node 6+
Лицензия
По лицензии MIT.
Около
Модуль узла для чтения и интерполяции файлов Java .properties
Ресурсы
Лицензия
Вы не можете выполнить это действие в настоящее время.Вы вошли в систему с другой вкладкой или окном. Перезагрузите, чтобы обновить сеанс. Вы вышли из системы на другой вкладке или в другом окне. Перезагрузите, чтобы обновить сеанс.Как читать файл свойств в Java | Бхаргав Бачина | Bachina Labs
Есть три способа реализовать чтение файлов в проектах Java, мы увидим все методы. Давайте определим файл с именем application.properties в папке src / main / resources .
InputStream From Classpath
Согласно документации Oracle Здесь, системный ресурс — это ресурс, который либо встроен в систему, либо хранится реализацией хоста, например, в локальной файловой системе. Программы получают доступ к системным ресурсам с помощью методов ClassLoader
getSystemResource
и getSystemResourceAsStream
.
Например, в конкретной реализации поиск системного ресурса может включать поиск записей в CLASSPATH.Методы ClassLoader
выполняют поиск файла ресурсов в каждом каталоге, ZIP-файле или JAR-файле в CLASSPATH и, если найдены, возвращают либо InputStream
, либо имя ресурса. Если не найден, методы возвращают значение null. Ресурс может быть найден в записи CLASSPATH, отличной от той, в которую был загружен файл класса.
Во-первых, нам нужно определить файл свойств, как показано ниже в разделе / src / main / resources.
заявка.propertiesДавайте определим класс с именем ApplicationProperties и загрузим этот файл свойств с помощью ClassLoader и getResourceAsStream. Этот метод вызывает исключение IOEception, если файл не найден. Поскольку мы загружаем этот файл в конструктор, файл свойств загружается в переменную Properties.
ApplicationProperties.javaДавайте протестируем следующий основной класс.
ReadMain.javaВот результат выполнения вышеупомянутого класса
ВыходFileInputStream
Согласно документам Oracle здесь, A FileInputStream
получает входные байты из файла в файловой системе.Какие файлы доступны, зависит от среды хоста.
FileInputStream
предназначен для чтения потоков необработанных байтов, таких как данные изображения. Для чтения потоков символов рассмотрите возможность использования FileReader
.
Во-первых, нам нужно определить файл свойств с именем file.properties , как показано ниже в разделе src / main / files.
file.propertiesДавайте определим класс с именем FileProperties и загрузим этот файл свойств с FileInputStream .Этот метод вызывает исключение FileNotFoundException , если файл не найден. Поскольку мы загружаем этот файл в конструктор, файл свойств загружается в переменную Properties.
FileProperties.javaДавайте протестируем следующий основной класс.
ReadWithFileInputStream.javaВот результат выполнения вышеупомянутого класса.
выводFileReader
FileReader
предназначен для чтения потоков символов.Во-первых, нам нужно определить файл свойств с именем db.properties , как показано ниже в разделе src / main / db.
Давайте определим класс с именем DBProperties и загрузим этот файл свойств с помощью FileReader . Этот метод вызывает исключение FileNotFoundException , если файл не найден. Поскольку мы загружаем этот файл в конструктор, файл свойств загружается в переменную Properties.
DBProperties.javaДавайте протестируем следующий основной класс.
ReadWithFileReader.javaВот результат выполнения вышеупомянутого класса.
выводКак читать файл свойств в java
package org.arpit.java2blog;
импорт java.io.File;
импорт java.io.FileNotFoundException;
import java.io.IOException;
импорт java.io.InputStream;
импорт java.util.Properties;
/ *
* @author Arpit Mandliya
* /
публичный класс ReadPropertiesFileJavaMain {
публичный статический void main (String args []) выбрасывает IOException {
new
System.out.println («Чтение из файла свойств»);
System.out.println («——————————«);
Свойства prop = rp.readPropertiesFile («/ config.properties»);
System.out.println («хост:» + prop.getProperty («хост»));
System.out.println («имя пользователя:» + prop.getProperty («имя пользователя»));
System.out.println («пароль:» + prop.getProperty («пароль»));
System.out.println («——————————«);
}
общедоступные свойства readPropertiesFile (String fileName) выдает исключение IOException {
InputStream fis = null;
Свойства prop = null;
try {
prop = new Properties ();
fis = это.getClass (). getResourceAsStream (имя_файла);
// создать объект класса свойств
if (fis! = Null) {
// загрузить в него файл свойств
prop.load (fis);
} else {
выбросить новое исключение FileNotFoundException («файл свойств» + имя_файла + «‘не найден в пути к классам»);
}
} catch (FileNotFoundException e) {
e.printStackTrace ();
} catch (IOException e) {
e.printStackTrace ();
} наконец {
fis.close ();
}
обратная стойка;
}
}
Как создать и изменить форму файла свойств Java-программу в текстовом и XML формате
Хотя в большинстве случаев мы создаем и изменяем файл свойств с помощью текста. редактор, такой как блокнот, блокнот или edit-plus. Также можно создавать и редактировать properties из программы на Java.Log4j.properties, который используется для настройки журналирования на основе Log4J в Java и jdbc.properties, который используется для указания конфигурации параметры для базы данных подключение с использованием JDBC — два наиболее распространенных примера файла свойств в Ява. Хотя я не нашел реальной ситуации, когда мне нужно было бы создать properties с помощью программы Java, но всегда полезно знать о возможности, доступные в Java API. В последнем руководстве Java по свойствам у нас есть видел как для чтения значений из файла свойств как в текстовом, так и в XML-формате, и в этой статье мы увидим, как создать файл свойств как в текстовом, так и в XML-формате.Класс Java API java.util.Properties предоставляет несколько служебных методов store () для хранить свойства в текстовом или xml формате. Store () может быть используется для хранения свойства в текстовом файле свойств, а метод storeToXML () может использоваться для создания файла свойств Java в формате XML.
Программа на Java для создания и хранения свойств в текстовом и XML-формате Как я сказал ранее, java.util.Properties представляет файл свойств в Программа на Java. Он предоставляет методы load () и store () для читать и записывать файлы свойств из файловой системы и в файловую систему.Вот простой пример создания самой программы формы файла свойств Java.
import java.io.FileNotFoundException;
импорт java.io.FileOutputStream;
импорт java.io.IOException;
import java.util.Properties;
/ **
* Программа на Java для создания и изменения файла свойств в текстовом формате и хранение
* имущество в теме. В большинстве случаев мы используем текстовый редактор для создания и редактирования собственности
.* файл e.грамм. jdbc.properties или log4j.properties, но мы также можем создать свойство
* файл из Программа на Java, как показано в этом примере.
** @author Javin Paul
* /
общедоступный класс TextPropertyWriter {
public static void main ( String args []) выбрасывает FileNotFoundException , IOException {
// Создание
файлы свойств из программы Java
Свойства props = новый Свойства ();
FileOutputStream fos = новый FileOutputStream («c: / user.свойства «);
props.setProperty (» key1 «,
«значение1»);
props.setProperty («ключ2»,
«значение2»);
// пишущие свойства
в файл свойств из Java
props.store (fos, «Свойства
файл, созданный программой Java «);
fos.close ();
}
}
Это создаст файл user.properties в C: \. вот как это свойство файл будет выглядеть так:
# Файл свойств, созданный программой Java
# Пн 16 янв 03:00:57 ПТ 2012
ключ2 = значение2
ключ1 = значение1
Вот еще один пример создания файла свойств Java в формате XML из Программа на Java:
импорт java.io.FileNotFoundException;импорт java.io.FileOutputStream;
импорт java.io.IOException;
import java.util.Properties;
/ **
* Программа на Java для хранения свойств в файле свойств XML. stroeToXML ()
метод
* java.util.Properties Класс используется для сохранения свойств в файле свойств XML из Java
* программа.
** @author Javin Paul
* /
общедоступный класс XmlPropertiesWriter {
public static void main ( String args []) выбрасывает FileNotFoundException , IOException {
// Чтение свойств
файлы в примере Java
Свойства props = новый Свойства ();
FileOutputStream fos = новый FileOutputStream («c: / user.xml «);
props.setProperty (» key1 «,
«значение1»);
props.setProperty («ключ2»,
«значение2»);
// пишущие свойства
в файл свойств из Java
props.storeToXML (fos, «Свойства
файл в формате xml, созданный программой Java «);
fos.close ();
}
}
Выход:
Xml version = «1.0» encoding = «UTF-8» standalone = «no» ?>
<запись key = «key2» > значение2
Это все о Как создать файл свойств из программы Java или Как
изменить свойства из программы Java.Как я уже сказал, почти все время мы используем текст
редактор например блокнот или блокнот ++ для редактирования файлов свойств, таких как log4j.properties или jdbc.properties, вы можете
также при необходимости отредактируйте их из программы Java. Я лично предпочитаю недвижимость
файл в текстовом формате, если количество свойств невелико и основано на XML
файл свойств, если файл достаточно большой, например, если у вас есть много свойств для
использовать редакторы XML.
Дальнейшее обучение
Углубленное изучение Java: станьте полным Java-инженером!
Master Java Web Services и REST API с Spring Boot
Java Web Fundamentals
Другие руководства по Java XML , которые могут оказаться полезными
Свойства Java — GeoServer 2.20.x Руководство пользователя
Хранилище данных свойств обеспечивает доступ к одному или нескольким типам объектов (слоям), хранящимся в файлах свойств Java; это простые текстовые файлы, хранящиеся в локальной файловой системе. Хранилище данных Properties никогда не предназначалось для поставки с GeoServer. Он возник в учебном пособии по GeoTools, а затем нашел широкое применение разработчиками в автоматизированных тестах, для которых требовалось удобное хранилище небольших фрагментов данных. Он попал в GeoServer по завершении процесса упаковки, был автоматически обнаружен и предложен пользователям через веб-интерфейс.Хранилище данных о свойствах оказалось полезным в учебных пособиях и примерах.
Мы не рекомендуем использовать хранилище данных Properties для больших объемов данных с большим количеством элементов или большой геометрией. Его производительность будет ужасной.
Для небольших наборов данных, таких как коллекции из нескольких десятков точек, вы можете найти это удовлетворительным. Например, если у вас есть несколько точек, которые вы хотите добавить в качестве дополнительного уровня, и нет удобной базы данных, в которой они хранятся, хранилище данных Properties предоставляет простые средства их доставки.
Изменения в файле свойств немедленно отражаются в ответах GeoServer. Нет необходимости воссоздавать хранилище данных, пока не будет изменена первая строка файла свойств или файлы свойств не будут добавлены или удалены.
Добавление хранилища данных свойств
По умолчанию при создании нового хранилища данных в списке «Источники векторных данных» будет опция «Свойства».
Свойства в списке хранилищ векторных данных
Настройка хранилища данных свойств
Настройка хранилища данных Properties
Опция | Описание |
| Задает префикс пространства имен типов объектов (слоев) и их свойств |
| Уникальный идентификатор, позволяющий отличить это хранилище данных |
| Дополнительный текст с подробным описанием хранилища данных |
| Функции будут доставлены, только если эта опция отмечена |
| Путь файловой системы к каталогу, содержащему один или несколько файлов свойств, например |
Каждый файл свойств TYPENAME.properties
в назначенном каталоге обслуживается как тип объекта TYPENAME
(имя файла без .properties
) в пространстве имен хранилища данных.
Прежде чем можно будет использовать тип объекта (слой), вы должны отредактировать его, чтобы убедиться, что его ограничивающая рамка и другие метаданные настроены.
Формат файла свойств
Формат файла свойств — это подмножество формата свойств Java: список строк в форме КЛЮЧ = ЗНАЧЕНИЕ
.
В этом примере station.properties
определяет четыре объекта типа объекта (слоя) станций
:
_ = id: целое число, код: строка, имя: строка, расположение: геометрия: srid = 4326 station.27 = 27 | ALIC | Алис-Спрингс | ТОЧКА (133,8855 -23,6701) станции 4 = 4 | NORF | Остров Норфолк | ТОЧКА (167,9388 -29,0434) станций. 12 = 12 | COCO | Cocos | POINT (96,8339 -12,1883) станции. 31 = 31 | ЭЛБИ | Олбани | ТОЧКА (117,8102-34,9502)
Пустые строки в файле не допускаются.
Первая строка файла свойств начинается с
_ =
и определяет информацию о типе, необходимую для интерпретации следующих строк.Значения, разделенные запятыми, имеют вид
ИМЯ: ТИП
Имена — это имя свойства, которое используется для кодирования свойства в ответах WFS.
Типы включают
Целое число
,String
,Float
иГеометрия
Геометрия
может иметь дополнительный суффикс: srid = XXXX
, который определяет пространственную справочную систему ее числовым кодом EPSG.Обратите внимание, что геометрические формы, определенные таким образом, расположены в порядке долготы / широты.
Последующие строки определяют объекты, по одному на строку.
Ключ перед
=
— это идентификатор функции (fid
илиgml: id
в ответах WFS). Каждый должен быть NCName.Данные функции следуют за
=
, разделенными вертикальными полосами (|
). Типы данных должны соответствовать объявлению в первой строке.Оставьте поле пустым, если хотите, чтобы оно было пустым; в этом случае свойство игнорируется.
Обратите внимание, что в этом примере srid = 4326
устанавливает систему пространственной привязки (SRS) на EPSG: 4326
, которая по соглашению находится в порядке долготы / широты, когда упоминается в краткой форме. Если вы запросите эти функции в GML 3, вы увидите, что GeoServer правильно переводит геометрию в форму URN SRS urn: x-ogc: def: crs: EPSG: 4326
в форме широты / долготы.См. Страницу настроек WFS для получения дополнительной информации о вариантах порядка оси SRS.
NetBeans
Это руководство поможет вам понять следующее:
как добавить иерархию узлов в окно служб
как переименовывать и удалять узлы
как отображать подузлы
как изменить список узлов
как создать лист свойств
как назначать свойства
как выполнять другие общие задачи
Работа с этим примером важна, поскольку API-интерфейс узлов NetBeans является одним из наиболее распространенных API-интерфейсов и отражает информацию, которая существует независимо от узлов.Вы взаимодействуете через интерфейс с этой живой информацией.
Перед тем, как приступить к написанию модуля, вы должны убедиться, что у вас есть все необходимое программное обеспечение. Кроме того, вы можете поиграть с образцом, прежде чем создавать его самостоятельно. Знакомство с образцом позволит вам узнать, что вас ждет в оставшейся части этого урока!
Установка образца
В этом разделе мы загружаем и устанавливаем образец, чтобы мы могли ознакомиться с ним, прежде чем воссоздавать его самостоятельно.
В среде IDE выберите «Файл»> «Открыть проект» и перейдите к папке, содержащей распакованный файл. Откройте проект модуля. Должно получиться так:
Щелкните правой кнопкой мыши узел проекта и выберите «Установить / перезагрузить на целевой платформе». Целевая платформа открывается, и модуль устанавливается.
Знакомство с образцом
В этом разделе мы рассмотрим функциональные возможности, предоставляемые модулем, с точки зрения конечного пользователя.Как только мы подробно узнаем, что будет предоставлять модуль, мы сможем создать его с нуля.
Откройте окно «Службы» (Ctrl-5) и обратите внимание, что у вас есть новый узел с большим количеством (~ 50) подузлов, каждый из которых помечен в соответствии с ключом для определенных свойств Java:
Пункты контекстного меню появляются при щелчке правой кнопкой мыши по основному узлу и подузлам. Для подузлов общие свойства среды выполнения Java используются для настройки основных механизмов, таких как пути поиска шрифтов, расположение виртуальной машины Java (JVM), локаль по умолчанию и т. Д.Обычно это строковые ключи, подобные name.name.name
, и соответствующее строковое значение. Значения можно запросить или установить из языка Java. Кроме того, их можно использовать для установки значений по умолчанию при запуске JVM. Когда узел «Свойства системы» расширен, он будет отображать по одному узлу для каждого из ключей, каждый из которых помечен в соответствии с ключом. Например:
Значение
java.vm.vendor
может отображать, например, значение Sun Microsystems, Inc.Значение
path.separator
может отображать точку с запятой, в зависимости от вашей конфигурации.Значение
user.language
может отображать значение English, в зависимости от вашей конфигурации.
Поиграйте с образцом:
Показать страницу свойств. Щелкните правой кнопкой мыши подузел и выберите «Свойства». На странице свойств отображается одна вкладка «Свойства», содержащая два свойства.Первое свойство помечено как имя и дает то же имя, что и узел (ключ), а другое помечено как значение и отображает строковое значение свойства.
Переименовать собственность. Щелкните подузел, а затем щелкните его еще раз. Это позволяет вам переименовать ключ на месте, сохранив при этом то же значение. Также можно щелкнуть свойство «Имя» на панели свойств или щелкнуть правой кнопкой мыши подузел и выбрать «Переименовать».
Измените значение. Щелкните вкладку «Значение» на странице свойств и введите новое значение.Это сбрасывает системное свойство на введенное значение.
Добавить недвижимость. Щелкните правой кнопкой мыши главный узел «Свойства системы» и выберите «Добавить свойство системы». Это позволяет вам добавить в список новое системное свойство.
Удалить свойство. Выберите свойство и нажмите Удалить. Это удаляет свойство.
Обновить список. Щелкните правой кнопкой мыши главный узел «Свойства системы» и выберите «Обновить». Это побуждает модуль перепроверить значения, обновляя список по мере необходимости.
Знакомство с источниками
Образец свойств системы состоит из основных и вспомогательных файлов.
Классы Java представлены в алфавитном порядке ниже:
Файл | Описание |
---|---|
| Этот дочерний объект отвечает за отслеживание списка узлов под узлом «Свойства системы».При первом запросе списка он извлекает все системные свойства и просит реализацию узла отслеживать все имена системных свойств. Интерфейс для этого — класс Children. |
| Этот узел указывает, какие дочерние узлы будут под ним, и просит использовать AllPropsChildren для отслеживания списка дочерних узлов. Модуль заботится о таких вещах, как его контекстное меню. |
| Это узел, представляющий отдельное свойство, и является абстрактным узлом. Его конструктор требует, чтобы пользователь предоставил ключ в виде строки. Для каждого имени свойства системы используется OnePropNode для его отображения. Когда пользователь разворачивает узел свойств системы, он создает список ключей, а затем создает соответствующее количество узлов OnePropNodes. Каждый узел OnePropNode отображает один ключ и не взаимодействует напрямую со своим родительским узлом — его знания ограничены одним системным свойством и методами работы с ним, а также уведомлением PropertiesNotifier о любых изменениях.Такой дизайн упрощает повторное использование таких узлов, в том числе их размещение в других контекстах. |
| Управляет событиями маршрутизации при любых изменениях, включая добавление, удаление или переименование свойства, или при изменении значения свойства. |
| Это действие отображается во всплывающем меню в разделе «Свойства системы» с меткой «Обновить».Он вызывает обновление, обновляя отображение информации на основе текущего состояния свойств системы. |
* Вспомогательные файлы. Вспомогательные файлы модуля находятся в пакете org.myorg.systemproperties
и в узле «Важные файлы» (выбранном на рисунке ниже):
Вспомогательные файлы в пакете org.myorg.systemproperties
представлены в алфавитном порядке ниже:
Файл | Описание |
---|---|
| Значок для узла «Свойства системы». |
| Это стандартный файл свойств Java, в котором используется синтаксис |
| Регистрирует |
| Значок подузлов. |
Файлы в узле «Важные файлы» представлены в том порядке, в котором они появляются в окне «Проекты»:
Файл | Описание |
---|---|
Манифест модуля | Объявляет проект как модуль. |
Скрипт сборки | Содержит целевые объекты Ant для сборки проекта. |
Метаданные проекта | Содержит метаданные проекта, такие как зависимости, для проекта. |
Свойства проекта | Содержит свойства проекта. |
Конфигурация платформы NetBeans | Содержит свойства платформы. |
Конфигурация платформы NetBeans для каждого пользователя | Содержит пользовательские свойства. |