📄 httpservlet.java
字号:
/*
* $Id: HttpServlet.java,v 1.4 1999/04/20 20:37:45 sahmed Exp $
*
* Copyright (c) 1996-1999 Sun Microsystems, Inc. All Rights Reserved.
*
* This software is the confidential and proprietary information of Sun
* Microsystems, Inc. ("Confidential Information"). You shall not
* disclose such Confidential Information and shall use it only in
* accordance with the terms of the license agreement you entered into
* with Sun.
*
* SUN MAKES NO REPRESENTATIONS OR WARRANTIES ABOUT THE SUITABILITY OF THE
* SOFTWARE, EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
* IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR
* PURPOSE, OR NON-INFRINGEMENT. SUN SHALL NOT BE LIABLE FOR ANY DAMAGES
* SUFFERED BY LICENSEE AS A RESULT OF USING, MODIFYING OR DISTRIBUTING
* THIS SOFTWARE OR ITS DERIVATIVES.
*
* CopyrightVersion 1.0
*
*/
package javax.servlet.http;
import java.io.IOException;
import java.io.PrintWriter;
import java.io.OutputStreamWriter;
import java.io.UnsupportedEncodingException;
import java.lang.reflect.Method;
import java.text.MessageFormat;
import java.util.Enumeration;
import java.util.ResourceBundle;
import javax.servlet.GenericServlet;
import javax.servlet.ServletException;
import javax.servlet.ServletOutputStream;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
/**
*
* Provides an abstract class that you can subclass to create
* an HTTP servlet, which receives requests from and
* sends responses to a Web site. When you subclass
* <code>HttpServlet</code>, you must override at least
* one method, usually one of these:
*
* <ul>
* <li> <code>doGet</code>, if the servlet supports HTTP GET requests
* <li> <code>doPost</code>, for HTTP POST requests
* <li> <code>doPut</code>, for HTTP PUT requests
* <li> <code>doDelete</code>, for HTTP DELETE requests
* <li> <code>init</code> and <code>destroy</code>,
* which you override as a pair if you need to
* manage resources that are held for the life of the servlet
* <li> <code>getServletInfo</code>, which the servlet uses to
* provide information about itself
* </ul>
*
* <p>You usually will not override the <code>service</code>
* method. <code>service</code> handles standard HTTP
* requests by dispatching them to the handler methods
* for each HTTP request type (the <code>do</code><i>xxx</i>
* methods listed above).
*
* <p>Likewise, you usually will not override the
* <code>doOptions</code> and <code>doTrace</code> methods.
* The <code>service</code> method supports HTTP 1.1
* TRACE and OPTIONS requests by dispatching them to
* <code>doTrace</code> and <code>doOptions</code>.
*
* <p>Servlets typically run on multithreaded servers,
* so you must write your servlet to handle concurrent
* requests and synchronize access to shared resources.
* Shared resources include in-memory data such as
* instance or class variables and external objects
* such as files, database connections, and network
* connections.
* See the
* <a href="http://java.sun.com/Series/Tutorial/java/threads/multithreaded.html">
* Java Tutorial on Multithreaded Programming</a> for more
* information on handling multiple threads in a Java program.
*
* @author Various
* @version $Version$
*
*/
public abstract class HttpServlet extends GenericServlet
implements java.io.Serializable
{
private static final String METHOD_DELETE = "DELETE";
private static final String METHOD_HEAD = "HEAD";
private static final String METHOD_GET = "GET";
private static final String METHOD_OPTIONS = "OPTIONS";
private static final String METHOD_POST = "POST";
private static final String METHOD_PUT = "PUT";
private static final String METHOD_TRACE = "TRACE";
private static final String HEADER_IFMODSINCE = "If-Modified-Since";
private static final String HEADER_LASTMOD = "Last-Modified";
private static final String LSTRING_FILE =
"javax.servlet.http.LocalStrings";
private static ResourceBundle lStrings =
ResourceBundle.getBundle(LSTRING_FILE);
/**
* Does nothing, because this is an abstract class.
*
*/
public HttpServlet () { }
/**
*
* Receives an HTTP GET request from the protected
* <code>service</code> method and handles the request.
* The GET method allows a client to read information
* from the Web server, passing a query string appended
* to an URL to tell the server what information
* to return.
*
* <p>Overriding this method to support a GET request also
* automatically supports an HTTP HEAD request. A HEAD
* request is a GET request that returns no body in the
* response, only the request header fields.
*
* <p>If you override this method, you should read data from
* the request, set entity headers in the response,
* access the writer or output stream object, and finally,
* write the response data. When you set headers, be
* sure to include content type and encoding. If you use
* a <code>PrintWriter</code> object to return the response,
* you must set the content type before you access the
* <code>PrintWriter</code> object.
*
* <p>The servlet engine must write the headers before
* the response data, because the headers can be flushed
* at any time after the data is written.
*
* <p>If you can set the Content-Length header (with the
* {@link javax.servlet.ServletResponse.#contentType} method),
* the servlet
* can use a persistent connection to return its response
* to the client, improving performance dramatically.
* If you cannot set Content-Length, you can sometimes avoid
* the performance penalty if the response fits in an internal
* buffer.
*
* <p>The GET method should be safe, that is, without
* any side effects for which users are held responsible.
* For example, most form queries have no side effects.
* If a client request is intended to change stored data,
* the request should use some other HTTP method.
*
* <p>The GET method should also be idempotent, meaning
* that it can be safely repeated. Sometimes making a
* method safe also makes it idempotent. For example,
* repeating queries is both safe and idempotent, but
* buying a product online or modifying data is neither
* safe nor idempotent.
*
* <p>If the request is incorrectly formatted, <code>doGet</code>
* returns an HTTP BAD_REQUEST message.
*
*
* @param req an {@link HttpServletRequest} object that
* contains the request the client has made
* of the servlet
*
* @param resp an {@link HttpServletResponse} object that
* contains the response the servlet sends
* to the object
*
* @exception IOException if an input or output error is
* detected when the servlet handles
* the GET request
*
* @exception ServletException if the request for the GET
* could not be handled
*
*
* @see javax.servlet.ServletResponse#setContentType
*
*/
protected void doGet (HttpServletRequest req, HttpServletResponse resp)
throws ServletException, IOException
{
String protocol = req.getProtocol();
String msg = lStrings.getString("http.method_get_not_supported");
if (protocol.endsWith("1.1")) {
resp.sendError(HttpServletResponse.SC_METHOD_NOT_ALLOWED, msg);
} else {
resp.sendError(HttpServletResponse.SC_BAD_REQUEST, msg);
}
}
/**
*
* Returns the time the <code>HttpServletRequest</code>
* object was last modified,
* in milliseconds since midnight January 1, 1970 GMT.
* If the time is unknown, this method returns a negative
* number.
*
* <p>Servlet engines that support HTTP GET requests
* should override <code>getLastModified</code> to
* provide an accurate object modification time. This
* makes browser and proxy caches work more effectively,
* reducing the load on server and network resources.
*
*
* @param req the <code>HttpServletRequest</code>
* object that is sent to the servlet
*
* @return a <code>long</code> integer specifying
* the time the <code>HttpServletRequest</code>
* object was last modified, in milliseconds
* since midnight, January 1, 1970 GMT, or
* -1 if the time is not known
*
*/
protected long getLastModified (HttpServletRequest req) {
return -1;
}
/*
* Private method; not a Javadoc comment
*
* <p>Receives an HTTP HEAD request from the protected
* <code>service</code> method and handles the
* request.
* The client sends a HEAD request when it wants
* to see only the headers of a response, such as
* Content-Type or Content-Length. The HTTP HEAD
* method counts the output bytes in the response
* to set the Content-Length header accurately.
*
* <p>If you override this method, you can avoid computing
* the response body and just set the response headers
* directly to improve performance. Make sure that the
* <code>doHead</code> method you write is both safe
* and idempotent (that is, protects itself from being
* called multiple times for one HTTP HEAD request).
*
* <p>If the HTTP HEAD request is incorrectly formatted,
* <code>doHead</code> returns an HTTP BAD_REQUEST
* message.
*
*
* @param req the request object that is passed
* to the servlet
*
* @param resp the response object that the servlet
* uses to return the headers to the clien
*
* @exception IOException if an input or output error occurs
*
* @exception ServletException if the request for the HEAD
* could not be handled
*/
private void doHead (HttpServletRequest req, HttpServletResponse resp)
throws ServletException, IOException
{
NoBodyResponse response = new NoBodyResponse(resp);
doGet (req, response);
response.setContentLength ();
}
/**
*
* Receives an HTTP POST request from the protected
* <code>service</code> method and handles the request.
* The HTTP POST method allows the client to send
* data of unlimited length to the Web server once
* and is useful when posting information such as
* credit card numbers.
*
* <p>If you override this method, you should read data from
* the <code>HttpServletRequest</code> object, set headers
* for the response (including Content-Type and Content-Encoding),
* access a <code>PrintWriter</code> or
* output stream object, and then write any response data
* using a {@link javax.servlet.ServletOutputStream} object.
*
* <p>If you use a <code>PrintWriter</code> object to
* write response data, set the Content-Type header before
* you access the <code>PrintWriter</code> object.
* The servlet engine must write the headers before the
* the response data, because the headers can be flushed at
* any time after the servlet engine begins to write the body
* of the response.
*
* <p>If you use HTTP 1.1 chunked encoding (which means that
* the response has a Transfer-Encoding header), do not set the
* Content-Length header. If you do not use
* chunked encoding, set the content length to allow the servlet
* to take advantage of the HTTP "connection keep alive" feature,
* If you cannot set the content length and therefore cannot
* use "keep alive," you may be able to avoid the performance
* penalty if the response fits in an internal buffer.
*
* <p>This method does not need to be either safe or idempotent.
* Operations requested through POST can have side effects for
* which the user can be held accountable, for example,
* updating stored data or buying items online.
*
* <p>If the HTTP POST request is incorrectly formatted,
* <code>doPost</code> returns an HTTP BAD_REQUEST message.
*
*
* @param req an {@link HttpServletRequest} object that
* contains the request the client has made
* of the servlet
*
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -