2011-11-07 24 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。