Как обрабатывать двоичный поток в Wicket как Servlet? - PullRequest
2 голосов
/ 07 ноября 2011

Используя Servlet, я могу сделать следующее для обработки двоичного потока:

public void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {

    InputStream inputStream = req.getInputStream();
    byte[] data = IOUtils.toByteArray(inputStream);

    // ...
    Result result = process(data);       
    // ...

    ServletOutputStream op = resp.getOutputStream();
    result.writeTo(resp.getOutputStream());
}

Как я могу сделать это в Wicket? (Понятия не имею, после создания страницы расширяется класс WebPage)

Ответы [ 4 ]

1 голос
/ 16 января 2012

Я сейчас использую AbstractResourceStreamWriter для реализации решения:

public MyApiPage(final PageParameters pageParameters) {

    HttpServletRequest httpServletRequest = getHttpRequest();
    byte[] data = IOUtils.toByteArray(httpServletRequest.getInputStream());
    IResourceStream resourceStream = new MyApiResourceStream(data);
    getRequestCycle().scheduleRequestHandlerAfterCurrent(new ResourceStreamRequestHandler(resourceStream));
}

private class MyApiResourceStream extends AbstractResourceStreamWriter {

    private byte[] data;
    public MyApiResourceStream(byte[] data) {
        this.data = data;
    }

    @Override
    public void write(Response webResponse) {
        byte[] convertedData = // do some works here...
        webResponse.write(convertedData);

    }
}
1 голос
/ 07 ноября 2011

Это не совсем естественно в Wicket, но вы можете получить доступ к объектам запросов и ответов, как описано в этой вики-странице , и, скорее всего, сделаете это более или менее, как в коде вашего сервлета. .

Или вы можете просто настроить свой сервлет в web.xml независимо от калитки.

Если вы не возражаете против перехода с необработанного POST с двоичными данными на многочастную форму с загрузкой, наиболее естественный способ обращения с таким способом показан в загрузке примеров калитки .

1 голос
/ 07 ноября 2011

Вы можете сделать это так:

public class OutputStreamPage extends WebPage { public OutputStreamPage( PageParameters p ) { }</p> <pre><code>@Override protected final void onRender( MarkupStream markupStream ) { OutputStream os = getResponse().getOutputStream(); BufferedWriter out = null; try { out = ..... out.write( ..... ); } catch ( IOException e ) { // WHAT TO DO? } finally { if ( out != null ) { try { out.close(); } catch ( IOException e ) { } } } }

}

0 голосов
/ 17 ноября 2011

Для таких нужд вы должны использовать специализацию org.apache.wicket.request.resource.IResource Wicket вместо WebPage. Или простой сервлет, если вам не нужен доступ к приложению / сеансу Wicket.

...