Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Java EE (J2EE) и Spring > Синхронизация и фрагментирование XML-данных


Автор: azalia 7.4.2010, 17:22
Необходим совет в выборе наилучшего оптимального и более производительного решения следующей задачи, т.е. "толчок в нужном направлении" smile

Надо XML-документ передавать удаленно клиенту в браузер, причем не целиком,  а только те данные, которые он запрашивает, т.к. сам xml-файл большой. Потом клиент из этих данных выбирает нужные, задает необходимые значения и отсылат назад ввиде какого-то нового XML-файла. Причем перед отсылкой данных, данные вновь синхронизируются с удаленным файлом XML, на наличие изменений. И если изменения есть и они как-то негативно сказываются на выборе клиента (например, не хватает уже нужного количества), то сообщать ему.

Сам файл выгружается из базы и помещается на web-сервер (доступ в саму базу закрыт из вне). Так же хотелось бы реализовать, чтобы в базе при обновлении данных выгружались только те данные, которые обновляются, т.е. своего рода синхронизация. Но это, наверно, реализуется самой базой и не относится к самому XML? А может его структуру надо формировать каким-то специальным образом?

Нашла в инете много решений по парсингу xml при помощи java-технологий (к чему я более всего и склоняюсь). Наверно, еще придется использовать Ajax (чего мне не очень хочется, т.к. я им не владею). Но среди всех этих решений я не нашла ответ на вопрос, передается ли документ целиком клиенту перед тем как его разбирать и выводить на страницу, либо весь документ передается в память и там разбирается...

Подскажите, а?  smile

Автор: diadiavova 7.4.2010, 18:13
Цитата(azalia @  7.4.2010,  18:22 Найти цитируемый пост)
 Но это, наверно, реализуется самой базой и не относится к самому XML?

Если честно, то я в вопросе не увидел вообще ничего, что относиось бы к самому XML. Всё это решается средствами той технологии, которая используется на сервере(ява так ява).

Автор: azalia 7.4.2010, 18:19
Цитата(diadiavova @ 7.4.2010,  18:13)
Цитата(azalia @  7.4.2010,  18:22 Найти цитируемый пост)
 Но это, наверно, реализуется самой базой и не относится к самому XML?

Если честно, то я в вопросе не увидел вообще ничего, что относиось бы к самому XML. Всё это решается средствами той технологии, которая используется на сервере(ява так ява).

а XPath не поможет?

Автор: diadiavova 7.4.2010, 18:23
Цитата(azalia @  7.4.2010,  19:19 Найти цитируемый пост)
а XPath не поможет? 

Если на сервере просто лежит хмл-документ, то запросить его часть, описанную через XPath невозможно. Документ придёт полностью. То что тебе нужно, делается при помощи серверного скрипта, для того, чтобы на сервере из документа были выбраныкакие-то данные надо там запустить какую-то программу, но хмл - не рограмма, он просто описывает данные.

Автор: azalia 7.4.2010, 18:31
Цитата(diadiavova @ 7.4.2010,  18:23)
Цитата(azalia @  7.4.2010,  19:19 Найти цитируемый пост)
а XPath не поможет? 

Если на сервере просто лежит хмл-документ, то запросить его часть, описанную через XPath невозможно. Документ придёт полностью. То что тебе нужно, делается при помощи серверного скрипта, для того, чтобы на сервере из документа были выбраныкакие-то данные надо там запустить какую-то программу, но хмл - не рограмма, он просто описывает данные.

Понятно, спасибо! А как мне теперь перенести эту тему, например в J2EE? Или может на форуме есть специальный раздел, где решаются подобного рода задачи и продумывается в целом архитектура приложения?

Автор: diadiavova 7.4.2010, 18:37
Цитата(azalia @  7.4.2010,  19:31 Найти цитируемый пост)
А как мне теперь перенести эту тему, например в J2EE?

Это к модератору раздела.
Цитата(azalia @  7.4.2010,  19:31 Найти цитируемый пост)
Или может на форуме есть специальный раздел, где решаются подобного рода задачи 

Специальный раздел зависит от используемой технологии.
Цитата(azalia @  7.4.2010,  19:31 Найти цитируемый пост)
 продумывается в целом архитектура приложения

Это, видимо, сюда
http://forum.vingrad.ru/forum/tech-system-analyse-analysis-designing-projection-uml-unified-modeling.html

Автор: azalia 7.4.2010, 18:42
Спасибо за помощь diadiavova!!! Огромный респект ;)

Автор: azalia 8.4.2010, 09:12
что-то тишина...может я не так выразилась или снова не по теме...придется наверно разбить задачу на несколько мелких...

я конечно новичок в этом деле и только учусь, но в общем основная идея, которую бы я хотела решить при помощи J2EE -технологий с применением Servlets, JSP, JAXP и т.д. состоит в следующем:

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

Автор: batigoal 9.4.2010, 16:28
Цитата(azalia @  8.4.2010,  10:12 Найти цитируемый пост)
как мне использовать 1 большой XML-файл частями? А именно, могу ли я создать 2 сервелета, один из которых бы парсил структуру XML так, чтобы выделять из него основные заголовки, а другим сервелетом подтягивать уже нужные данные в зависимости от выбранного заголовка (т.е.скорее всего получится вложенность сервелетов). Делают ли так?

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

Автор: azalia 9.4.2010, 22:10
Цитата(batigoal @  9.4.2010,  16:28 Найти цитируемый пост)
Ну только не понятно, почему именно два сервлета. 


Спасибо batigoal, что откликнулся на мою проблему, а то я уже начала терять надежду на получение каких-либо ответов smile)) Это я делаю своего рода курсовик, поэтому наверно с виду проблема кажется немного странной. 

Описываю ситуацию более подробно, как я вижу:

Клиент заходит на jsp страницу и запускает функцию просмотра товаров, т.е. в этот момент идет запрос на сервер и запускается Сервелет №1. Этот сервелет парсит структуру xml так, чтобы выделить из нее только основные заголовки. В этот момент не нужны все данные, т.к. клиент может вообще ничего не заказать, увидев просто, что предлагается к продаже (если парсить сразу все и ему выводить, то зачем ему ждать пока загрузятся все 10000 товаров (а может и больше), сгруппированных по отдельным классификационным признакам). 
Потом клиент выбирает нужную группу товаров и раскрывает ее. В этот момент идет запрос на сервер и запускается Сервелет№2 , который в зависимости от выбранной группы при помощи Сервелета №1 подгужает какие-нибудь 300-400 позиций...Далее клиент выставляет нужное количество и отправляет запрос. (этот момент еще пока не продуман).

Думаю тут придется еще и Ajax прикручивать, чтобы вся страница не обновлялась в момент повторных запросов...(но этот момент тоже пока не продуман и ajax-ом не владею).

Автор: dobrolub 10.4.2010, 00:01
1. Думайте об XML как о базе данных к которой нужно создать механизм доступа
  1. Изучите SAX парсер
2. Думайте об Сервлете как о промежуточном звене между механизмом доступа к данным и запросом
3. Думайте о странице как о статическом  HTML документе с java-script который посылает и принимает запросы от сервлета 
4. Сервлет может быть один. Он, в зависимости от параметров, будет ответственнен за
 а. Отсылку каталога в короткой форме
 б. Приём запроса резервирования
 в. Обработку запроса резервирования и отсылке ответа
   в.1 - ответ:1 (данные на сервере не изменились)
   в.2 - ответ:2 (данные на сервере изменились)
5. Думайте о java-scripte как о коммуникационном механизме и механизме обновления HTML на странице.
  а. - почитайте о HTML +Ajax   http://www.ibm.com/developerworks/ru/library/wa-ajaxintro1/ 
  б. Научитесь добавлять элемент к элементу в HTML
  в. Научитесь посылать запрос к сервлету.

Для пункта 1, создайте структры для отражения XML в виде java объектов для представления данных в коротком виде и подробном.
Механизм доступа - класс доступа лучше писать и отлаживать как простой java объект с методом main(String []args). Так будет проще всего отладить.

удачи!

Автор: azalia 10.4.2010, 00:17
Цитата(dobrolub @  10.4.2010,  00:01 Найти цитируемый пост)
4. Сервлет может быть один. Он, в зависимости от параметров, будет ответственнен за
 а. Отсылку каталога в короткой форме
 б. Приём запроса резервирования
 в. Обработку запроса резервирования и отсылке ответа
   в.1 - ответ:1 (данные на сервере не изменились)
   в.2 - ответ:2 (данные на сервере изменились)


Спасибо, dobrolub за столь подробный ответ! smile
Но, только я снова не поняла один момент...В какой момент будет отсылаться длинная форма каталога? И где будет "связка"?

Автор: dobrolub 10.4.2010, 00:38
Это в в.1. Данные не изменились - высылаем положительный ответ вместе с данными в подробной форме.

Автор: azalia 10.4.2010, 00:47
Цитата(dobrolub @  10.4.2010,  00:38 Найти цитируемый пост)
Это в в.1. Данные не изменились - высылаем положительный ответ вместе с данными в подробной форме. 


Таким образом, получается, что сервелет сразу парсит весь документ, хранит в памяти сервера всю структуру и по первому запросу выдает сначала короткий вид каталога (по первому java-классу для короткого вида), а при выборе клиентом во втором запросе (вызывается сервелетом второй java-класс для подробного вида) выдает подробную форму? 

Память занимаемая в этот момент сервелетом разделяемая для всех последующих новых запросов или каждый раз отводится новая?

Автор: dobrolub 10.4.2010, 01:04
XML желательно парсить только когда состояние в памяти и состояние на файловой системе различное. Обычно это делают по первому запросу. Назовём его для упрощения DataManager.
примерно так в псевдо-коде
Код

class DataManager {
  public static DataManager _dataManager; // класс будет Singleton - одна instance на всё приложение
  public Object _object;//parsed xml data


  public static DataManager getInstance() {
    if (_dataManager == null)
      _dataManager = new DataManager();

     return _dataManager;
  }
  private DataManager() {}//constructor

  public ShortData[] getShortData() {
    if (_data == null || fileChanged()) {
      load();
    }

   return _data;
  }
}



Код

public class MyServlet extends HttpSerlvet {
  //oтвечает на http://localhost/myservlet?op=shortdata
  public void service(HttpServletRequest req, HttpServletResponse res) {
    if ("shortdata".equals(req.getParameter("op")) {
      DataManager manager = DataManager.getInstance();
      res.writeAjaxResponse(manager.getShortData());
    }
  }
}


Автор: azalia 10.4.2010, 01:27
спасибо dobrolub  за подсказку ;) надо будет конечно мне еще много чего почитать...

у меня вот возник еще один попутный вопрос:

а не нужно ли проверять принимаемые данные на валидность? ведь, как я понимаю, должен в результате получиться новый xml-файл присланный от клиента с нужным списком товаров.

Автор: dobrolub 10.4.2010, 01:33
Для курсовой - не нужно. А объяснить можно тем, что запрос-то строиться в JavaScripte поэтому его правильность гарантирована тестированием. Такое объяснение должно устроить препода.

Единственная проверка, как и сказано в задании, проверка изменения файла, которое, если произошло, обрабатывается в своём логическом блоке.

Автор: azalia 10.4.2010, 01:39
ок, попробую данную схему изложить преподу, надеюсь понравится ;) если что - отпишусь  smile 

Автор: azalia 13.4.2010, 12:33
препод сказал, что нормально ;) Осталось только обосновать такой выбор.

спасибо dobrolub! вы мне очень помогли  smile  

Автор: dobrolub 13.4.2010, 18:02
Ну вот и здорово! Удачи!

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)