2011-11-07 27 views
2

用Servlet,我可以做以下处理二进制流:如何在Servlet中处理Wicket中的二进制流?

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

我怎么能在检票做到这一点? (我不知道创建页面扩展好康下课)

回答

1

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

你可以做这样的:

public class OutputStreamPage extends WebPage { public OutputStreamPage(PageParameters p) { }

@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) 
      { 
      } 
     } 
    } 
} 

}

1

这是不是真的很自然的在检票做,但你可以访问到this wiki page中描述的请求和响应对象,并且可能会像在您的servlet代码中那样或多或少地做到这一点。

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

如果您不介意使用二进制数据将原始POST更改为带有上传的多部分表单,那么处理此类问题的最自然的检票方式将显示在the wicket examples upload中。

0

对于这样的需求,您应该使用Wicket的org.apache.wicket.request.resource.IResource而不是WebPage的专业化。如果您不需要访问Wicket的应用程序/会话,请使用普通的Servlet。