Solved: Seam HttpServlet + мои грабли

6 views
Skip to first unread message

nantuko84

unread,
Dec 19, 2008, 12:47:55 PM12/19/08
to The Russia JBoss Seam user group
Описание задачи:
если подходить издалека, то задача состоит в миграции со Spring на
Seam, как часть подзадача:
есть flash компонент, который раньше дергал spring'овый
handleGetFont(HttpServletRequest request, HttpServletResponse
response)
и получал шрифт по урлу font-xxx.action?font=fontname
Делал он это, просто устанавливая у response contentType=application/
octet-stream и записывая туда байты.
Задача написать тоже самое, но в Seam.

1. Первый способ (описан в Seam HttpServlet + injected context
variable)
создать class SeamServletAdapter extends HttpServlet
и в service делать тоже самое.
Проблема в том, что не получилось достать объекты из контекста сима с
замапленными сервисами.
т.е. сам объект я достаю, но все сервисы (которые описаны внутри Seam
компонента с помощью @In) равны null

2. Второй способ
Создать Seam action (flasheditor) и в методе getFontData написать:
ByteArrayOutputStream os = new ByteArrayOutputStream();
в os тем же способом записать байты шрифта
и вернуть os.toString()
флешу сказать - бери данные со страницы fontdata.seam?font=fontname
сама страница:
<f:view contentType="application/octet-stream"
xmlns:f="http://java.sun.com/jsf/core"
xmlns:h="http://java.sun.com/jsf/html"
xmlns:s="http://jboss.com/products/seam/taglib">
<h:outputText value="#{flasheditor.getFontData}" />
</f:view>

Шрифт качается, но содержит в себе данные, по размеру в 2 раза больше,
чем оригинал...
Оказалось - это из-за того, что toString как-то конвертит байты.
Пытался вернуть os.toByteArray() - т.к. данные содержат три нуля
подряд, данные обрывались
пытался ставить разные encoding - не помогло ;(

Возможно, это тоже решение задачи, если разобраться как вернуть на
страницу байты и не сконвертированную строку.

3. Третий способ
на странице сделал кнопку
<s:button action="#{flasheditor.getFontData}" value="test"/>
которая сгенерировала мне такой урл (правда пока без fontname=name),
но не суть
получилось что-то вроде
/myproject/homepageaction.seam?actionMethod=homepageaction.xhtml
%3Aflasheditor.getFontData2&cid=1';

далее в самом методе удаляем всё нафиг и пишем
FacesContext context = FacesContext.getCurrentInstance();
HttpServletResponse response = (HttpServletResponse)
context.getExternalContext().getResponse();
response.reset();
response.setContentType("application/octet-stream");
OutputStream os = response.getOutputStream();
bos = new BufferedOutputStream(os);
bos.write(данные);
bos.flush();
bos.close();
context.responseComplete();

Всё!!! Работает!
Скачивается нужный шрифт! И никаких лишних символов!
Осталось только передать имя шрифта через параметр, но это фигня по
сравнению с тем, что пришлось пережить...

BR

Reply all
Reply to author
Forward
0 new messages