[java] вопрос про "подмену" SAX хендлера в сервлете
посмотри как в стратсе контроллерсервлет сделан...
тебе нужно примерно то же самое, тока нужный хендлер будет выбираться не по урлу, а по твоему тегу.
тебе нужно примерно то же самое, тока нужный хендлер будет выбираться не по урлу, а по твоему тегу.
по какому пртоколу ходят xml -сообщения? если по http, то тогда слать мессагу с параметрами, а по параметру узнавать какой обработчик подставлять
я не специалист по java 
что такое "стратс" ?

что такое "стратс" ?
если от клиента может придти что-то что-то кроме того xml, то берется банальный стратс и все
но
1) самому клиенту дополнительно указывать тип сложно\некрасиво
2) зачем тогда дублировать инфу о типе в мессаге?
но
1) самому клиенту дополнительно указывать тип сложно\некрасиво
2) зачем тогда дублировать инфу о типе в мессаге?
да, по http
вариант указания типа xml-сообщения через параметр урла был, но не очень хочется, т.к. можно конфликты получить
хотелось бы что-то типа: главный обработчик принимает xml, определяет его тип, а дальше отдаёт всё данные по этому пакему специализированному обработчику
вариант указания типа xml-сообщения через параметр урла был, но не очень хочется, т.к. можно конфликты получить
хотелось бы что-то типа: главный обработчик принимает xml, определяет его тип, а дальше отдаёт всё данные по этому пакему специализированному обработчику
http://struts.apache.org
Читать вот это надо -
Читать вот это надо -
А нельзя написать составной хендлер? Типа сначала он смотрит, что за тэг, и в зависимости от него создает нужный хендлер, которому начинает делегировать все методы.
как я понимаю, самая большая проблема в request.getInputStream т.е. xml-файл у нас не статический, а получается по сетке
в впринципе, можно сначала сохранить его в файл на диске, а потом уже обрабатывать, но как-то это некрасиво
в впринципе, можно сначала сохранить его в файл на диске, а потом уже обрабатывать, но как-то это некрасиво

хотя я тут глянул, что есть setContentHandler
лучше наверно через нее переключить на нужный хендлер, после того как первый хендлер с тэгом разберется
лучше наверно через нее переключить на нужный хендлер, после того как первый хендлер с тэгом разберется
>xml-файл у нас не статический, а получается по сетке
а какая разница?
а какая разница?
>xml-файл у нас не статический, а получается по сеткевозможно, я не прав, но я считал, что из request.getInputStream невозможнго читать по второму разу
а какая разница?
т.е. после отработки основного хендолера на этом потоке поток станет пустым
а если xml есть в виде файла, то можно сначала разобрать его основных хендлером, определить его тип, а затем повторно разобрать нужным
я думал, что этот тэг где-то в начале, а после него идет часть документа, которую нужно парсить разными хендлерами
а у тебя тег, где-то в середине? т.е. нужно вернуться вначало?
а у тебя тег, где-то в середине? т.е. нужно вернуться вначало?
xml имеет следующий формат:
т.е. всё упирается в action
Хотелось бы для каждого типа action иметь свой обработчик, а то в одном уже стало сложно разбираться
если предложишь решение, буду рад
<startxml>
<>
....
<action name='add|get|list|index|search|...'>
.....
</action>
</startxml>
т.е. всё упирается в action
Хотелось бы для каждого типа action иметь свой обработчик, а то в одном уже стало сложно разбираться
если предложишь решение, буду рад

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

ну тогда в чем проблема
делаешь хендлер, который обрабатывает все до action
а при обработке action переключаешь парсер на новый хеyдлер, который зависит от типа action
делаешь хендлер, который обрабатывает все до action
а при обработке action переключаешь парсер на новый хеyдлер, который зависит от типа action
в том-то и проблема, что я не знаю, как это сделать 
с явой не очень в ладах

с явой не очень в ладах
а что у тебя parser? какого типа переменная?
javax.xml.parsers.SAXParser parser = javax.xml.parsers.SAXParserFactory.newInstance.newSAXParser;
заведи в своем основном хендлере поле parser, чтобы ссылаться на парсер
а потом при обработке action попробуй создать другой хендлер и переключится на него
parser.getXMLReader.setContentHandler(newHandler)
а потом при обработке action попробуй создать другой хендлер и переключится на него
parser.getXMLReader.setContentHandler(newHandler)
спасибо!
попробую
попробую

может нужно еще переключить
setDTDHandler(newHandler)
setEntityResolver(newHandler)
setErrorHandler(newHandler)
хотя если они от action не зависят, то и не надо
setDTDHandler(newHandler)
setEntityResolver(newHandler)
setErrorHandler(newHandler)
хотя если они от action не зависят, то и не надо

ИМХО, тебе надо написать нечто вроде композитного хандлера, который на определенном этапе внутри себя сам переключается на нужную логику.
Надеюсь, ты понял, что я хотел сказать
Надеюсь, ты понял, что я хотел сказать

Фактически ему надо то, что ищет в соседнем треде.
У меня общая задача, а тут частная, которую на java сделать должно быть сильно проще, чем общую.
ИМХО, тебе надо написать нечто вроде композитного хандлера, который на определенном этапе внутри себя сам переключается на нужную логику.это тоже что и
Надеюсь, ты понял, что я хотел сказать
А нельзя написать составной хендлер? Типа сначала он смотрит, что за тэг, и в зависимости от него создает нужный хендлер, которому начинает делегировать все методы.
?
Да, тоже самое, меня только смутило, что ты потом упомянул "переключить" и всякие методы типа setContentHandler, а тут правильнее именно делегировать и все.
а что плохого в том, чтобы переключать сам парсер на новый хендлер
плохо хотя бы тем, что для этого хандлер должен знать о существовании парсера.
А что в этом плохого?
Можно хранить ссылку не на SAXParser, а на XMLReader, он то всегда будет, при любых реализациях.
Потом в хендлере все равно должен быть контекст, которые определяет текущий разбор, например, какие-то структуры куда данные кладутся. Поэтому хендлер создается непосредственно перед самими разбором, т.е. когда парсер уже есть.
Хотя с другой стороны вариант с делегированием позволяет при более сложной делегации сделать проще альтернативные хендлеры. Это могут быть вообще не sax хендлеры, а что-то более семантически ориентированное.
Не знаю. Как обычно вариантов море. Какой выбрать, чтобы было кода поменьше, реализация погибче и т.д.? Иногда проще не думать, а запрограть как получается. Смотришь, а оно не так плохо и вышло.
Можно хранить ссылку не на SAXParser, а на XMLReader, он то всегда будет, при любых реализациях.Потом в хендлере все равно должен быть контекст, которые определяет текущий разбор, например, какие-то структуры куда данные кладутся. Поэтому хендлер создается непосредственно перед самими разбором, т.е. когда парсер уже есть.
Хотя с другой стороны вариант с делегированием позволяет при более сложной делегации сделать проще альтернативные хендлеры. Это могут быть вообще не sax хендлеры, а что-то более семантически ориентированное.
Не знаю. Как обычно вариантов море. Какой выбрать, чтобы было кода поменьше, реализация погибче и т.д.? Иногда проще не думать, а запрограть как получается. Смотришь, а оно не так плохо и вышло.

всем спасибо 
есть ещё один довольно тупой вопрос - что такое "делигирование"?
скорее всего я знаю, что это такое, но в другой терминологии

есть ещё один довольно тупой вопрос - что такое "делигирование"?

скорее всего я знаю, что это такое, но в другой терминологии
Делегирование. У этого слова несколько значений. В ООП это означает перенаправление сообщений одним объектом другому, уполномоченному.
т.е., например, в startElement вставить банальный if на выбор нужного обработчика и вызвать метод этого обработчика с нашими параметрами?
Да, только обычно без if обходятся. Можно сделать поле в общем хендлере, которое ссылается на другой хендлер, которому хотим делегировать, и сделать реализацию методов, как вызов методов у этого другого хендлера по ссылке через это поле. Тогда, чтобы переключится на новый хендлер, нужно просто записать в поле ссылку на новый хендлер.
Оставить комментарий
myrka68
такая ситуация:есть некий сервлет(скорее всего, это не важно который принимает различные xml-пакеты и как-то на них реагирует.
сейчас это сделано так:
до недавнего времени вариация входных xml-пакетов была незначительной, поэтому обработка была сделана в одном хендлере.
что хочется: хочется, чтобы сначала мы поняли, что за xml пришёл (там есть тег для этого а потом "натравили" на него нужный хендлер
наверняка, подмена обработчика - это стандартный механизм
вопрос, как это сделать правильно?