Описание процесса разработки ресурсов
Статические документы
Динамические документы
Описание инструкций доступа к данным
Структура данных
XSLT-преобразование
Импорт в XSLT
Бинарные ресурсы
Динамические бинарные ресурсы
Обработчики форм
XML-ресурсы
Java классы
Веб-сервисы
Практическое руководство
Создание ресурса отклика на ошибку
Создание ресурса авторизации
Команды сервера
Статический документ представляет собой текстовый документ не требующий специальной обработки на стороне сервера. Самым распространенным случаем, является HTML-документ. В связи с этим, разработка статического документа в Gelios не имеет особенностей.
1) Создать в association.xml регистрационную запись.
<Association Alias="css" Class="ServiceClass.GStaticHTMLResource" DataLocation="pages/css"/>
.
2) В каталоге указанном в DataLocation нужно создать файл-дескриптор infcfg.xml.
3) В файле-дескрипторе указать имя файла-содержимого и другие параметры. Например:Существует альтернативный вариант регистрации: необходимо создать в association.xml регистрационную следующую запись<Params file-charset="koi8-r" charset="utf-8"> <FileName>page.html</FileName> </Params>
.
<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.
1) Создать в association.xml регистрационную запись.
2) В каталоге указанном в DataLocation нужно создать файл-дескриптор infcfg.xml.<Association Alias="example02" Class="ServiceClass.GDynamicHTMLResource" DataLocation="pages/example02"/>
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>
<?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-преобразователя. В качестве
управляющих используются следующие атрибуты:
unconditional
- безусловная архивация, т. е.
архивировать всегда. В дальнейшем предполагается реализовать обработку и других значений,
накладывающих ограничения, например, на объем данных.
Результат выполнения запроса разбивается на группы строк 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". На следующем уровне находятся узлы:
<HTTP> <cluster_id>67</cluster_id> </HTTP>
<GLOBAL> <errorClass/> <errorName/> <errorMsg/> <_date_end>31.07.2002</_date_end> <_date_beg>01.07.2002</_date_beg> </GLOBAL>
<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>Внимание! Имена полей нужно писать заглавными буквами.
Преобразование добытых данных ведется на языке XSLT. Шаблон преобразования в случае файловой реализации располагается в файле-дескрипторе (атрибут transformer). В случае реализации "Капитал CSE" местоположение шаблона указывать не надо. Он располагается в самом ресурсе.
При использовании xsl-комманд import, include и фунции document() аргумент href должен иметь следующий вид:
<источник>::<имя>источник может принимать значения:
имя-ресурса[?параметр=значение[&параметр=значение[...]]]в результате получим XML-поддерево:
<source> <![CDATA[<данные>]]> </source>
имя-ресурсав результате получим XML-поддерево:
<config> <!-- из файла infcfg.xml --> <Params ...> ... </Params> <!-- из файла association.xml --> <Association ...> ... </Association> </config>Внимание, действительно только для фаловой реализации
resource::test?page=1&encoding=windows-1251в результате получим
<?xml version="1.0" encoding="windows-1251"?> <source> <![CDATA[<данные>]]> </source>По умолчанию используется кодировка KOI8-R.
Бинарный ресурс не требует специальной обработки на стороне сервера, в связи с чем, разработка бинарного ресурса в Gelios не имеет особенностей. Самым распространенным случаем, являются различного рода изображения, документы Word и Exel, код апплетов и т.д.
<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.
1) Создать в association.xml регистрационную запись.Например:2) В каталоге указанном в DataLocation нужно создать файл-дескриптор infcfg.xml.<Association Alias="photo" Class="ServiceClass.DynamicPictureResource" DataLocation="pages/people/photo"/>
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(); } } }
1) Создать в association.xml регистрационную запись.Например:2) В каталоге указанном в DataLocation нужно создать файл-дескриптор infcfg.xml.<Association Alias="people_edit_handler" Class="ServiceClass.GFormResource" DataLocation="pages/people/edit/handler"/>
3) В файле-дескрипторе указать имя класса. Например:4) Создать файл с исходным кодом. Например: RegisterSubjectHandler.java<Params> <CLASS name="RegisterSubjectHandler"/> </Params>
<?xml version="1.0" encoding="KOI8-R"?> <Params caсhe="false"> <XML name="ImportXML" resource="MyXMLResource"/> </Params>
<Association Alias="data.xml" Class="ServiceClass.XmlResource"
DataLocation="pages/data/a.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.
http://<server>[:port]/Gelios/<app>?resource=<service>&wsdl=1В этом случае в теле HTTP ответа будет содержаться WSDL (Web Services Description Language) файл - документ XML, описывающий методы, предоставляемые веб-сервисом.
http://<server>[:port]/Gelios/<app>?resource=<service>&method=<method_name>[&arg0=<value>[&arg1=<value>[...]]]Аргументы будут переданы в том порядке, в котором они указаны в строке запроса.
Мы уже упоминали, что в Gelios существует ряд зарезервированных имен ресурсов. Одним из таких ресурсов является ресурс с именем stderrorpage, предназначенный для отклика на ошибку. Если Вы не создадите ресурс с таким именем, то будет использоваться стандартный метод вывода ошибки. Если Вы желаете изменить форму вывода ошибки, то Вам необходимо помнить, что:
<?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.
Список команд: