Подобие указателя на функцию или целый класс как аргумент сервлету?

  • Автор темы J-Pro
  • Дата начала
Статус
Закрыто для дальнейших ответов.
J

J-Pro

#1
Всем привет.

На форуме я новенький, но не в программировании :)
Год назад перешёл с С++ на Яву, нравится, пишу веб-приложения.

Есть такой вопрос: есть задача написать сервлет, создающий из буфера, в котором содержится XML-документ, другой документ - xls, то есть Microsoft Excel'я. Существует около 50-ти различных функций, генерирующих ХМЛ-документ, который впоследствие должен будет преобразиться в экзелевский, попадя в сервлет.

Вопрос в следующем: как сервлету передать:
  1. ЛИБО весь ХМЛ-документ в виде класса Document, можно ли, к примеру, методом POST?
  2. ЛИБО весь ХМЛ-документ в виде непосредственно буфера с тэгами, тем же POST'ом? Возможно? И правильно ли?
  3. ЛИБО каким-то образом передать подобие указателя на функцию?
Играться с кучей параметров, switch'ем - это слишком громоздко, к тому же, если передавать какие-то константы в виде параметров, а потом, в свиче вызывать необходимую ф-цию, придётся передавать и параметры для ф-ции. Это слишком громоздко.

Возможен ли один из трёх вышеперечисленных вариантов? И какой наиболее оптимальный? Если третий, то как вообще это реализовать?
 

LuMee

Well-known member
02.05.2006
477
0
#2
Что-то не совсем понятно. Нужно передать xml-документ с клиента на сервер? Тогда нужно освоиться с вопросами загрузки файлов, или использовать готовые компоненты, типа Jakarta Commons FileUpload.
А указателей на функцию в Java нет, вместо этого используются интерфейсы.
 
J

J-Pro

#3
Нет, дело в том, что есть 50, к примеру, ф-ций, каждая из которых читает какую-то информацию и преобразует её в XML-документ. Структура этих документов, в принципе, одинакова, из каждого можно сделать таблицу. Разве что количество столбцов и записей отличается.

Поясню, у меня есть веб-приложение, состоящее из JSP и сервлетов. Естественно, есть свои классы, как-то читающие и преобразующие данные.

Так вот, я хочу создать сервлет, который будет получать либо что-то вроде указателя на необходимую ф-цию, которая будет возвращать нужный XML, либо XML-буфер, либо класс Document, в котором и будет XML. Просто я не хочу делать для каждой функции отдельный сервлет, а всё в одном, т.к. сервлет будет составлять таблицу из документа, а потом пихать её в файл. Действия-то одинаковые. Но нужно знать, какую функцию вызывать, либо уже иметь этот буфер.
 

LuMee

Well-known member
02.05.2006
477
0
#4
Напрашивается такое решение. Создаешь интерфейс для своих функций:
Код:
public interface MyXmlGenerator
{
public Document getXML();
};
Каждый класс, содержащий нужные тебе методы (функции), заставляешь этот интерфейс реализовывать. В реализации метода getXML() вызываешь функции, создающие XML.
Далее создаешь, скажем, HashMap, в который складываешь объекты этих классов, используя в качестве ключей некоторые строковые значения.
Далее сервлету передаются в качестве параметра эти самые строковые значения. Сервлет берет такой параметр, вытаскивает из HashMap'а нужный объект и вызывает на нем getXML(), получая нужный документ.
 
J

J-Pro

#5
Дело в том, что у каждого класса таких функций (генерации ХМЛ) может быть несколько. Есть один класс, базовый, у него есть ф-ция getAll, возвращающая Document. От этого класса наследуются другие, у каждого из них добавляются ещё другие ф-ции, к примеру, getAllByNumber и т.д. Было бы классно просто, к примеру, переать указатель на необходимую ф-цию... или вообще супер - весь Document.

Вообще, дело в чём... каждый класс возвращает ХМЛ, я его парсю и составляю ХТМЛ-таблицу, показывая её в браузере. Так вот, в каждом таком месте мне необходимо разместить ссылочку, которая называется "экспорт", по которой ЧТО-ТО(в моём случае я говорил о сервлете) будет эту же показанную ХМЛ-таблицу записывать в файл на диске, ровно в таком же виде, со всеми тегами и т.д. Так вот, для этого, ХМЛ нужно ещё раз взять и разобрать.

В принципе, идеально было бы просто взять кусок кода со страницы, содержащего таблицу, и записать его в файл. Проблема была бы решена. Но проблема в том, что таблица ХТМЛ формируется в JavaScript'е, используя AJAX. А оттуда, к сожалению, на диск писать нельзя...
 

LuMee

Well-known member
02.05.2006
477
0
#6
А если, скажем, создать некий фильтр, который, получив определенный параметр (генерируемый ссылочкой "экспорт"), будет XML-документ не JavaScript'у на растерзание сдавать, а делать из него пусть даже тот-же HTML, только пользователю отправлять в виде простого файла (application/octet-stream или как там этот MIME-тип называется.. не помню).
Соответственно, через этот фильтр будут проходить все обращения к генерирующим XML-методам.
 
J

J-Pro

#7
Честно говоря, не полностью понял Вашу затею, LuMee, вернее, боюсь, что понял неверно.

Пару часов назад, не найдя альтернативы, я решил поступить следующим образом:

Сервлет получает один аргумент, плюс ещё кое-что, о чём позже. Аргумент этот - число, с которым ассоциирована функция, т.е. сервлет по нему определяет какую ф-цию вызвать(простым switch),
"ещё кое-что" - это набор аргументов для функции. Всё равно сколько, ведь, из сервлета можно получить список аргументов и просто по порядку подставить их в вызываемую ф-цию.

Вроде бы, проблема решается.... НО в некоторых функциях аргументами являются классы :huh: А как их передать сервлету - не представляю :( :( :(
 

LuMee

Well-known member
02.05.2006
477
0
#8
Что-то совсем запутался...
Насколько я понимаю, есть некая иерархия классов, содержащих методы, которые генерируют XML. К этим классам обращаются сервлеты (или JSP), которые возвращают полученные документы клиенту. Клиент, в свою очередь, из этого XML создает уже таблицу с помощью JavaScript, так?
Значит от клиента на сервер передаются некие параметры, по которым тот определяет, какой из сервлетов (а соответственно и классов) задействовать для получения XML документа.
Если так, то можно создать фильтр, который этот возвращаемый документ будет преобразовывать в HTML (по тем же алгоритмам, что и JavaScript-код на клиенте) и править заголовок ответа с целью изменения MIME-типа, дабы ответ возвращался как просто файл.
Поправьте, если чего не допонял :huh:
 
Статус
Закрыто для дальнейших ответов.