View Javadoc

1   /*
2    * Licensed to the Apache Software Foundation (ASF) under one
3    * or more contributor license agreements.  See the NOTICE file
4    * distributed with this work for additional information
5    * regarding copyright ownership.  The ASF licenses this file
6    * to you under the Apache License, Version 2.0 (the
7    * "License"); you may not use this file except in compliance
8    * with the License.  You may obtain a copy of the License at
9    *
10   *  http://www.apache.org/licenses/LICENSE-2.0
11   *
12   * Unless required by applicable law or agreed to in writing,
13   * software distributed under the License is distributed on an
14   * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
15   * KIND, either express or implied.  See the License for the
16   * specific language governing permissions and limitations
17   * under the License.
18   */
19  
20  package javax.servlet;
21  
22  import java.io.IOException;
23  import java.io.PrintWriter;
24  import java.util.Locale;
25  
26  
27  /**
28   * Defines an object to assist a servlet in sending a response to the client.
29   * The servlet container creates a <code>ServletResponse</code> object and
30   * passes it as an argument to the servlet's <code>service</code> method.
31   *
32   * <p>To send binary data in a MIME body response, use
33   * the {@link ServletOutputStream} returned by {@link #getOutputStream}.
34   * To send character data, use the <code>PrintWriter</code> object 
35   * returned by {@link #getWriter}. To mix binary and text data,
36   * for example, to create a multipart response, use a
37   * <code>ServletOutputStream</code> and manage the character sections
38   * manually.
39   *
40   * <p>The charset for the MIME body response can be specified
41   * explicitly using the {@link #setCharacterEncoding} and
42   * {@link #setContentType} methods, or implicitly
43   * using the {@link #setLocale} method.
44   * Explicit specifications take precedence over
45   * implicit specifications. If no charset is specified, ISO-8859-1 will be
46   * used. The <code>setCharacterEncoding</code>,
47   * <code>setContentType</code>, or <code>setLocale</code> method must
48   * be called before <code>getWriter</code> and before committing
49   * the response for the character encoding to be used.
50   * 
51   * <p>See the Internet RFCs such as 
52   * <a href="http://www.ietf.org/rfc/rfc2045.txt">
53   * RFC 2045</a> for more information on MIME. Protocols such as SMTP
54   * and HTTP define profiles of MIME, and those standards
55   * are still evolving.
56   *
57   * @author 	Various
58   * @version 	$Version$
59   *
60   * @see		ServletOutputStream
61   *
62   */
63   
64  public interface ServletResponse {
65  
66  
67      
68      /**
69       * Returns the name of the character encoding (MIME charset)
70       * used for the body sent in this response.
71       * The character encoding may have been specified explicitly
72       * using the {@link #setCharacterEncoding} or
73       * {@link #setContentType} methods, or implicitly using the
74       * {@link #setLocale} method. Explicit specifications take
75       * precedence over implicit specifications. Calls made
76       * to these methods after <code>getWriter</code> has been
77       * called or after the response has been committed have no
78       * effect on the character encoding. If no character encoding
79       * has been specified, <code>ISO-8859-1</code> is returned.
80       * <p>See RFC 2047 (http://www.ietf.org/rfc/rfc2047.txt)
81       * for more information about character encoding and MIME.
82       *
83       * @return		a <code>String</code> specifying the
84       *			name of the character encoding, for
85       *			example, <code>UTF-8</code>
86       *
87       */
88    
89      public String getCharacterEncoding();
90      
91      
92  
93      /**
94       * Returns the content type used for the MIME body
95       * sent in this response. The content type proper must
96       * have been specified using {@link #setContentType}
97       * before the response is committed. If no content type
98       * has been specified, this method returns null.
99       * If a content type has been specified and a
100      * character encoding has been explicitly or implicitly
101      * specified as described in {@link #getCharacterEncoding},
102      * the charset parameter is included in the string returned.
103      * If no character encoding has been specified, the
104      * charset parameter is omitted.
105      *
106      * @return		a <code>String</code> specifying the
107      *			content type, for example,
108      *			<code>text/html; charset=UTF-8</code>,
109      *			or null
110      *
111      * @since 2.4
112      */
113   
114     public String getContentType();
115     
116     
117 
118     /**
119      * Returns a {@link ServletOutputStream} suitable for writing binary 
120      * data in the response. The servlet container does not encode the
121      * binary data.  
122      
123      * <p> Calling flush() on the ServletOutputStream commits the response.
124      
125      * Either this method or {@link #getWriter} may 
126      * be called to write the body, not both.
127      *
128      * @return				a {@link ServletOutputStream} for writing binary data	
129      *
130      * @exception IllegalStateException if the <code>getWriter</code> method
131      * 					has been called on this response
132      *
133      * @exception IOException 		if an input or output exception occurred
134      *
135      * @see 				#getWriter
136      *
137      */
138 
139     public ServletOutputStream getOutputStream() throws IOException;
140     
141     
142 
143     /**
144      * Returns a <code>PrintWriter</code> object that
145      * can send character text to the client.
146      * The <code>PrintWriter</code> uses the character
147      * encoding returned by {@link #getCharacterEncoding}.
148      * If the response's character encoding has not been
149      * specified as described in <code>getCharacterEncoding</code>
150      * (i.e., the method just returns the default value 
151      * <code>ISO-8859-1</code>), <code>getWriter</code>
152      * updates it to <code>ISO-8859-1</code>.
153      * <p>Calling flush() on the <code>PrintWriter</code>
154      * commits the response.
155      * <p>Either this method or {@link #getOutputStream} may be called
156      * to write the body, not both.
157      *
158      * 
159      * @return 		a <code>PrintWriter</code> object that 
160      *			can return character data to the client 
161      *
162      * @exception UnsupportedEncodingException
163      *			if the character encoding returned
164      *			by <code>getCharacterEncoding</code> cannot be used
165      *
166      * @exception IllegalStateException
167      *			if the <code>getOutputStream</code>
168      * 			method has already been called for this 
169      *			response object
170      *
171      * @exception IOException
172      *			if an input or output exception occurred
173      *
174      * @see 		#getOutputStream
175      * @see 		#setCharacterEncoding
176      *
177      */
178 
179     public PrintWriter getWriter() throws IOException;
180     
181     
182     
183     
184     /**
185      * Sets the character encoding (MIME charset) of the response
186      * being sent to the client, for example, to UTF-8.
187      * If the character encoding has already been set by
188      * {@link #setContentType} or {@link #setLocale},
189      * this method overrides it.
190      * Calling {@link #setContentType} with the <code>String</code>
191      * of <code>text/html</code> and calling
192      * this method with the <code>String</code> of <code>UTF-8</code>
193      * is equivalent with calling
194      * <code>setContentType</code> with the <code>String</code> of
195      * <code>text/html; charset=UTF-8</code>.
196      * <p>This method can be called repeatedly to change the character
197      * encoding.
198      * This method has no effect if it is called after
199      * <code>getWriter</code> has been
200      * called or after the response has been committed.
201      * <p>Containers must communicate the character encoding used for
202      * the servlet response's writer to the client if the protocol
203      * provides a way for doing so. In the case of HTTP, the character
204      * encoding is communicated as part of the <code>Content-Type</code>
205      * header for text media types. Note that the character encoding
206      * cannot be communicated via HTTP headers if the servlet does not
207      * specify a content type; however, it is still used to encode text
208      * written via the servlet response's writer.
209      *
210      * @param charset 	a String specifying only the character set
211      * 			defined by IANA Character Sets
212      *			(http://www.iana.org/assignments/character-sets)
213      *
214      * @see		#setContentType
215      * 			#setLocale
216      *
217      * @since 2.4
218      *
219      */
220 
221     public void setCharacterEncoding(String charset);
222     
223     
224 
225 
226     /**
227      * Sets the length of the content body in the response
228      * In HTTP servlets, this method sets the HTTP Content-Length header.
229      *
230      *
231      * @param len 	an integer specifying the length of the 
232      * 			content being returned to the client; sets
233      *			the Content-Length header
234      *
235      */
236 
237     public void setContentLength(int len);
238     
239     
240 
241     /**
242      * Sets the content type of the response being sent to
243      * the client, if the response has not been committed yet.
244      * The given content type may include a character encoding
245      * specification, for example, <code>text/html;charset=UTF-8</code>.
246      * The response's character encoding is only set from the given
247      * content type if this method is called before <code>getWriter</code>
248      * is called.
249      * <p>This method may be called repeatedly to change content type and
250      * character encoding.
251      * This method has no effect if called after the response
252      * has been committed. It does not set the response's character
253      * encoding if it is called after <code>getWriter</code>
254      * has been called or after the response has been committed.
255      * <p>Containers must communicate the content type and the character
256      * encoding used for the servlet response's writer to the client if
257      * the protocol provides a way for doing so. In the case of HTTP,
258      * the <code>Content-Type</code> header is used.
259      *
260      * @param type 	a <code>String</code> specifying the MIME 
261      *			type of the content
262      *
263      * @see 		#setLocale
264      * @see 		#setCharacterEncoding
265      * @see 		#getOutputStream
266      * @see 		#getWriter
267      *
268      */
269 
270     public void setContentType(String type);
271     
272 
273     /**
274      * Sets the preferred buffer size for the body of the response.  
275      * The servlet container will use a buffer at least as large as 
276      * the size requested.  The actual buffer size used can be found
277      * using <code>getBufferSize</code>.
278      *
279      * <p>A larger buffer allows more content to be written before anything is
280      * actually sent, thus providing the servlet with more time to set
281      * appropriate status codes and headers.  A smaller buffer decreases 
282      * server memory load and allows the client to start receiving data more
283      * quickly.
284      *
285      * <p>This method must be called before any response body content is
286      * written; if content has been written or the response object has
287      * been committed, this method throws an 
288      * <code>IllegalStateException</code>.
289      *
290      * @param size 	the preferred buffer size
291      *
292      * @exception  IllegalStateException  	if this method is called after
293      *						content has been written
294      *
295      * @see 		#getBufferSize
296      * @see 		#flushBuffer
297      * @see 		#isCommitted
298      * @see 		#reset
299      *
300      */
301 
302     public void setBufferSize(int size);
303     
304     
305 
306     /**
307      * Returns the actual buffer size used for the response.  If no buffering
308      * is used, this method returns 0.
309      *
310      * @return	 	the actual buffer size used
311      *
312      * @see 		#setBufferSize
313      * @see 		#flushBuffer
314      * @see 		#isCommitted
315      * @see 		#reset
316      *
317      */
318 
319     public int getBufferSize();
320     
321     
322 
323     /**
324      * Forces any content in the buffer to be written to the client.  A call
325      * to this method automatically commits the response, meaning the status 
326      * code and headers will be written.
327      *
328      * @see 		#setBufferSize
329      * @see 		#getBufferSize
330      * @see 		#isCommitted
331      * @see 		#reset
332      *
333      */
334 
335     public void flushBuffer() throws IOException;
336     
337     
338     
339     /**
340      * Clears the content of the underlying buffer in the response without
341      * clearing headers or status code. If the 
342      * response has been committed, this method throws an 
343      * <code>IllegalStateException</code>.
344      *
345      * @see 		#setBufferSize
346      * @see 		#getBufferSize
347      * @see 		#isCommitted
348      * @see 		#reset
349      *
350      * @since 2.3
351      */
352 
353     public void resetBuffer();
354     
355 
356     /**
357      * Returns a boolean indicating if the response has been
358      * committed.  A committed response has already had its status 
359      * code and headers written.
360      *
361      * @return		a boolean indicating if the response has been
362      *  		committed
363      *
364      * @see 		#setBufferSize
365      * @see 		#getBufferSize
366      * @see 		#flushBuffer
367      * @see 		#reset
368      *
369      */
370 
371     public boolean isCommitted();
372     
373     
374 
375     /**
376      * Clears any data that exists in the buffer as well as the status code and
377      * headers.  If the response has been committed, this method throws an 
378      * <code>IllegalStateException</code>.
379      *
380      * @exception IllegalStateException  if the response has already been
381      *                                   committed
382      *
383      * @see 		#setBufferSize
384      * @see 		#getBufferSize
385      * @see 		#flushBuffer
386      * @see 		#isCommitted
387      *
388      */
389 
390     public void reset();
391     
392     
393 
394     /**
395      * Sets the locale of the response, if the response has not been
396      * committed yet. It also sets the response's character encoding
397      * appropriately for the locale, if the character encoding has not
398      * been explicitly set using {@link #setContentType} or
399      * {@link #setCharacterEncoding}, <code>getWriter</code> hasn't
400      * been called yet, and the response hasn't been committed yet.
401      * If the deployment descriptor contains a 
402      * <code>locale-encoding-mapping-list</code> element, and that
403      * element provides a mapping for the given locale, that mapping
404      * is used. Otherwise, the mapping from locale to character
405      * encoding is container dependent.
406      * <p>This method may be called repeatedly to change locale and
407      * character encoding. The method has no effect if called after the
408      * response has been committed. It does not set the response's
409      * character encoding if it is called after {@link #setContentType}
410      * has been called with a charset specification, after
411      * {@link #setCharacterEncoding} has been called, after
412      * <code>getWriter</code> has been called, or after the response
413      * has been committed.
414      * <p>Containers must communicate the locale and the character encoding
415      * used for the servlet response's writer to the client if the protocol
416      * provides a way for doing so. In the case of HTTP, the locale is
417      * communicated via the <code>Content-Language</code> header,
418      * the character encoding as part of the <code>Content-Type</code>
419      * header for text media types. Note that the character encoding
420      * cannot be communicated via HTTP headers if the servlet does not
421      * specify a content type; however, it is still used to encode text
422      * written via the servlet response's writer.
423      * 
424      * @param loc  the locale of the response
425      *
426      * @see 		#getLocale
427      * @see 		#setContentType
428      * @see 		#setCharacterEncoding
429      *
430      */
431 
432     public void setLocale(Locale loc);
433     
434     
435 
436     /**
437      * Returns the locale specified for this response
438      * using the {@link #setLocale} method. Calls made to
439      * <code>setLocale</code> after the response is committed
440      * have no effect. If no locale has been specified,
441      * the container's default locale is returned.
442      * 
443      * @see 		#setLocale
444      *
445      */
446 
447     public Locale getLocale();
448 
449 
450 
451 }
452 
453 
454 
455 
456