ServletAPI详解

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

Servlet 技术是JavaWeb中最核心的组件
Servlet主要功能:
1,动态生成HTML文档
2,转发请求给同Web中的另一个Servlet组件
3,转发请求至其他Web应用中的Servlet组件
4.读取以及写入Cookie
5.访问其他服务器资源(数据库or 基于java的应用程序)
Servlet API
Servlet接口:
public interface Servlet
{
public abstract void init(ServletConfig servletconfig) throws ServletException;
//init方法负责初始化Servlet对象,容器在创建好Servlet对象
就会调用该方法(个人认为这方法估计在构造函数中调用的) public abstract void service(ServletRequest
servletrequest, ServletResponse servletresponse) throws ServletException, IOException;
//该方法负责响应用户请求,为客户提供相应的服务
public abstract void destroy();
//该方法负责释放Servlet对象所占用的资源,Servlet结束生命周期时调用
public abstract String getServletInfo();
//返回字符串包含版本创建者以及版权信息
public abstract ServletConfig getServletConfig();
//返回ServletConfig对象,该对象包含Servlet初始化信息
}
在ServletAPI中 javax.servlet.GenericServlet抽象类实现
Servlet接口。

javax.servlet.http.HttpServlet是GenericServlet 抽象类的子类。

我们开发的Servlet大多从继承HttpServlet开始。

下面介绍javax.servlet.GenericServlet抽象类
public abstract class GenericServlet
implements Servlet, ServletConfig,Serializable {
private transient ServletConfig config;
public GenericServlet() {}
public void destroy() {}
public String getInitParameter(String name) {
return getServletConfig().getInitParameter(name);
}
public Enumeration getInitParameterNames() {
return getServletConfig().getInitParameterNames();
}
public ServletConfig getServletConfig() {
return config;
}
public ServletContext getServletContext() {
return getServletConfig().getServletContext();
}
public String getServletInfo() {
return"";
}
public void init(ServletConfig config) throws
ServletException {
this.config = config;
init();
}
public void init() throws ServletException {
}
public void log(String msg) {
getServletContext().log(getServletName() + ": " + msg);
}
public void log(String message, Throwable t) {
getServletContext().log(getServletName() + ": " + message, t);
}
public abstract void service(ServletRequest servletrequest, ServletResponse servletresponse) throws ServletException, IOException;
//该方法是GenericServlet类中唯一抽象方法,交由子类实现从而为特定客户提供特定的服务
public String getServletName() {
return config.getServletName();
}
}
HttpServlet抽象类该类是GenericServlet的子类,提供了HTTP协议相关的通用实现,在HTTP协议的通信的Servlet中一般都继承HttpServlet类
(部分代码)
public abstract class HttpServlet extends GenericServlet implements
Serializable {
private static final String METHOD_DELETE = "DELETE";
private static final String METHOD_GET = "GET";
private static final String METHOD_POST = "POST";
private static final String METHOD_PUT = "PUT";
public HttpServlet() {
}
//HttpServlet为所有请求方式都提供了doXXX();并提供了默认实现,若该方法没有被子类重写,则会向客户端返回一个错误:返回错误之前判断HTTP协议版本,若版本为HTTP1.1则(405);否则400.此处以doGet()为例。

此种写法很
像抽象类中的抽象方法,此处虽不强制子类实现,但若想调用且未重写,则返回一个错误。

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(405, msg);
else
resp.sendError(400, msg);
}
protected long getLastModified(HttpServletRequest req) {
return -1L;
}
private Method[] getAllDeclaredMethods(Class c) {
if (c.getName().equals("javax.servlet.http.HttpServlet"))
return null;
int j = 0;
Method parentMethods[] = getAllDeclaredMethods(c.getSuperclass());
Method thisMethods[] = c.getDeclaredMethods();
if (parentMethods != null) {
Method allMethods[] = new Method[parentMethods.length
+ thisMethods.length];
for (int i = 0; i < parentMethods.length; i++) {
allMethods[i] = parentMethods[i];
j = i;
}
for (int i = ++j; i < thisMethods.length + j; i++)
allMethods[i] = thisMethods[i - j];
return allMethods;
} else {
return thisMethods;
}
}
protected void service(HttpServletRequest req, HttpServletResponse resp)
throws ServletException, IOException {
String method = req.getMethod();
if (method.equals("GET")) {
long lastModified = getLastModified(req);
if (lastModified == -1L) {
doGet(req, resp);
} else {
long ifModifiedSince = req.getDateHeader("If-Modified-Since");
if (ifModifiedSince < (lastModified / 1000L) * 1000L) {
maybeSetLastModified(resp, lastModified);
doGet(req, resp);
} else {
resp.setStatus(304);
}
}
} else if (method.equals("HEAD")) {
long lastModified = getLastModified(req);
maybeSetLastModified(resp, lastModified);
doHead(req, resp);
} else if (method.equals("POST"))
doPost(req, resp);
else if (method.equals("PUT"))
doPut(req, resp);
else if (method.equals("DELETE"))
doDelete(req, resp);
else if (method.equals("OPTIONS"))
doOptions(req, resp);
else if (method.equals("TRACE")) {
doTrace(req, resp);
} else {
String errMsg = lStrings.getString("http.method_not_implemented");
Object errArgs[] = new Object[1];
errArgs[0] = method;
errMsg = MessageFormat.format(errMsg, errArgs);
resp.sendError(501, errMsg);
}
}
// 该方法其实是调用了重载过后的service(HttpServletRequest req, HttpServletResponse resp)方法;然后根据request对象获得用户的请求类型,决定调用不同方法
public void service(ServletRequest req, ServletResponse res)
throws ServletException, IOException {
HttpServletRequest request;
HttpServletResponse response;
try {
request = (HttpServletRequest) req;
response = (HttpServletResponse) res;
} catch (ClassCastException e) {
throw new ServletException("non-HTTP request or response");
}
service(request, response);
}
}
ServletRequest接口
ServletRequest类表示来自客户端的请求;当Servlet容器接收到客户端要求访问的特定的Servlet请求时,容器先解析客户端请求的数据,并包装成一个Servlet 对象。

当容器调用service()方法时,第一个参数即为容器包装好的ServletRequest 对象。

public interface ServletRequest {
public abstract Object getAttribute(String s);
public abstract Enumeration getAttributeNames();
public abstract String getCharacterEncoding();
public abstract void setCharacterEncoding(String s)
throws UnsupportedEncodingException;
//请求正文的长度
public abstract int getContentLength();
//请求正文的MIME类型
public abstract String getContentType();
//返回用于读取正文的输入流
public abstract ServletInputStream getInputStream() throws IOException;
//根据请求的参数名,返回客户端请求的参数值
public abstract String getParameter(String s);
public abstract Enumeration getParameterNames();
public abstract String[] getParameterValues(String s); public abstract Map getParameterMap();
//返回客户与服务器端的通信协议以及版本号
public abstract String getProtocol();
public abstract String getScheme();
public abstract String getServerName();
public abstract int getServerPort();
//请求正文的BufferedReader对象
public abstract BufferedReader getReader() throws IOException;
//客户端IP地址
public abstract String getRemoteAddr();
//客户端主机名
public abstract String getRemoteHost();
//保存一个属性,s属性名,obj属性值
public abstract void setAttribute(String s, Object obj);
//删除一个属性
public abstract void removeAttribute(String s);
public abstract Locale getLocale();
public abstract Enumeration getLocales();
public abstract boolean isSecure();
public abstract RequestDispatcher
getRequestDispatcher(String s);
/**
*@deprecated Method getRealPath is deprecated
*/
public abstract String getRealPath(String s);
//客户端FTP端口号
public abstract int getRemotePort();
//返回服务器端的主机名
public abstract String getLocalName();
//返回服务器端的IP地址
public abstract String getLocalAddr();
//返回FTP的端口号
public abstract int getLocalPort();
}
HttpServletRequest接口是ServletRequest的子接口,主要提供读取HTTP请求的方法
public interface HttpServletRequest extends ServletRequest {
public static final String BASIC_AUTH = "BASIC";
public static final String FORM_AUTH = "FORM";
public static final String CLIENT_CERT_AUTH =
"CLIENT_CERT";
public static final String DIGEST_AUTH = "DIGEST";
public abstract String getAuthType();
//返回HTTP请求中的所有Cookie
public abstract Cookie[] getCookies();
//返回HTTP请求头部的特定项
public abstract long getDateHeader(String s);
public abstract String getHeader(String s);
public abstract Enumeration getHeaders(String s);
//返回HTTP请求头部的所有项目名
public abstract Enumeration getHeaderNames();
public abstract int getIntHeader(String s);
//返回HTTP的请求方式
public abstract String getMethod();
public abstract String getPathInfo();
public abstract String getPathTranslated();
//返回web应用的url入口
public abstract String getContextPath();
//返回查询字符串
public abstract String getQueryString();
public abstract String getRemoteUser();
public abstract boolean isUserInRole(String s);
public abstract Principal getUserPrincipal();
public abstract String getRequestedSessionId();
//返回HTTP请求头部第一行的URL
public abstract String getRequestURI();
public abstract StringBuffer getRequestURL();
public abstract String getServletPath();
public abstract HttpSession getSession(boolean flag);
public abstract HttpSession getSession();
public abstract boolean isRequestedSessionIdValid(); public abstract boolean isRequestedSessionIdFromCookie();
public abstract boolean isRequestedSessionIdFromURL();
public abstract boolean isRequestedSessionIdFromUrl(); }
ServletResponse接口
Servlet通过ServletResponse接口来响应结果;当服务器收到客户端请求时会创建一个ServletResponse对象,并把其作为参数传递给service(); public interface ServletResponse {
//获得应正文的字符编码
public abstract String getCharacterEncoding();
//获得响应正文的 MIME类型
public abstract String getContentType();
//输出二进制正文数据
public abstract ServletOutputStream getOutputStream() throws IOException;
//输出字符串正文数据
public abstract PrintWriter getWriter() throws IOException; //设置响应正文的字符编码,默认为ISO-8895-1
public abstract void setCharacterEncoding(String s);
//设置响应正文的长度
public abstract void setContentLength(int i);
//设置响应正文的MIME类型
public abstract void setContentType(String s);
//设置用于存放响应正文的缓冲区的大小
public abstract void setBufferSize(int i);
//获得用于存放响应正文的缓冲区的大小
public abstract int getBufferSize();
//强制把缓冲区的正文数据发送到客户端
public abstract void flushBuffer() throws IOException;
//仅仅清空缓冲区的正文数据,不清空响应状态码以及响应头
public abstract void resetBuffer();
//表示缓冲区是否已经提交给客户
public abstract boolean isCommitted();
//清空缓冲区的正文数据,且清空响应状态码以及响应头
public abstract void reset();
public abstract void setLocale(Locale locale);
public abstract Locale getLocale();
}
HttpServletResponse接口
HttpServletResponse接口是ServletResponse接口的子接口,该接口提供了一批与HTTP协议相关的方法。

通过这些方法可以直接设置HTTP响应头或向客户端写Cookie。

public interface HttpServletResponse
extends ServletResponse
{
(部分状态码响应常量)
public static final int SC_OK = 200;
public static final int SC_NON_AUTHORITATIVE_INFORMATION = 203;
public static final int SC_MOVED_TEMPORARILY = 302;
public static final int SC_FOUND = 302;
public static final int SC_BAD_REQUEST = 400;
public static final int SC_FORBIDDEN = 403;
public static final int SC_NOT_FOUND = 404;
public static final int SC_METHOD_NOT_ALLOWED = 405;
public static final int SC_INTERNAL_SERVER_ERROR = 500;
//向HTTP响应中加入一个Cookie
public abstract void addCookie(Cookie cookie);
public abstract boolean containsHeader(String s);
public abstract String encodeURL(String s);
public abstract String encodeRedirectURL(String s);
public abstract String encodeUrl(String s);
public abstract String encodeRedirectUrl(String s);
public abstract void sendError(int i, String s)
throws IOException;
//向客户端发送一个代表特定错误的HTTP响应状态代码
public abstract void sendError(int i)
throws IOException;
public abstract void sendRedirect(String s)
throws IOException;
public abstract void setDateHeader(String s, long l); public abstract void addDateHeader(String s, long l);
//设置HTTP响应头中的一项内容
public abstract void setHeader(String s, String s1);
//向HTTP响应头中加入一项内容
public abstract void addHeader(String s, String s1);
public abstract void setIntHeader(String s, int i);
public abstract void addIntHeader(String s, int i);
//设置HTTP响应状态代码
public abstract void setStatus(int i);
public abstract void setStatus(int i, String s);
}
ServletConfig接口
Servlet接口的init(ServletConfig config)方法有一个ServletConfig类型的参数,
当Servlet容器初始化一个Servlet对象时,会为该Servlet对象创建一个ServletConfig对象,该对象包含了Servlet初始化参数信息。

init(ServletConfig config)方法会使得当前Servlet对象与ServletConfig对象之间建立关系。

public interface ServletConfig {
//返回Servlet的名字,即web.xml中<Servlet-name>子元素的值
public abstract String getServletName();
//返回ServletContext对象
public abstract ServletContext getServletContext();
//根据初始化参数名返回匹配的初始化参数值
public abstract String getInitParameter(String s);
//返回所有初始化参数名,用Enumeration存储
public abstract Enumeration getInitParameterNames();
}
//通过代码不难发现, ServletConfig就是负责把web.xml配置文件中的参数封装,赋予每一个HttpServlet
ServletContext接口
ServletContext接口是容器与容器之间通信的接口.Servlet容器在启动一个Web时,会自动创建一个ServletConfig对象,且每一个Web应用都只有一个ServletConfig 对象。

可以形象的理解为Web应用的总管家。

这个这个ServletContext接口,我们jsp内置对象中的application对象即为该类的实例。

public interface ServletContext {
//访问Web容器中其他的Web应用
public abstract ServletContext getContext(String s);
public abstract int getMajorVersion();
public abstract int getMinorVersion();
public abstract String getMimeType(String s);
public abstract Set getResourcePaths(String s);
public abstract URL getResource(String s) throws MalformedURLException;
public abstract InputStream getResourceAsStream(String s);
public abstract RequestDispatcher
getRequestDispatcher(String s);
public abstract RequestDispatcher
getNamedDispatcher(String s);
public abstract Servlet getServlet(String s) throws ServletException;
public abstract Enumeration getServlets();
public abstract Enumeration getServletNames();
public abstract void log(String s);
public abstract void log(Exception exception, String s);
public abstract void log(String s, Throwable throwable);
public abstract String getRealPath(String s);
public abstract String getServerInfo();
//根据绑定的参数名,返回Web应用范围内匹配的初始化参数值
public abstract String getInitParameter(String s);
//返回Web应用范围内匹配的所有初始化参数值
public abstract Enumeration getInitParameterNames();
//下面四个方法类似于session中的方法,只不过下面方法都是全局变量public abstract Object getAttribute(String s);
public abstract Enumeration getAttributeNames();
public abstract void setAttribute(String s, Object obj);
public abstract void removeAttribute(String s);
//返回Web应用的名字
public abstract String getServletContextName();。

相关文档
最新文档