Уже не раз в разговорах с ADF-разработчиками подымался вопрос о том, где хранить значения специфичных настроек приложения. Вариантов ответов на данный вопрос несколько, поэтому я решил в серии постов рассмотреть основные варианты и дать рекомендации по их применению.
Итак, первый вариант - это использование стандартного дескриптора web.xml, а точнее элемента context-param.
Предположим, что в нашем приложении есть 2 настроечных параметра - числовой и текстовый, соответственно в web.xml мы можем их описать так:
а в редакторе JDeveloper это будет выглядеть так:
Обратиться к контекстным параметрам из Java-кода довольно просто:
Из EL еще проще: #{initParam.myStringParam}
В моем примере текстовое сообщение в заголовке PanelBox получается из параметра myStringParam, а код обработчика нажатия кнопки анализирует myIntParam:
Чтобы поменять значения контекстных параметров можно воспользоваться присутствующей в Weblogic функциональностью Deployment Plans. Она позволяет нам повлиять на значения в дескрипторах развертывания без ручной модификации самих дескрипторов. Это весьма удобно - теперь администратору не нужно пересобирать EAR/WAR, достаточно написать deployment plan и выполнить повторный deploy EAR с новым планом. Deployment plan имеет 2 основные секции - объявление переменных и описание правил замены. При описании правил замены используется XPath. Следующий план меняет значения двух наших контекстных переменных:
Теперь нам достаточно выполнить повторное развертывание приложения с ссылкой на Deployment Plan:
затем повторно обратиться к нашему приложению и убедиться что изменения отразились:
Краткое резюме по использованию данного подхода на практике:
Итак, первый вариант - это использование стандартного дескриптора web.xml, а точнее элемента context-param.
Предположим, что в нашем приложении есть 2 настроечных параметра - числовой и текстовый, соответственно в web.xml мы можем их описать так:
<?xml version = '1.0' encoding = 'UTF-8'?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"
version="2.5" xmlns="http://java.sun.com/xml/ns/javaee">
<!-- fragment starts--!>
<context-param>
<description>My custom string parameter</description>
<param-name>myStringParam</param-name>
<param-value>Sample value</param-value>
</context-param>
<context-param>
<description>My custom int parameter</description>
<param-name>myIntParam</param-name>
<param-value>2012</param-value>
</context-param>
<!-- fragment ends --!>
</web-app>
а в редакторе JDeveloper это будет выглядеть так:
Обратиться к контекстным параметрам из Java-кода довольно просто:
FacesContext fctx = FacesContext.getCurrentInstance();
ServletContext servletContext = (ServletContext) fctx.getExternalContext().getContext();
String myIntParam = servletContext.getInitParameter("myStringParam");
Из EL еще проще: #{initParam.myStringParam}
В моем примере текстовое сообщение в заголовке PanelBox получается из параметра myStringParam, а код обработчика нажатия кнопки анализирует myIntParam:
Чтобы поменять значения контекстных параметров можно воспользоваться присутствующей в Weblogic функциональностью Deployment Plans. Она позволяет нам повлиять на значения в дескрипторах развертывания без ручной модификации самих дескрипторов. Это весьма удобно - теперь администратору не нужно пересобирать EAR/WAR, достаточно написать deployment plan и выполнить повторный deploy EAR с новым планом. Deployment plan имеет 2 основные секции - объявление переменных и описание правил замены. При описании правил замены используется XPath. Следующий план меняет значения двух наших контекстных переменных:
<?xml version='1.0' encoding='UTF-8'?>
<deployment-plan xmlns="http://xmlns.oracle.com/weblogic/deployment-plan" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://xmlns.oracle.com/weblogic/deployment-plan http://xmlns.oracle.com/weblogic/deployment-plan/1.0/deployment-plan.xsd" global-variables="false">
<application-name>UsingContextParams.ear</application-name>
<variable-definition>
<variable>
<name>stringParamVar</name>
<value>Changed Value of the String Parameter</value>
</variable>
<variable>
<name>intParamVar</name>
<value>abracadabra</value>
</variable>
</variable-definition>
<module-override>
<module-name>UsingContextParams_ViewController_webapp1.war</module-name>
<module-type>war</module-type>
<module-descriptor external="false">
<root-element>web-app</root-element>
<uri>WEB-INF/web.xml</uri>
<variable-assignment>
<name>stringParamVar</name>
<xpath>/web-app/context-param/[param-name="myStringParam"]/param-value</xpath>
<operation>add</operation>
</variable-assignment>
<variable-assignment>
<name>intParamVar</name>
<xpath>/web-app/context-param/[param-name="myIntParam"]/param-value</xpath>
<operation>add</operation>
</variable-assignment>
</module-descriptor>
</module-override>
<config-root>d:/work/source/adf/_STRUCTURED/Architecture/StoringConfigurationValues/plan</config-root>
</deployment-plan>
Теперь нам достаточно выполнить повторное развертывание приложения с ссылкой на Deployment Plan:
затем повторно обратиться к нашему приложению и убедиться что изменения отразились:
Краткое резюме по использованию данного подхода на практике:
- удобен, когда настроечных параметров немного и они редко меняются;
- не требует отдельного хранилища значений параметров (БД, LDAP-каталог и проч.)
- подходит только для глобальных параметров приложения, без специфичных значений для ролей и отдельных пользователей;
- изменение значений параметров требует повторного развертывания приложения;
- значения сохраняются в не шифрованном виде, что не подойдет для хранения паролей;
Код данного примера можно забрать в GitHub.




Добрый день! Спасибо за статью.
ОтветитьУдалитьСтолкнулся с проблемой: при деплое приложения с deployment plan через weblogic console, deployment plan не применяется, остаются параметры из web.xml.
Если деплоить через библиотеку weblogic.Deployer с указанием deployment plan, изменения подтягиваются и выставляются замененные параметры из deployment plan.
Вы не знаете, чем вызвана проблема?
Версия weblogic 10.3.5.0
>Столкнулся с проблемой: при деплое приложения с deployment plan через weblogic console, deployment plan не применяется, остаются параметры из web.xml.
ОтветитьУдалитьА где у Вас plan.xml находится? В одном каталоге с ear-ом? Насколько я помню, console подцепляет план если EAR лежет в $SOME_DIR/app, a plan.xml - в $SOME_DIR/plan . См тут http://docs.oracle.com/cd/E15523_01/web.1111/e13702/config.htm#i1060138