We will introduce new classes for readers, writers, input and out streams for NIO. These would be exposed from ServletRequest and ServletResponse. ReadListener: package javax.servlet; import java.util.EventListener; /** * @since Servlet 3.1 */ /** * <p> * This class represents a call-back mechanism that will notify implementations * as HTTP request data becomes available to read without blocking. * </p> * */ public interface ReadListener extends EventListener { /** * <p> * Invoked when data is available to be read without blocking. * */ public void onDataAvailable(ServletRequest request); /** * <p> * Invoked when all data for the current request has been read. * </p> * */ public void onAllDataRead(ServletRequest request); /** * <p> * Invoked when an error occurs processing the request. * </p> */ public void onError(Throwable t); } AsyncIOInputSource package javax.servlet; /** * <p> * This interface defines methods to allow an {@link ServletInputStream} or * {@link ServletReader} to notify the developer <em>when</em> and <em>how much</em> * data is ready to be read without blocking. * </p> * * @since Servlet 3.1 */ public interface AsyncIOInputSource { /** * @return the number of bytes (or characters) that may be obtained * without blocking. */ public int dataAvailable(); /** * @return <code>true</code> when all data for this particular request * has been read, otherwise returns <code>false</code>. */ public boolean isFinished(); /** * @return <code>true</code> if data can be obtained without blocking, * otherwise returns <code>false</code>. */ public boolean isReady(); } ServletReader package javax.servlet; import java.io.Reader; /** * @since Servlet 3.1 */ public abstract class ServletReader extends Reader implements NIOInputSource { } WriteListener package javax.servlet; import java.util.EventListener; /** * * Callback notification mechanism that signals to the developer it's possible * to write content. * * @since Servlet 3.1 */ public interface WriteListener extends EventListener { /** * This callback will be invoked when data can be written. * * * @throws Exception, {@link Exception} might be thrown by the custom * handler code. This exception will be delegated for processing to * {@link #onError(java.lang.Throwable)}. */ public void onWritePossible(ServletResponse response); /** * <p> * Invoked when an error occurs processing the request asynchronously. * </p> */ public void onError(final Throwable t); /** * Get the ServletResponse associated * @return */ } AsyncIOOutputSink package javax.servlet; /** * <p> * This interface defines methods to allow an {@link javax.servlet.ServletOutputStream} or * {@link ServletWriter} to allow the developer to check with the runtime * whether or not it's possible to write data, or if it's not possible, to * be notified when it is. * </p> * * @since Servlet 3.1 */ public interface AsyncIOOutputSink { /** * * @return <code>true</code> if a write to this <code>AsyncIOOutputSink</code> * will succeed, otherwise returns <code>false</code>. */ public boolean canWrite(int size); } ServletWriter package javax.servlet; import java.io.Writer; /** * @since Servlet 3.1 */ public abstract class ServletWriter extends Writer implements AsyncIOOutputSink { ServletInputStream Changes Index: ServletInputStream.java =================================================================== --- ServletInputStream.java (revision 48095) +++ ServletInputStream.java (working copy) @@ -84,7 +84,7 @@ * */ -public abstract class ServletInputStream extends InputStream { +public abstract class ServletInputStream extends InputStream implements AsyncIOInputSource { ServletOutputStream Changes Index: ServletOutputStream.java =================================================================== --- ServletOutputStream.java (revision 48095) +++ ServletOutputStream.java (working copy) @@ -81,7 +81,7 @@ * */ -public abstract class ServletOutputStream extends OutputStream { +public abstract class ServletOutputStream extends OutputStream implements AsyncIOOutputSink { ServletRequest changes Index: ServletRequest.java =================================================================== --- ServletRequest.java (revision 48095) +++ ServletRequest.java (working copy) @@ -806,5 +806,38 @@ * @since Servlet 3.0 */ public DispatcherType getDispatcherType(); + + /** + * Retrieves the body of the request as character data using + * a <code>BufferedReader</code>. The reader translates the character + * data according to the character encoding used on the body. + * Either this method or {@link #getInputStream} may be called to read the + * body, not both. + * + * @return a <code>ServletReader</code> containing the body of the request + * + * + * @exception IllegalStateException if {@link #getInputStream} method + * has been called on this request + * + * + * @see #getInputStream + * + * @since Servlet 3.1 + * + */ + + public ServletReader getServletReader(); + + /** + * Instructs the <code>ServletRequest</code> to invoke the provided + * {@link ReadListener} when it is possible to write + * + * @param listener the {@link ReadListener} that should be notified + * when it's possible to read. + * + */ + + public void addReadListener(ReadListener listener); } ServletResponse Changes Index: ServletResponse.java =================================================================== --- ServletResponse.java (revision 48095) +++ ServletResponse.java (working copy) @@ -154,7 +154,7 @@ - /** + /** * Returns a {@link ServletOutputStream} suitable for writing binary * data in the response. The servlet container does not encode the * binary data. @@ -486,7 +486,32 @@ public Locale getLocale(); + /** + * Returns a <code>ServletWriter</code> object that + * can send character text to the client. + * + * + * @return a <code>ServletWriter</code> object that + * can return character data to the client + * + * + * @see #getOutputStream + * + */ + public ServletWriter getServletWriter(); + /** + * Instructs the <code>ServletResponse</code> to invoke the provided + * {@link WriteListener} when it is possible to write + * + * + * @param listener the {@link WriteListener} that should be notified + * when it's possible to write. + * + */ + + public void addWriteListener(WriteListener listener); + } ServletWriter package javax.servlet; import java.io.Writer; /** * @since Servlet 3.1 */ public abstract class ServletWriter extends Writer implements AsyncIOOutputSink { ServletInputStream Changes Index: ServletInputStream.java =================================================================== --- ServletInputStream.java (revision 48095) +++ ServletInputStream.java (working copy) @@ -84,7 +84,7 @@ * */ -public abstract class ServletInputStream extends InputStream { +public abstract class ServletInputStream extends InputStream implements AsyncIOInputSource { |