Перейти к тексту

Нажимая Отправить, Вы принимаете Условия использования developerWorks.

При первом входе в developerWorks для Вас будет создан профиль. Выберите информацию отображаемую в Вашем профиле — скрыть или отобразить поля можно в любой момент.

Вся введенная информация защищена.

  • Закрыть [x]

При первом входе в developerWorks для Вас будет создан профиль и Вам нужно будет выбрать Отображаемое имя. Оно будет выводиться рядом с контентом, опубликованным Вами в developerWorks.

Отображаемое имя должно иметь длину от 3 символов до 31 символа. Ваше Имя в системе должно быть уникальным. В качестве имени по соображениям приватности нельзя использовать контактный e-mail.

Нажимая Отправить, Вы принимаете Условия использования developerWorks.

Вся введенная информация защищена.

  • Закрыть [x]

Сделайте ваше приложение более эффективным при помощи XQuery

Нинг Ян, инженер по программному обеспечению, IBM
Нинг Ян (Ning Yan) работает в качестве инженера по программному обеспечению в IBM. Сфера его профессиональных интересов - разработка web-приложений и бизнес-решений, в том числе DB2, WebSphere®и технологии с открытым исходным кодом. В настоящее время он занимается технологиями социального компьютинга и web-сервисами.

Описание:  Изменение парадигмы построения инфраструктуры web-приложений породило некоторые проблемы. Из этой статьи вы узнаете, насколько эффективным может быть XQuery при столкновении с этими проблемами в процессе создания гибридного приложения.

Дата:  29.01.2007
Уровень сложности:  простой
Активность:  2199 просмотров
Комментарии:  


Приложения Web 2.0, которые отличаются более динамичной работой, часто используют Asynchronous JavaScript и XML (Ajax). Загрузив основной документ HTML, вы можете использовать Ajax для обновления web-контента, не обновляя web-страницу полностью. Благодаря Ajax, можно обрабатывать web-контент в виде фрагментов данных, вызывая каждый из них при необходимости. Кроме того, процессы JavaScript на стороне клиента могут сами форматировать данные, в том числе данные в формате простого текста, XML, объекты JavaScript Object Notation (JSON) или фрагменты HTML.

Новая парадигма разработки web-приложений идет гораздо дальше традиционной модели Model-View-Controller (MVC). К сожалению, многие инфраструктуры web-приложений Ajax, например, Direct Web Remoting, DWR (Непосредственное удаленное web-взаимодействие) и JavaServer Faces (JSF), могут вызывать проблемы. Хотя инфраструктура Ajax может во многом упростить разработку приложений, механизм инфраструктуры не всегда одинаково контролирует web-контент. Многие из существующих инфраструктур Ajax не предоставляют универсальных решений, которые способны справляться со сложностями реального мира, особенно при всевозрастающих требованиях к агрегации данных из XML и синдикации контента из каналов RSS. Эти новые требования диктуют потребность в эффективной поддержке web-сервиса на стороне сервера.

Чтобы воспользоваться преимуществом этих изменившихся технологий, можно создать гибридное приложение, которое комбинирует web-контент c XML-данными и web-сервисами. В этой статье будет продемонстрировано, как создать гибридное приложение, которое использует XQuery, многообещающую технологию для работы с web-сервисами и XML.

Пример гибридного приложения позволяет пользователям осуществлять поиск новых книг в системе публичной библиотеки, которая включает все библиотеки в данном регионе. В каждой библиотеке сотрудники регулярно заказывают новые книги, не зная, есть ли такие книги в других библиотеках. Приложение публикует и предоставляет в общее пользование собственную информацию о хранении через web-сервис. Оно собирает всю информацию о новых книгах по библиотекам и предоставляет пользователям функцию поиска новых книг.

XQuery во спасение

XQuery - это стандарт консорциума W3C, разработанный специально для извлечения информации из XML документов. Его возможности по обработке XML имеют много преимуществ по сравнению с существующими моделями объектного программирования, например, API™ объектной модели документов (Document Object Model, DOM) Java (в разделе Ресурсы можно найти несколько ссылок на сайт IBM developerWorks по этой теме).

Упрощение обработки XML на стороне сервера

Конечно, можно использовать JavaScript для синтаксического разбора и обработки XML в рамках API DOM. Но это не означает, что вы можете использовать JavaScript для любых задач по обработке XML на стороне клиента. Это особенно верно в том случае, когда процессы бизнес-логики становятся более сложными. Одной из главных проблем при разработке web-приложений является поиск равновесия между обработкой XML на стороне клиента и на стороне сервера. XQuery переводит комплекс бизнес-логики на сторону сервера, что имеет ряд преимуществ. Например, можно более тщательно продумать проблемы безопасности и с большей легкостью осуществлять управление приложением. Кроме того, функции XQuery упрощают общие затраты ресурсов на разработку.

Ограничение объема контента, передаваемого по сети

При разработке web-приложения необходимо решить, какой объем контента предполагается и как часто он будет передаваться по сети. Каждый вызов сервера увеличивает нагрузку. Избегайте асинхронных вызовов при каждом нажатии на клавиатуру или движении мыши. Если вы неправильно используете вызовы сервера, то можете легко нарушить передачу данных приложением из-за ненужного сетевого трафика и загрузки.

При сетевом коммутируемом подключении со скоростью 56K на передачу 100 кБайт контента требуется 14 секунд. XQuery предоставляет пользователю лучшие возможности для работы, уменьшая объем контента, передаваемого по сети. Например, чтобы ограничить объем контента XML, можно вызвать стандартную функцию XQuery string-length() до того, как будет возвращен XML. Вместо того, чтобы ограничивать объем контента XML, наш пример приложения ограничивает размер объектов XML 100 экземплярами книг, считая узлы.

Интеграция нескольких полей поиска

Иногда системы web-поиска используют несколько полей ввода для критериев поиска. Например, наш пример приложения предлагает пользователям три варианта на выбор. Они могут ввести данные в одно из полей или в любую комбинацию этих полей, в том числе и во все три поля. Функциии XQuery в сочетании с выражениями пути XPath предоставляют эффективный механизм поиска для реализации требований к поиску.

Интеграция бизнес-логики без дополнительного программирования

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


Пример приложения

Рисунок 1 демонстрирует пример приложения. Ответы сервера могут быть в любом удобном для клиента формате, в том числе, HTML, XML, простом текстовом формате или в виде объекта JSON. Встроенный механизм XQuery выполняет заранее определенный запрос, основываясь на динамических критериях поиска. Вы определяете бизнес-логику и представление логики в запросах. Данные XML могут поступать из различных ресурсов данных, таких как файловая система, база данных или URI, который представляет web-сервис стандарта REST (Representational State Transfer, протокол передачи состояния для интерпретации в представлении).


Рисунок 1. Принципиальная схема примера приложения
Принципиальная схема примера приложения

Встраивание механизма XQuery

Механизм XQuery можно встроить в приложение при помощи базового сервлета Java. Вы можете выбрать любой из множества механизмов XQuery, коммерческий или с открытым исходным кодом. В этом приложении используется механизм с открытым исходным кодом Saxon 8.7 (см. листинг 1).


Листинг 1. Встраивание механизма XQuery Saxon

Configuration config = new Configuration();
staticQueryContext = new StaticQueryContext(config);
dynamicQueryContext = new DynamicQueryContext(config);

Сбор XML данных и определение форматов данных

Для сбора XML-данных необходимо решить, откуда будут поступать XML-данные, нужно ли использовать описание типа документа (шаблон DTD) или схему и нужно ли валидировать XML. Наше приложение использует для форматирования данных шаблон DTD и предполагает, что все источники данных перед обработкой XQuery являются корректными по DTD документами. Листинг 2 показывает пример форматирования XML-данных.


Листинг 2. Пример форматирования XML-данных

<?xml version="1.0" encoding="UTF-8"? >
<!DOCTYPE library SYSTEM "dtd/book.dtd">
<booklist>
<book category="COOKING">
  <title lang="en">Everyday Italian</title>
  <authors>
  	<author>Giada De Laurentiis</author>
  </authors>
  <isbn></isbn>
  <numberCopies>1</numberCopies>
  <status>On Shelf</status>
  <year>2005</year>
  <library>John C. Hart Library</library>
  <price>30.00</price>
</book>
...
</booklist>
	      

Описание запросов XQuery при помощи бизнес-логики

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

Данные XML могут поступать из множества ресурсов. Файл book_collection.xml file описывает коллекцию XML-данных. Один из источников данных XML принадлежит самому нашему примеру web-приложения и находится на узле http://localhost:9080/bookinfor/newbooks_localhost.xml. Тестируя пример приложения, убедитесь, что вы правильно задали корневой каталог контекста web-приложения как bookinfor. В листинге 3 показан сбор XML-данных.


Listing 3. XQuery collection

<collection >
<doc href="newbooks_library_01.xml"/>
<doc href="newbooks_library_02.xml"/>
<doc href="newbooks_library_03.xml"/>
<doc href="newbooks_library_04.xml"/>
<doc href="http://localhost:9080/bookinfor/newbooks_localhost.xml"/>
</collection>

При разработке web-приложения XQuery обязательно учитывайте вопросы производительности. В этом случае я задал порог вывода результатов поиска в 100 книг. По сравнению с обычным объектным программированием, например, Java, XQuery может реализовать бизнес-логику без необходимости программирования на стороне сервера. Работая с большими объемами XML-данных, вы можете сочетать встроенный механизм XQuery с версией IBM DB2 Viper, которая способна манипулировать большим объемом контента XML (до 2GB). В листинге 4 иллюстрируется бизнес-логика приложения в файле booklist_app.xql.


Листинг 4. XQuery с простой бизнес-логикой

(: -------------------------- :)
(: -------------------------- :)(:            :)
(: -------------------------- :)
declare namespace local = "http://localhost/ns";
declare variable $title as xs:string external;
declare variable $author as xs:string external;
declare variable $year as xs:string external;
declare variable $emptymsg as xs:string external;
declare variable $oversizedmsg as xs:string external;
declare variable $outputformat as xs:string external;
(: -------------------------- :)
(: functions                  :)
(: -------------------------- :)
declare function local:error_view($helpmsg as xs:string) {
    if($helpmsg) then $helpmsg 
    else ('<report status="0">Please call 1-800-123-4567</report>')
};
declare function local:html_view($doc) {
    <table>
    <tr> <td>Library Name</td>
         <td>Book Title</td>
         <td>Number of Copies</td>
         <td>Status</td>
    </tr>
    {   for $book in $doc/book
            where $book/title/@lang="en"
            order by $book/library
        return <tr>
                    <td>{$book/library}</td>
                    <td>{$book/title/text()}</td>
                    <td>{$book/numberCopies}</td>
                    <td>{$book/status}</td>
                </tr>
    }
    </table>
};
(: -------------------------- :)
(: the business logic         :)
(: -------------------------- :)
let $docs := ('bookinfor/book_collection.xml')
let $searchdoc := (
<report status='1'>
{
    if($title and $year and $author) then (
        for $doc in collection($docs)//booklist/book[contains(title,$title) 
                and (year = $year)]
        where contains($doc//authors, $author)
        return $doc	
    ) else if($title and $year ) then (
        for $doc in collection($docs)//booklist/book[contains(title,$title) 
                and (year = $year)]
        order by $doc//booklist/book/title
        return ($doc)
    ) else if($title and $author ) then (
        for $doc in collection($docs)//booklist/book[contains(title,$title)]
        where contains($doc//authors, $author)
        order by $doc//booklist/book/title
        return ($doc)
    ) else if($author and $year ) then (
        for $doc in collection($docs)//booklist/book[(year=$year)]
        where contains($doc//authors, $author)
        order by $doc//booklist/book/title
    return ($doc)
    ) else if($title) then (
        for $doc in collection($docs)//booklist/book[contains(title,$title)]
        order by $doc//booklist/book/title 
        return ($doc)
    ) else if($author) then (
        for $doc in collection($docs)//booklist/book
        where contains($doc//authors, $author)
        order by $doc//booklist/book/title
        return ($doc)
    ) else if($year) then (
        for $doc in collection($docs)//booklist/book[(year=$year)]
        order by $doc//booklist/book/title 
        return ($doc)
    ) else (
        for $doc in collection($docs)
        return ($doc//booklist/book) 
    )	
}
</report>
)
(: -------------------------- :)
(: return results             :)
(: -------------------------- :)
return  if(count($searchdoc//book) eq 0) then local:error_view($emptymsg ) 
        else if(count($searchdoc//book) gt 100) 
            then local:error_view($oversizedmsg) 
            else if($outputformat eq $html)
                then local:html_view($searchdoc)
                else $searchdoc 

Вызов запросов XQuery в приложении

Чтобы добиться выполнения запросов встроенным механизмом, вам необходимо задать относительные параметры и перекомпилировать запрос. После выполнения запроса окончательный вывод пересылается обратно web-клиенту. Программа JavaScript осуществляет сборку данных и создает их представление для пользователя. Обратите внимание, что наше приложение устанавливает каталог c:/tmp/xmldatasources/ в качестве каталога статического контекста запроса. Убедитесь, что в этом каталоге существует каталог bookinfor и скопируйте в него файлы XML-данных до тестирования примера приложения. Листинг 5 иллюстрирует вызовы встроенного механизма XQuery.


Листинг 5. Вызов запросов XQuery в приложении

dynamicQueryContext.setParameter("emptymsg", "No results exist!");
dynamicQueryContext.setParameter("oversizedmsg", 
                                   "Too many results, please refine queries");
  		
staticQueryContext.setBaseURI("c:/tmp/xmldatasources/");
fileReader = new FileReader(request.getRealPath("/")+  "/queries/booklist_app.xql");
queryExpression = staticQueryContext.compileQuery(fileReader);  
  		 
writer = new StringWriter();
StreamResult result = new StreamResult(writer);
Properties props = new Properties();
queryExpression.run(dynamicQueryContext, result, props);
retContent = writer.getBuffer();	      


Заключение

Обратите внимание, что технология XQuery все еще имеет некоторые ограничения и достаточно сложную кривую обучения. Имейте в виду, что ни одна технология не может решить всех бизнес-проблем. Скорее всего, вам и дальше придется комбинировать XQuery с другими технологиями, например, с XPath и XSLT, чтобы добиться доступности гибридных приложений.

Хотя XQuery до сих пор не имеет окончательного стандарта, его основные функции и свойства привлекают повышенное внимание. Эта технология эффективна при обработке XML и демонстрирует большой потенциал в настройке гибридных приложений. Реализовав динамичное web-приложение при помощи XQuery, вы сможете быстро масштабировать свой web-сайт и решить бизнес-задачи сравнительно простым и быстрым способом.



Загрузка

ОписаниеИмяРазмерМетод загрузки
Sample code for XQuery to power mashupsx-xquerymashup.zip12KBHTTP

Информация о методах загрузки


Ресурсы

Научиться

Получить продукты и технологии

Обсудить

Об авторе

Нинг Ян (Ning Yan) работает в качестве инженера по программному обеспечению в IBM. Сфера его профессиональных интересов - разработка web-приложений и бизнес-решений, в том числе DB2, WebSphere®и технологии с открытым исходным кодом. В настоящее время он занимается технологиями социального компьютинга и web-сервисами.

Помощь по сообщениям о нарушениях

Сообщение о нарушениях

Спасибо. Эта запись была помечена для модератора.


Помощь по сообщениям о нарушениях

Сообщение о нарушениях

Сообщение о нарушении не было отправлено. Попробуйте, пожалуйста, позже.


developerWorks: вход


Нужен IBM ID?
Забыли Ваш IBM ID?


Забыли Ваш пароль?
Изменить пароль

Нажимая Отправить, Вы принимаете Условия использования developerWorks.

 


При первом входе в developerWorks для Вас будет создан профиль. Выберите информацию отображаемую в Вашем профиле — скрыть или отобразить поля можно в любой момент.

Выберите ваше отображаемое имя

При первом входе в developerWorks для Вас будет создан профиль и Вам нужно будет выбрать Отображаемое имя. Оно будет выводиться рядом с контентом, опубликованным Вами в developerWorks.

Отображаемое имя должно иметь длину от 3 символов до 31 символа. Ваше Имя в системе должно быть уникальным. В качестве имени по соображениям приватности нельзя использовать контактный e-mail.

(Должно содержать от 3 до 31 символа.)


Нажимая Отправить, Вы принимаете Условия использования developerWorks.

 


Оценить эту статью

Комментарии

static.content.url=http://www.ibm.com/developerworks/js/artrating/
SITE_ID=40
Zone=XML
ArticleID=192677
ArticleTitle=Сделайте ваше приложение более эффективным при помощи XQuery
publish-date=01292007
author1-email=nyan@us.ibm.com
author1-email-cc=

Теги

Help
Используйте форму поиска, чтобы найти любой контент с данным тегом в My developerWorks. Используйте ползунок, чтобы отразить больше или меньше тегов.

КнопкаПопулярные теги отображает самые распространенные теги для данной области контента (например: Java, Linux, WebSphere).

Кнопка Мои теги отображает Ваши теги для данной области контента (например: Java, Linux, WebSphere).

Используйте форму поиска, чтобы найти любой контент с данным тегом в My developerWorks. Кнопка Популярные теги отображает самые распространенные теги для данной области контента (например: Java, Linux, WebSphere). Кнопка Мои теги отображает Ваши теги для данной области контента (например: Java, Linux, WebSphere).