如何在类似Wicket的Servlet中处理二进制流?

如何在类似Wicket的Servlet中处理二进制流?,wicket,Wicket,使用Servlet,我可以执行以下操作来处理二进制流: public void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { InputStream inputStream = req.getInputStream(); byte[] data = IOUtils.toByteArray(inputStream); // .

使用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做到这一点?(创建页面扩展网页类后我没有任何线索)

您可以这样做:


公共类OutputStreamPage扩展网页
{
公共输出流页面(页面参数p)
{
}

}

在Wicket中这样做并不是很自然,但是您可以按照中的描述访问请求和响应对象,并且可能会像在servlet代码中那样或多或少地这样做

或者,您可以简单地在web.xml中独立于wicket配置servlet


如果您不介意将包含二进制数据的原始帖子更改为包含上传的多部分表单,最自然的wicket处理方式如所示。

对于此类需求,您应该使用wicket的org.apache.wicket.request.resource.IResource专门化,而不是使用网页。如果您不需要访问Wicket的应用程序/会话,也可以使用普通Servlet。

我现在使用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);

    }
}
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);

    }
}