返回介绍

C.9 Http Servlets

发布于 2025-04-22 20:10:07 字数 3715 浏览 0 评论 0 收藏

即便不是全部,至少也是大多数应用程序都要与 HTTP 结合起来使用。这意味着可以利用 HTTP 提供的特性。javax.servlet.http 包是 Servlet API 中的第 2 个包,其中包含了用于编写 Servlet 应用程序的类和接口。javax.servlet.http 中的许多类型都覆盖了 javax.servlet 中的类型。

图 C.5 展示了 javax.servlet.http 中的主要类型。

图片 3

图 C.5 javax.servlet.http 中的主要类型

C.9.1 HttpServlet

HttpServlet 类覆盖了 javax.servlet.GenericServlet 类。使用 HttpServlet 时,还要借助分别代表 Servlet 请求和 Servlet 响应的 HttpServletRequest 和 HttpServletResponse 对象。HttpServletRequest 接口扩展 javax.servlet.ServletRequest,HttpServletResponse 扩展 javax.servlet. ServletResponse。

HttpServlet 覆盖 GenericServlet 中的 Service 方法,并通过下列签名再添加一个 Service 方法:

protected void service(HttpServletRequest request,
    HttpServletResponse response)
    throws ServletException, java.io.IOException

新 Service 方法和 javax.servlet.Servlet 中 Service 方法之间的区别在于,前者接受 HttpServletRequest 和 HttpServletResponse,而不是 ServletRequest 和 ServletResponse。

像往常一样,Servlet 容器调用 javax.servlet.Servlet 中原始的 Service 方法。HttpServlet 中的方法编写如下:

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);
}

原始的 Service 方法将 Servlet 容器的 request 和 response 对象分别转换成 HttpServletRequest 和 HttpServletResponse,并调用新的 Service 方法。这种转换总是会成功的,因为在调用 Servlet 的 Service 方法时,Servlet 容器总会传入一个 HttpServletRequest 和一个 HttpServletResponse,预备使用 HTTP。即便正在实现 javax.servlet.Servlet,或者扩展 javax.servlet.GenericServlet,也可以将传给 Service 方法的 servlet request 和 servlet response 分别转换成 HttpServletRequest 和 HttpServletResponse。

然后,HttpServlet 中的 Service 方法会检验用来发送请求的 HTTP 方法(通过调用 request.getMethod),并调用以下方法之一:doGet、doPost、doHead、doPut、doTrace、doOptions 和 doDelete。这 7 种方法中每一种方法都表示一个 HTTP 方法。doGet 和 doPost 是最常用的。因此,不再需要覆盖 Service 方法了,只要覆盖 doGet 或者 doPost,或者二者都覆盖即可。

总之,HttpServlet 有两个特性在 GenericServlet 中尚未体现出来。

  • 不覆盖 Service 方法,而是覆盖 doGet 或者 doPost,或者覆盖 doGet 和 doPost。在少数情况下,还会覆盖以下任意方法:doHead、doPut、doTrace、doOptions 和 doDelete。

  • 与 HttpServletRequest 和 HttpServletResponse 共用,而不是与 ServletRequest 和 ServletResponse 共用。

HttpServletRequest 表示 HTTP 环境中的 Servlet 请求。它扩展 javax.servlet.ServletRequest 接口,并添加了几个方法。新增的部分方法如下:

java.lang.String getContextPath()

返回表示请求上下文的请求 RUI 部分。

Cookie[] getCookies()

返回一个 Cookie 对象数组。

java.lang.String getHeader(java.lang.String name)

返回指定 HTTP 标题的值。

java.lang.String getMethod()

返回生成这个请求的 HTTP 方法名称。

java.lang.String getQueryString()

返回请求 URL 中的查询字符串。

HttpSession getSession()

返回与这个请求相关的会话对象。如果没有,将创建一个新的会话对象。

HttpSession getSession(boolean create)

返回与这个请求相关的会话对象。如果有,并且 create 参数为 True,将创建一个新的会话对象。

C.9.2 HttpServletResponse

HttpServletResponse 表示 HTTP 环境中的 Servlet 响应。下面是其中定义的部分方法:

void addCookie(Cookie cookie)

给这个响应对象添加一个 cookie。

void addHeader(java.lang.String name, java.lang.String value)

给这个响应对象添加一个 header。

void sendRedirect(java.lang.String location)

发送一条响应码,将浏览器跳转到指定的位置。

下面的章节将进一步学习这些方法。

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据
    我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。