Как сохранять/открывать файлы на сервере с помощью GWT

У меня есть отчет BIRT, который я создал в GWT, и я хочу сохранить его на сервере, а затем снова открыть. Я чувствую, что жесткое кодирование URL-адреса - это неправильный путь (например, C:/files/foo/foo.html), но мне не очень повезло найти другой способ сделать это. Я пытался использовать GWT.getModuleBaseForStaticFiles(), но если я использую это, я получаю ошибку неудовлетворенной ссылки в BIRT. Что я могу использовать для сохранения/открытия файла, что считается лучшей практикой? Спасибо.

edit: неправильная формулировка, отчет BIRT создается на стороне сервера. Я хотел бы иметь возможность сохранить его на стороне сервера, а затем открыть его в новом окне браузера (я думаю, используя window.open?). Со стороны клиента ничего не загружается.


person john    schedule 09.08.2013    source источник
comment
Привет, если ваш файл находится на клиенте, и вы хотите сохранить его на сервере, вы должны отправить его на сервер с помощью какого-либо механизма загрузки. Я рекомендую загрузку файлов Apache Commons. Я не знаком с BIRT, но UnsatisfiedLinkError происходит, когда вы пытаетесь использовать метод/класс на стороне сервера со стороны клиента. Класс GWT предназначен только для использования на стороне клиента.   -  person Churro    schedule 09.08.2013
comment
позвольте мне немного перефразировать. Отчет создается на стороне сервера, я хочу сохранить его на стороне сервера, а затем открыть его резервную копию. Ничего не нужно загружать, потому что клиент ничего не создает.   -  person john    schedule 09.08.2013
comment
В этом случае нужно правильно указать URL. Если вы уверены, что URL-адрес виден клиенту (проверьте его, посетив его в браузере), вы можете использовать комбинацию GWT.getModuleBaseURL() и GWT.getModuleName(), чтобы помочь вам проанализировать правильный URL-адрес. Затем вы можете использовать Window.open(), чтобы открыть URL-адрес для клиента.   -  person Churro    schedule 09.08.2013
comment
Кроме того, я забыл упомянуть одну вещь. Убедитесь, что ваш отчет сохранен где-то в вашем каталоге WAR. Только так сработает мое предыдущее предложение. Хороший путь — war/PROJECT_NAME/. Я знаю, что вы упомянули C:/files/foo/foo.html, но этот каталог не будет таким же, когда вы развернете свое приложение на веб-сервере.   -  person Churro    schedule 09.08.2013
comment
Я попытался протестировать его с помощью «GWT.GetModuleBaseURL()» и «GWT.getModuleBaseForStaticFiles()», и оба дают мне URL-адрес, который не виден клиенту (я получаю ошибку 404). На самом деле это тот же URL-адрес в моем тестировании.   -  person john    schedule 09.08.2013
comment
Только что увидел твой комментарий. Я сохраняю в /projectname/WAR/reports/   -  person john    schedule 09.08.2013
comment
Это должно получить ваш правильный URL-адрес: GWT.getModuleBaseURL().replace(GWT.getModuleName()+"/", "") + "reports/" + <YOUR FILE NAME HERE>; Затем используйте его с Window.open()   -  person Churro    schedule 10.08.2013
comment
попробовал ваше предложение чурро, я все еще получаю ошибку неудовлетворенной ссылки в моей консоли   -  person john    schedule 10.08.2013
comment
Просто чтобы уточнить еще раз, вы пытаетесь показать свой отчет пользователю вашего приложения на стороне клиента? Если вы вызовете мой код со стороны сервера, он не будет работать (вы получите UnsatisfiedLinkError). Ваш клиентский код должен использовать мой код. Вы должны каким-то образом отправить имя файла отчета в код на стороне клиента, возможно, с помощью асинхронного вызова. Затем клиентская сторона сделает Window.open(), чтобы показать это. Единственный другой способ передать отчет клиенту — передать содержимое файла в виде загрузки.   -  person Churro    schedule 10.08.2013


Ответы (1)


Если ваш отчет BIRT представляет собой статический файл (не создается во время выполнения вашего приложения), вы можете создать простой сервлет, который считывает файл и копирует данные в OutputStream ответа. Если он сгенерирован во время выполнения, клиент запросит его на сервере, сервер сгенерирует его и вернет URL-адрес отчета. Клиент может открыть отчет с этим URL-адресом.

Пример:

Если ваш BIRT находится в папке foo/foo.bar, вы можете отобразить сервлет как /foo/*. После сопоставления пользователь запросит URL-адрес www.yourselver.com/foo/foo.bar. Сервлет в методе doGet может прочитать файл и передать содержимое обратно клиенту.

person André    schedule 09.08.2013
comment
позвольте мне немного перефразировать. Отчет создается на стороне сервера, я хочу сохранить его на стороне сервера, а затем открыть его резервную копию. Ничего не нужно загружать, потому что клиент ничего не создает. - person john; 09.08.2013
comment
Эй, у меня не было времени создавать макеты этого. Но это объясняет, что я имею в виду. Просто замените код JSP на GWT: java-forums.org/blogs/servlet/ - person André; 12.08.2013
comment
Привет, Андре, можешь привести пример кода GWT, который заменит его? метод doGet имеет входные параметры, а код JSP — нет (я не знаком с JSP). есть ли особый способ его реализации? - person john; 13.08.2013