Описание процесса разработки ресурсов
Статические документы
Динамические документы
    Описание инструкций доступа к данным
    Структура данных
    XSLT-преобразование
    Импорт в XSLT
Бинарные ресурсы
Динамические бинарные ресурсы
Обработчики форм
XML-ресурсы
Java классы
Веб-сервисы

Практическое руководство
Создание ресурса отклика на ошибку
Создание ресурса авторизации
Команды сервера

Описание процесса разработки ресурсов

Статические документы

Статический документ представляет собой текстовый документ не требующий специальной обработки на стороне сервера. Самым распространенным случаем, является HTML-документ. В связи с этим, разработка статического документа в Gelios не имеет особенностей.

Регистрация ресурса
  • В Капитал CSE: Создать ресурс с кодом 18:Статические документы (HTML,текст,...)
  • В файлах:
    1) Создать в association.xml регистрационную запись.
    <Association Alias="css" Class="ServiceClass.GStaticHTMLResource" DataLocation="pages/css"/>.
    2) В каталоге указанном в DataLocation нужно создать файл-дескриптор infcfg.xml.
    3) В файле-дескрипторе указать имя файла-содержимого и другие параметры. Например:
    <Params file-charset="koi8-r" charset="utf-8"> 
      <FileName>page.html</FileName>
    </Params>
    Существует альтернативный вариант регистрации: необходимо создать в association.xml регистрационную следующую запись
        <Association Alias="css" Class="ServiceClass.GStaticHTMLResource"
                 DataLocation="pages/main.css">
          <params>
             <param name="file-charset" value="Cp1251"/>
             <param name="charset" value="Cp1251"/>
          </params>
        </Association>
        
    .

    Динамические документы

    Разработчик динамического документа должен учитывать, что динамический ресурс состоит из двух частей: инструкций доступа к данным и шаблона преобразования данных. В большинстве случаев источником данных является БД, поэтому "инструкции" записываются на языке SQL, а преобразования выполняются, как правило, в HTML. Преобразования данных записываются на языке XSLT.

    Регистрация ресурса
  • В Капитал CSE: Создать ресурс с кодом 20: Динамические документы
  • В файлах:
    1) Создать в association.xml регистрационную запись.
     <Association Alias="example02"
                  Class="ServiceClass.GDynamicHTMLResource"
                  DataLocation="pages/example02"/>
    2) В каталоге указанном в DataLocation нужно создать файл-дескриптор infcfg.xml.
    3) В файле-дескрипторе указать имя xslt-файла и инструкции для доступа к данным. Например:
    <Params cache="false" transformer="http.xml">
      <SQL name="APPLICATIONS">
        select
          APPLICATION_ID,
          APPLICATION_NAME
        from APPLICATION
        where APPLICATION_TYPE = 2
          and APPLICATION_NAME != 'devel'
      </SQL>
    </Params>
    

    Описание инструкций доступа к данным
    Рассмотрим простой пример. Пусть необходимо выбрать из БД товары и представить их в HTML.
    
    <?xml version="1.0" encoding="KOI8-R"?>
    <Params caсhe="false">
       <SQL name="SQL1">
          SELECT sgood_name FROM sgood
       </SQL>
    </Params>
    
    В тэге Params указываются внутренние инструкции XSLT преобразователя. Инструкция caсhe определяет сколько раз за сессию будут запрашиваться и формироваться данные. Если значение равно "true", то запрос и формирование данных будет выполнено один раз за сессию, если "false" - то при каждом обращении к динамическому документу будет выполняться как запрос, так и формирование данных. При создании динамического документа средствами системы "Капитал CSE" можно управлять помещением ресурса в кэш сервера целиком. Если ресурс помещается в кэш сервера, запрос к данным будет производиться только один раз за сессию, а формирование - в зависимости от значения параметра caсhe. Если необходимо сбросить кэш сервера, при запросе ресурса в URL необходимо указать параметр cachectrl. Если cachectrl=1 запрос будет обновлен, иначе - нет.

    В теге SQL записывается запрос к БД, которая является корневой. Под корневой БД будем понимать БД, где располагается хранилище ресурсов. Если необходимо выполнить запрос в другой БД, то можно использовать необязательный атрибут alias. Его значение должно быть равно одному из псевдонимов баз данных (см. Конфигурирование файла соединений БД). Все запросы имеют имена, которые указываются в атрибуте name.

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

    
    <?xml version="1.0" encoding="KOI8-R"?>
    <Params caсhe="false">
       <SQL name="SQL1">
          SELECT sgood_name FROM sgood WHERE clustergood_id=:cluster_id
       </SQL>
    </Params>
    
    Откуда Gelios возмет значение параметра? Конечно-же из HTTP запроса. Иными словами, в HTTP запросе должен присутствовать параметр с именем cluster_id, например http://www.gelicon.perm.ru?cluster_id=67. Если в параметрах запроса нужна дата, то имя параметра обязательно должно начинаться с _date_.

    При выводе результатов выполнения SQL-запроса можно указать формат представления данных вещественного типа и типа "дата". Инструкции формата заключаются в тэг <Formats>, который следует за текстом SQL-запроса. Формат представления данных одного поля запроса задается внутри одноименного тега. Для задания формата данных вещественного типа применяется стандартная строка представления, в которой используются символы:(#)(0)(.)(,). Формат данных типа "дата" задается с помощью символов (y)(m)(d). Пример XML-инструкции, использующей формат представления данных:

    
    <?xml version="1.0" encoding="KOI8-R"?>
    <Params caсhe="false">
       <SQL name="SQL1">
          SELECT SUM(E.entry_summa) SUMMA,
                 O.OPER_ID,
                 O.OPER_DATELOG,
                 O.OPER_NOTE
          FROM oper O,entry E
          WHERE  E.oper_id=O.oper_id
          GROUP BY O.OPER_ID,O.OPER_DATELOG,O.OPER_NOTE
       
          <Formats>
            <OPER_DATELOG>yyyy.MM.dd</OPER_DATELOG>
            <SUMMA>#,##0.00</SUMMA>
          </Formats>
       </SQL>
    </Params>
    

    Кроме доступа к данным, посредством выполнения запроса возможен экспорт XML данных из ресурса с типом "XML-ресурсы", а также из файла или добыча XML данных по URL. Это реализуется с помощью тэга XML и соответствующих атрибутов, например:

    
    <?xml version="1.0" encoding="KOI8-R"?>
    <Params caсhe="false">
    <XML name="XML1"
      filename="C:\time.xml">
    </XML>
    </Params>
    
    В примере XML-данные экспортируются из файла time.xml. Возможны следующие варианты записи атрибутов тэга XML:
    
    filename="полное имя файла" | url="url размещения XML-данных" | resource="имя XML-ресурса"
    

    Файл, содержащий XML-данные должен быть создан в кодировке "KOI-8".

    В динамических документах помимо использования XML-ресурсов возможно также обращение к XML-данным, генерируемым специальным JAVA классом. Это реализуется с помощью инструкции JAVA, реализуемой с помощью тега <JAVA>. В атрибуте classname указывается ресурс типа JAVA класс, а в атрибуте name - имя, используемое для обращения к классу в шаблоне.

    В корневом теге можно создать тег OPTIONS. Данный тег используется для указания опций XSLT-преобразователя. В качестве управляющих используются следующие атрибуты:

    Результат выполнения запроса разбивается на группы строк rowset - страницы записей, отоброжаемых в browser'е. Такое группирование полезно в тех случаях, когда записей достаточно много. В теге SQL с помощью необязательного параметра rowset-size можно установить количество записей в группе. Если параметр rowset-size не указан, все записи объединяются в одну группу. Пример использования параметра rowset-size:

    
    <?xml version="1.0" encoding="KOI8-R"?>
    <Params caсhe="false">
       <SQL name="SQL1" rowset-size="20">
          SELECT sgood_name FROM sgood
       </SQL>
    </Params>
    
    В результате выполнения этой инструкции получим несколько групп из 20 записей.

    В теге SQL можно также использовать необязательный параметр maxrows. Этот параметр определяет, какое количество из записей, полученных в результате выполнения запроса следует отображать в browser'е (по умолчанию отображаются все записи). Пример использования параметра maxrows:

    
    <?xml version="1.0" encoding="KOI8-R"?>
    <Params caсhe="false">
       <SQL name="SQL1" maxrows="25">
          SELECT sgood_name FROM sgood
       </SQL>
    </Params>
    
    В результате выполнения этой инструкции получим первые 25 записей из возвращаемых запросом.

    Все теги, содержащиеся внутри тегов SQL, XML и JAVA, копируются в результирующий xml-документ без изменения.

    Структура данных

    В результате выполнения инструкций доступа к данным Gelios создает XML дерево данных, которое отправляется на преобразование. Для того, чтобы правильно записывать инструкции по преобразованию данных нужно знать структуру этого дерева.

    Для изучения структуры дерева можно воспользоваться коммандой сервере getXML(см. команды сервера)
    На вершине дерева находится узел "fullXML". На следующем уровне находятся узлы:

    1. USERINFO - информация о пользователе. Данный тег имеет следующие атрибуты: user_id - идентификатор пользователя системы Капитал CSE, user_familyname - имя пользователя (login). Они заполняются после авторизации пользователя. Если авторизация пользователя не производилась (иначе говоря, ресурс является общедоступным) атрибуты отсутствуют.
    2. HTTP - информация о параметрах HTTP-запроса. Внутри данного тега располагаются имена параметров запроса и их значения. Например:
                <HTTP>
                  <cluster_id>67</cluster_id>
                </HTTP>
       
    3. GLOBAL - этот элемент содержит следующие элементы: _date_end и _date_beg которые определяют текущий интервал дат; из специального ресурса с именем stderrorpage, предназначенным для обработки ошибок, доступны элементы errorName - ресурс, в котором произошла ошибка, errorMsg - текст сообщения об ошибке, errorClass - класс, обнаруживший ошибку(см.Создание ресурса отклика на ошибку). Например:
                <GLOBAL>
                  <errorClass/> 
                  <errorName/> 
                  <errorMsg/> 
                  <_date_end>31.07.2002</_date_end> 
                  <_date_beg>01.07.2002</_date_beg> 
                </GLOBAL>
       
    4. CYRRDATE - этот элемент не содержит элементов. В единственном атрибуте с именем date располагается текущая системная дата.
    5. Данные. Данные, получаемые в результате выполнения SQL-запроса имеют следующую структуру: первым следует элемент определяемый атрибутом name запроса, далее - rowset - группа строк, объединяющая множество данных (таких множеств может быть несколько), номер группы строк определяется параметром page; row - одна запись, и наконец - структура которой определяется набором полей, получемых в результате выполнения SQL-запроса. Например:
              <SQLList>
                <rowset page="1">
                  <row>
                    <CAPRESOURCE_CODE>Worker06</CAPRESOURCE_CODE> 
                    <CAPRESOURCE_NAME>Анкета застрахованного лица</CAPRESOURCE_NAME> 
                    <CAPRESOURCE_AUTOR /> 
                    <CAPRESOURCE_DATE /> 
                    <RESOURCETYPE_ID>1</RESOURCETYPE_ID> 
                  </row>
                  ...
                </rowset>
                  ...
              </SQLList>
        
      Внимание! Имена полей нужно писать заглавными буквами.
      Структура данных, экспортируемых из XML-ресурса или генерируемых JAVA-классом, полностью определяется структурой этих ресурсов. В случае XML, это содержимое XML-ресуса или файла с XML-данными. В случае использования JAVA-класса - структура генерируемого XML-документа.

    XSLT-преобразование

    Преобразование добытых данных ведется на языке XSLT. Шаблон преобразования в случае файловой реализации располагается в файле-дескрипторе (атрибут transformer). В случае реализации "Капитал CSE" местоположение шаблона указывать не надо. Он располагается в самом ресурсе.

    Импорт в XSLT

    При использовании xsl-комманд import, include и фунции document() аргумент href должен иметь следующий вид:

    <источник>::<имя>
    источник может принимать значения:
    1. xslt - в этом случае документ берётся из каталога, указанного в web.xml (XSLTROOT) а имя - путь к xsl-файлу относительно XSLTROOT
    2. resource - в этом случае документ является ресурсом системы, а имя имеет следующий вид:
      имя-ресурса[?параметр=значение[&параметр=значение[...]]]
      в результате получим XML-поддерево:
              <source>
              <![CDATA[<данные>]]>
              </source>
            
    3. resource_config - в этом случае документ является конфигурацией ресурса системы, а имя имеет следующий вид:
      имя-ресурса
      в результате получим XML-поддерево:
              <config>
      	  <!-- из файла infcfg.xml -->
                <Params ...>
                ...
                </Params>
      	  <!-- из файла association.xml -->
                <Association ...>
                ... 
                </Association>
              </config>
            
      Внимание, действительно только для фаловой реализации
    4. url - в этом случае документ ищется по URL, указанном в аргументе имя
    При использовании resource и url также можно указать кодировку получаемого документа. Для этого необходимо добавить параметр encoding например:
    resource::test?page=1&encoding=windows-1251
    в результате получим
            <?xml version="1.0" encoding="windows-1251"?>
            <source>
            <![CDATA[<данные>]]>
            </source>
          
    По умолчанию используется кодировка KOI8-R.

    Бинарные ресурсы

    Бинарный ресурс не требует специальной обработки на стороне сервера, в связи с чем, разработка бинарного ресурса в Gelios не имеет особенностей. Самым распространенным случаем, являются различного рода изображения, документы Word и Exel, код апплетов и т.д.

    Регистрация ресурса
  • В Капитал CSE: создать ресурс с кодом 19:Статические бинарные ресурсы (GIF,JPG,...)
  • В файлах: создать в association.xml регистрационную запись. Например:
    <Association Alias="imhk.gif" Class="ServiceClass.GPictureResource"
                 DataLocation="pages/images/imhk.gif"/>

    Динамические бинарные ресурсы

    Динамические бинарные ресурсы являются разновидностью динамических документов. Они предназначены для получения бинарных данных из БД. Ресурс данного типа может содержать только одну инструкцию доступа к данным, записанную на языке SQL. Пример:

          <?xml version="1.0" encoding="KOI8-R"?>
          <Params>
            <sql  picture_field="capresource_blob" >
                  SELECT capresource_blob
                    FROM capresource
                  WHERE capresource_id = :capresource_id
            </sql>
          </Params>
      
    Как видно из примера, у элемента sql отсутствует атрибут name. Причина в том, что данная инструкция является единственной в данном типе ресурса. Кроме того, запрос должен возвращать единственную запись (точнее, он может возвращать несколько записей, но учитываться будет только первая). Для уточнения поля в котором расположены бинарные данные необходимо использовать атрибут picture_field.

    Регистрация ресурса
  • В Капитал CSE: создать ресурс с кодом 21:Динамические бинарные ресурсы
  • В файлах:
    1) Создать в association.xml регистрационную запись.Например:
    <Association Alias="photo" Class="ServiceClass.DynamicPictureResource"
                 DataLocation="pages/people/photo"/>
    2) В каталоге указанном в DataLocation нужно создать файл-дескриптор infcfg.xml.
    3) В файле-дескрипторе указать инструкции для доступа к данным. Например:
    <Params cache="false">
      <SQL picture_field="worker_photo" >
        select  worker_photo
        from worker
        where worker_id=:worker_id
      </SQL>
    </Params>
    

    Обработчики форм

    Обработчики форм предназначены для выполнения определенных действий на сервере, иными словами, для обработки введенной в форме информации. Предположим, что у Вас есть форма
          <HTML>
           <HEAD>
             <TITLE></TITLE>
           </HEAD>
             <BODY>
               <H4>Регистрация пользователя</H4>
               Поля отмеченные (*) являются обязательными для заполнения. Если
               будет заполнено имя организации заказчиком будет являтся
               юридическое лицо.
               <FORM method="post" action="example">
                <INPUT type="HIDDEN" name="resource" value="RegisterSubject"/>
                 Фамилия, Имя, Отчество(*)<INPUT name="SUBJECT_FIO" value=""/>
                 Наименование организации <INPUT name="SUBJECT_NAME" value=""/>
                 ИНН <INPUT name="SUBJECT_INN" value=""/>
                 Адрес организации <INPUT name="SUBJECT_ADDRESS" value=""/>
                 Адрес доставки <INPUT name="ADDRESS_DELIVERY" value=""/>
                 Телефон(*) <INPUT name="SUBJECT_TEL" value=""/>
                 E-Mail(*)<INPUT name="SUBJECT_EMAIL" value=""/>
                 <INPUT type="submit" value="Зарегистрировать"/>
               </FORM>
             </BODY>
          </HTML>
      
    При записи этого кода использовались следующие соглашения: в атрибуте тэга <FORM> с именем action вводится название Web-приложения (в нашем случае "example"); в форме присутствует скрытое поле с зарезервировнным именем resource и значением равным названию ресурса, который является обработчиком данной формы (в нашем случае "RegisterSubject"). Выполнение данных соглашений гарантирует Вам, что при нажатии кнопки submit будет вызван ресурс url которого можно записать
          http://<hostname>/Gelios/example?resource=<RegisterSubject>
      

    Обработчик формы записывается на языке JAVA. В случае реализации "Капитал CSE" обработчик должен представлять собой класс, имя которого получается добавлением к имени ресурса слова Handler. То есть, в нашем примере класс-обработчик должен называться RegisterSubjectHandler. В случае файловой реализации на имя класса никаких особых ограничений не распространяется.

    Кроме того, данный класс должен быть наследником класса GFormHandler, который расположен в пакете ServiceClass. Например:
          import ServiceClass.*;
          import javax.servlet.http.HttpServletRequest;
          import javax.servlet.http.HttpServletResponse;
    
          public class RegisterSubjectHandler extends GFormHandler
          {
            public void submit(HttpServletRequest request, HttpServletResponse response, GResourceLocator locator) throws java.lang.Exception
            {
             ...
            }
          }
      
    Как видно из примера, базовый класс обработчик GFormHandler содержит ключевой метод submit, который и будет вызван при обработке HTTP-запроса. Остается только реализовать этот метод и откомпилировать обработчик. Для упрощения реализации обработчиков форм разработчики Gelios создали ряд пакетов, в которых располагаются некоторые полезные классы. В пакете gelicon.db есть ряд классов, облегчающих работу с базами данных и БД Капитал CSE (например, класс StoredProc). В пакете gelicon.utils распологаются классы-утилиты, например класс HttpRequestUtils позволяет проверить наличие обязательных параметров в Http запросе, а класс HttpResponseUtils позволяет легко сформировать простой HTML-ответ. Более подробную информацию можно найти в документации по Gelios API. Приведем полный пример обработки регистрационной информации пользователя:
          import java.util.*;
          import java.io.*;
          import java.lang.reflect.*;
          import java.sql.*;
          import javax.servlet.http.HttpServletRequest;
          import javax.servlet.http.HttpServletResponse;
          // это пакеты Gelios API
          import ServiceClass.*;
          import gelicon.utils.*;
          import gelicon.db.*;
          
          // объявление класса-обработчика
          public class RegisterSubjectHandler extends GFormHandler
          {
           // идентификаторы атрибутов БД Капитал
           private Integer id_inetFIO;
           private Integer id_inetMAIL;
           private Integer id_inetTEL;
           private Integer id_inetAddr;
           private Integer id_inetDeliv;
           private Integer id_inetINN;
          
           // реализация конструктора 
           public RegisterSubjectHandler() throws java.lang.Exception
           {
             // обязательно вызвать конструктор супер-класса
             super();
             // получаем ID аттрибутов системы по их кодам
             id_inetFIO = (Integer)gelicon.db.DbAttr.get("inetFIO");
             if(id_inetFIO==null) throw new java.lang.Exception("Attribute wanted 'inetFIO'");
             id_inetMAIL = (Integer)gelicon.db.DbAttr.get("inetMAIL");
             if(id_inetMAIL==null) throw new java.lang.Exception("Attribute wanted 'inetMAIL'");
             id_inetTEL = (Integer)gelicon.db.DbAttr.get("inetTEL");
             if(id_inetTEL==null) throw new java.lang.Exception("Attribute wanted 'inetTEL'");
             id_inetAddr = (Integer)gelicon.db.DbAttr.get("inetAddr");
             if(id_inetAddr==null) throw new java.lang.Exception("Attribute wanted 'inetAddr'");
             id_inetDeliv = (Integer)gelicon.db.DbAttr.get("inetDeliv");
             if(id_inetDeliv==null) throw new java.lang.Exception("Attribute wanted 'inetDeliv'");
             id_inetINN = (Integer)gelicon.db.DbAttr.get("inetINN");
             if(id_inetINN==null) throw new java.lang.Exception("Attribute wanted 'inetINN'");
           }
          
           public void submit(HttpServletRequest request, HttpServletResponse response, GResourceLocator locator) throws java.lang.Exception
           {
            // проверка обязательные поля в HTTP запросе
            if(HttpRequestUtils.checkHttpParameter(new String[]{"SUBJECT_FIO",
                                                   "SUBJECT_TEL","SUBJECT_EMAIL"},request)!=0)
            {
             HttpResponseUtils.setSimpleHTML(response,"<H2>В запросе отсутствуют обязательные параметры</H2>");
             return;
            }
            String sName="";
            String sTmp="";
            Integer sId;
            // получаем connect из pool'а
            pooledConnection.DBConnect dbconnect  = locator.getRootConnect();
            java.sql.Connection connection = dbconnect.getConnect();
            boolean save_auto_commit=connection.getAutoCommit();
            // убираем AutoCommit
            connection.setAutoCommit(false);
            try
            {
              try
              {
               StoredProc proc;
               // добавляем ОАУ
               proc=new StoredProc(connection,"subjectins");
               proc.setParam("CLUSTER_ID",new Integer(37));
               proc.setParam("SUBJECTTYPE_ID",new Integer(2));
               sName=request.getParameter("SUBJECT_FIO");
               if ((request.getParameter("SUBJECT_NAME")!=null)&&
                   (request.getParameter("SUBJECT_NAME").length()!=0)) sName=request.getParameter("SUBJECT_NAME");
               sName=new String(sName.getBytes("Koi8-r"),"Cp1251");
               proc.setParam("SUBJECT_NAME",sName);
               proc.execute();
               sId=(Integer)proc.getParam("SUBJECT_ID");
    
               // устанавливаем признаки ОАУ
               proc=new StoredProc(connection,"SUBJECTATTRIBUTEVALUESET");
                //---------FIO
               proc.setParam("SUBJECT_ID",sId);
               proc.setParam("ATTRIBUTE_ID",id_inetFIO);
               sTmp=request.getParameter("SUBJECT_FIO");
               sTmp=new String(sTmp.getBytes("Koi8-r"),"Cp1251");
               proc.setParam("SUBJECTATTRIBUTEVALUE_VALUE",sTmp);
               proc.execute();
                //---------TEL
               proc.setParam("SUBJECT_ID",sId);
               proc.setParam("ATTRIBUTE_ID",id_inetTEL);
               sTmp=request.getParameter("SUBJECT_TEL");
               sTmp=new String(sTmp.getBytes("Koi8-r"),"Cp1251");
               proc.setParam("SUBJECTATTRIBUTEVALUE_VALUE",sTmp);
               proc.execute();
                //---------EMAIL
               proc.setParam("SUBJECT_ID",sId);
               proc.setParam("ATTRIBUTE_ID",id_inetMAIL);
               sTmp=request.getParameter("SUBJECT_EMAIL");
               sTmp=new String(sTmp.getBytes("Koi8-r"),"Cp1251");
               proc.setParam("SUBJECTATTRIBUTEVALUE_VALUE",sTmp);
               proc.execute();
               //--------------------SUBJECT_INN
               if ((request.getParameter("SUBJECT_INN")!=null)&&
                   (request.getParameter("SUBJECT_INN").length()!=0))
               {
                proc.setParam("SUBJECT_ID",sId);
                proc.setParam("ATTRIBUTE_ID",id_inetINN);
                sTmp=request.getParameter("SUBJECT_INN");
                sTmp=new String(sTmp.getBytes("Koi8-r"),"Cp1251");
                proc.setParam("SUBJECTATTRIBUTEVALUE_VALUE",sTmp);
                proc.execute();
               };
               //--------------------SUBJECT_ADDRESS
               if ((request.getParameter("SUBJECT_ADDRESS")!=null)&&
                   (request.getParameter("SUBJECT_ADDRESS").length()!=0))
               {
                proc.setParam("SUBJECT_ID",sId);
                proc.setParam("ATTRIBUTE_ID",id_inetAddr);
                sTmp=request.getParameter("SUBJECT_ADDRESS");
                sTmp=new String(sTmp.getBytes("Koi8-r"),"Cp1251");
                proc.setParam("SUBJECTATTRIBUTEVALUE_VALUE",sTmp);
                proc.execute();
               };
               //--------------------ADDRESS_DELIVERY
               if ((request.getParameter("ADDRESS_DELIVERY")!=null)&&
                   (request.getParameter("ADDRESS_DELIVERY").length()!=0))
               {
                proc.setParam("SUBJECT_ID",sId);
                proc.setParam("ATTRIBUTE_ID",id_inetDeliv);
                sTmp=request.getParameter("ADDRESS_DELIVERY");
                sTmp=new String(sTmp.getBytes("Koi8-r"),"Cp1251");
                proc.setParam("SUBJECTATTRIBUTEVALUE_VALUE",sTmp);
                proc.execute();
               };
               connection.commit();
               // Если все удачно устанавливаем атрибут сессии
               request.getSession().setAttribute("SUBJECT_ID",sId);
               HttpResponseUtils.setSimpleHTML(response,"<H2>Регистрация прошла успешно</H2>");
               return;
              }
              catch (SQLException ex)
              {
               connection.rollback();
               // генерируем ошибку регистрации
               HttpResponseUtils.setSimpleHTML(response,"<H2>Ошибка регистрации:</H2>"+DbUtils.getMessageSP(ex));
               return;
              }
            }
            finally
            {
             connection.setAutoCommit(save_auto_commit);
             // обязательно закрыть connect, чтобы освободить pool
             dbconnect.close();
            }
           }
          }
      

    Регистрация ресурса
  • В Капитал CSE: создать ресурс с кодом 23:Обработчики форм. Имя ресурса является именем класса реализации без последнего ...Handler.
  • В файлах:
    1) Создать в association.xml регистрационную запись.Например:
    <Association Alias="people_edit_handler" Class="ServiceClass.GFormResource"
                 DataLocation="pages/people/edit/handler"/>
    2) В каталоге указанном в DataLocation нужно создать файл-дескриптор infcfg.xml.
    3) В файле-дескрипторе указать имя класса. Например:
    <Params>
       <CLASS name="RegisterSubjectHandler"/>
    </Params>
    
    4) Создать файл с исходным кодом. Например: RegisterSubjectHandler.java

    XML-ресурсы

    XML ресурсы являются произвольными по структуре данными, записанными на языке XML. Используются для хранения констант и прочей слабо структурированной информации. XML ресурсы можно использовать из динамических ресурсов. Например:
          <?xml version="1.0" encoding="KOI8-R"?>
          <Params caсhe="false">
           <XML name="ImportXML" resource="MyXMLResource"/>
          </Params>
      

    Регистрация ресурса
  • В Капитал CSE: создать ресурс с кодом 22:XML ресурсы
  • В файлах: создать в association.xml регистрационную запись. Например:
    <Association Alias="data.xml" Class="ServiceClass.XmlResource"
                 DataLocation="pages/data/a.xml"/>

    JAVA класс

    JAVA класс - ресурс, позволяющий генерировать XML-данные, представленные в произвольной форме. Ресурс JAVA класс - текстовый ресурс, который представляет собой программный код на языке JAVA. В случае реализации "Капитал CSE" ресурс обязательно должен содержать класс с именем <Название ресурса>Handler являющийся наследником класса GAbstractXMLGenerator и использующий его методы. В случае файловой реализации на имя класса никаких особых ограничений не накладывается. Самым важным из методов, наследуемых и GAbstractXMLGenerator является getXML. Этот метод необходимо реализовать для генерации XML данных. Например:
          import javax.servlet.http.HttpServletResponse;
          import javax.servlet.http.HttpServletRequest;
          import org.apache.xalan.transformer.*;
          import org.apache.xalan.trace.*;
          import java.io.*;
          import org.w3c.dom.*;
          import java.util.*;
          import javax.xml.parsers.*;
          import ServiceClass.*;
          
          public class GenXMLGoodsBoxHandler extends GAbstractXMLGenerator
          {
           // выдает XML-документ
           public org.w3c.dom.Document getXML(HttpServletRequest request, GResourceLocator locator) throws java.lang.Exception
           {
            // формируем фабрику XML-документа с корневым элементом rowset
            DocumentBuilderFactory docFactory = DocumentBuilderFactory.newInstance();
            DocumentBuilder docBuilder = docFactory.newDocumentBuilder();
            org.w3c.dom.Document document = docBuilder.parse(new ByteArrayInputStream("<?xml version=\"1.0\" encoding=\"KOI8-R\" ?> <rowset></rowset>".getBytes()));
            // получаем списки из сессии
            Vector vIds=(Vector)request.getSession().getAttribute("SGOOD_ID");
            Vector vNames=(Vector)request.getSession().getAttribute("SGOOD_NAME");
            Vector vQuantity=(Vector)request.getSession().getAttribute("SGOOD_QUANTITY");
            Vector vPrice=(Vector)request.getSession().getAttribute("SGOOD_PRICE");
            if((vIds==null)||(vNames==null)||(vQuantity==null)||(vPrice==null)) return document;
            // получаем корневой элемент
            Element rootElement=document.getDocumentElement();
            int i; Element row; Element e;double sum;Float q,p;
            // двигаясь по списку добавляем элементы XML-документа
            for(i=0;i<vIds.size();i++)
            {
              row = (Element)rootElement.appendChild(document.createElement("row"));
              e = (Element)row.appendChild(document.createElement("SGOOD_ID"));
              e.appendChild(document.createTextNode(vIds.get(i).toString().trim()));
              e = (Element)row.appendChild(document.createElement("SGOOD_NAME"));
              e.appendChild(document.createTextNode(vNames.get(i).toString().trim()));
              e = (Element)row.appendChild(document.createElement("SGOOD_QUANTITY"));
              e.appendChild(document.createTextNode(vQuantity.get(i).toString().trim()));
              e = (Element)row.appendChild(document.createElement("SGOOD_PRICE"));
              e.appendChild(document.createTextNode(vPrice.get(i).toString().trim()));
          
              e = (Element)row.appendChild(document.createElement("SGOOD_SUMMA"));
              q=(Float)vQuantity.get(i);
              p=(Float)vPrice.get(i);
              sum=q.doubleValue()*p.doubleValue();
              e.appendChild(document.createTextNode(new Float(sum).toString()));
            };
          
            return document;
           }
          };
      
    Пример показывает каким образом данные "корзины покупателя" в некотором электронном магазине преобразуются в XML данные, что позволяет получать и преобразовывать их в конечный HTML документ. "Корзина покупателя" хранится в атрибутах сессии в виде объектов типа Vector с именами SGOOD_ID, SGOOD_NAME, SGOOD_QUANTITY, SGOOD_PRICE.

    Регистрация ресурса
    аналогично регистрации обработчика формы

    Веб-сервис (Web Service)

    Веб-сервис - ресурс, позволяющий получать данные внешним приложениям, которые работают посредством протокола HTTP/SOAP. Ресурс веб-сервис представляет собой программный код на языке JAVA. Методы, описанные как public, будут доступны для выполнения внешними приложениями. Данные передаются в теле HTTP запроса(метод POST)/ответа в виде SOAP (Simple Object Access Protocol) пакета. Чтобы получить информацию о доступных методах, необходимо послать запрос вида:
      http://<server>[:port]/Gelios/<app>?resource=<service>&wsdl=1
    
    В этом случае в теле HTTP ответа будет содержаться WSDL (Web Services Description Language) файл - документ XML, описывающий методы, предоставляемые веб-сервисом.
    Также запрос может быть отправлен методом GET. В этом случае имя вызываемого метода и агрументы передаются в строке запроса:
      http://<server>[:port]/Gelios/<app>?resource=<service>&method=<method_name>[&arg0=<value>[&arg1=<value>[...]]]
    
    Аргументы будут переданы в том порядке, в котором они указаны в строке запроса.

    Регистрация ресурса
    аналогично регистрации обработчика формы

    Практическое руководство

    Создание ресурса отклика на ошибку

    Мы уже упоминали, что в Gelios существует ряд зарезервированных имен ресурсов. Одним из таких ресурсов является ресурс с именем stderrorpage, предназначенный для отклика на ошибку. Если Вы не создадите ресурс с таким именем, то будет использоваться стандартный метод вывода ошибки. Если Вы желаете изменить форму вывода ошибки, то Вам необходимо помнить, что:

  • Ресурс stderrorpage должен быть динамическим документом (см. Динамические документы).
  • Ресурс stderrorpage должен быть общедоступным.
  • В XML данных stderrorpage доступны элементы errorName - ресурс, в котором произошла ошибка, errorMsg - текст сообщения об ошибке, errorClass - класс, обнаруживший ошибку. Пример XSL-преобразователя:
           <?xml version="1.0" encoding="KOI8-R"?>
           <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
           <xsl:output method="html" indent="yes" encoding="KOI8-R"/>
           
           <xsl:template match="/">
             <HTML>
               <HEAD>
                 <TITLE>Ошибка</TITLE>
               </HEAD>
               <BODY>
                 <H1 ALIGN="CENTER">Ошибка<BR/></H1>
                 <B>Ресурс:</B><BR/>
                  <font color='red'>
                   <xsl:value-of select="fullXML/GLOBAL/errorName"/><BR/>
                  </font>
           
                 <B>Текст ошибки:</B><BR/>
                  <font color='red'>
                   <xsl:value-of select="fullXML/GLOBAL/errorMsg"/><BR/>
                  </font>
                 <B>Класс:</B><BR/>
                  <font color='red'>
                   <xsl:value-of select="fullXML/GLOBAL/errorClass"/><BR/>
                  </font>
               </BODY>
             </HTML>
           </xsl:template>
           
           </xsl:stylesheet>
      

    Создание ресурса авторизации

    В Gelios существует ресурс с зарезервированным именем authorization. С примером разработки такого ресурса можно ознакомиться на странице Авторизация пользователя.

    Команды сервера

    В арсенале Gelios существуют специальные команды, которые являются вспомогательными и реализуют административные функции. Именно поэтому такого рода команды можно выполнять не со всех компьютеров. Список IP-адресов с которых можно выполнять команды сервера находится в файле config.xml в теге IPAccess.
    Список команд:

  • reload - перезагружает текущее Web-приложение, при этом: закрывает и вновь открывает connect'ы к БД, вновь создает списки доступа к ресурсам, перегружает константы и атрибуты БД Капитал и т.д.
  • reconnect - закрывает все connect'ы к БД в пуле connect'ов.
  • getXML - загружает динамический ресурс и выдает данные на клиента в виде XML. Имеет обязательный параметр name в котором необходимо указать имя ресурса. Ваш Browser должен поддерживать просмотр XML. Если у Вас установлен MS Explorer 4.x и выше и XML данные не изображаются должным образом, воспользуйтесь командой regsvr32.exe msxml.dll для регистрации поддержки XML в Explorer.
  • compile - выполняет компиляцию некоторых видов ресурсов (Обработчика форм, JAVA-классы и т.д.). Имеет обязательный параметр name в котором необходимо указать имя ресурса.