《Servlet、JSP和Spring MVC初学指南》——1.9 Http Servlets

1.9 Http Servlets

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

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

图1.5 javax.servlet.http中的主要类型

1.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,或者覆盖doGet和doPost即可。

总之,HttpServlet有两个特性是GenericServlet所不具备的:

不用覆盖Service方法,而是覆盖doGet或者doPost,或者覆盖doGet和doPost。在少数情况下,还会覆盖以下任意方法:doHead、doPut、doTrace、doOptions和doDelete。
使用HttpServletRequest和HttpServletResponse,而不是ServletRequest和ServletResponse。
1.9.2 HttpServletRequest
HttpServletRequest表示HTTP环境中的Servlet请求。它扩展javax.servlet.ServletRequest接口,并添加了几个方法。新增的部分方法如下:

java.lang.String getContextPath()
返回表示请求上下文的请求URI部分。

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,将创建一个新的会话对象。

1.9.3 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)
发送一条响应码,将浏览器跳转到指定的位置。

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

时间: 2024-09-03 15:43:14

《Servlet、JSP和Spring MVC初学指南》——1.9 Http Servlets的相关文章

《Servlet、JSP和Spring MVC初学指南》——导读

前言 Java Servlet技术简称Servlet技术,是Java开发Web应用的底层技术.由Sun公司于1996年发布,用来代替CGI--当时生成Web动态内容的主流技术.CGI技术的主要问题是每个Web请求都需要新启动一个进程来处理.创建进程会消耗不少CPU周期,导致难以编写可扩展的CGI程序.而Servlet有着比CGI程序更好的性能,因为Servlet在创建后(处理第一个请求时)就一直保持在内存中.此后,SUN公司发布了JavaServer Pages(JSP)技术,以进一步简化ser

《Servlet、JSP和Spring MVC初学指南》——1.3 编写基础的Servlet应用程序

1.3 编写基础的Servlet应用程序 其实,编写Servlet应用程序出奇简单.只需要创建一个目录结构,并把Servlet类放在某个目录下.本节将教你如何编写一个名为app01a的Servlet应用程序.最初,它会包含一个Servlet,即MyServlet,其效果是向用户发出一条问候. 要运行Servlets,还需要一个Servlet容器.Tomcat是一个开源的Servlet容器,它是免费的,并且可以在任何能跑Java的平台上运行.如果你到现在都还没有安装Tomcat,就应该去看看附录A

《Servlet、JSP和Spring MVC初学指南》——2.4 HttpSession对象

2.4 HttpSession对象 在所有的会话跟踪技术中,HttpSession 对象是最强大和最通用的.一个用户可以有且最多有一个HttpSession,并且不会被其他用户访问到. HttpSession对象在用户第一次访问网站的时候自动被创建,你可以通过调用HttpServletRequest的getSession方法获取该对象.getSession有两个重载方法: HttpSession getSession() HttpSession getSession(boolean create

《Servlet、JSP和Spring MVC初学指南》——1.11 使用部署描述符

1.11 使用部署描述符 如在前面的例子中所见,编写和部署Servlet都是很容易的事情.部署的一个方面是用一个路径配置Servlet的映射.在这些范例中,是利用WebServlet标注类型,用一个路径映射了一个Servlet. 利用部署描述符是配置Servlet应用程序的另一种方法,部署描述符的详情将在第13章"部署描述符"中探讨.部署描述符总是命名为web.xml,并且放在WEB-INF目录下.本章介绍了如何创建一个名为app01c的Servlet应用程序,并为它编写了一个web.

《Servlet、JSP和Spring MVC初学指南》——2.3 Cookies

2.3 Cookies URL重写和隐藏域仅适合保存无须跨越太多页面的信息.如果需要在多个页面间传递信息,则以上两种技术实现成本高昂,因为你不得不在每个页面都进行相应处理.幸运的是,Cookies技术可以帮助我们. Cookies是一个很少的信息片段,可自动地在浏览器和Web服务器间交互,因此cookies可存储在多个页面间传递的信息.Cookie作为HTTP header的一部分,其传输由HTTP协议控制.此外,你可以控制cookies的有效时间.浏览器通常支持每个网站高达20个cookies

《Servlet、JSP和Spring MVC初学指南》——1.6 ServletConfig

1.6 ServletConfig 当Servlet容器初始化Servlet时,Servlet容器会给Servlet的init方法传入一个ServletConfig.ServletConfig封装可以通过@WebServlet或者部署描述符传给Servlet的配置信息.这样传入的每一条信息就叫一个初始参数.一个初始参数有key和value两个元件. 为了从Servlet内部获取到初始参数的值,要在Servlet容器传给Servlet的init方法的ServletConfig中调用getInitP

《Servlet、JSP和Spring MVC初学指南》——2.2 隐藏域

2.2 隐藏域 使用隐藏域来保持状态类似于URL重写技术,但不是将值附加到URL上,而是放到HTML表单的隐藏域中.当表单提交时,隐藏域的值也同时提交到服务器端.隐藏域技术仅当网页有表单时有效.该技术相对于URL重写的优势在于:没有字符数限制,同时无须额外的编码.但该技术同URL重写一样,不适合跨越多个界面. 清单2.3展示了如何通过隐藏域来更新客户信息.清单2.2的Customer类为客户对象模型. 清单2.2 Customer类 package app02a.hiddenfields; pu

《Servlet、JSP和Spring MVC初学指南》——1.4 ServletRequest

1.4 ServletRequest 对于每一个HTTP请求,Servlet容器都会创建一个ServletRequest实例,并将它传给Servlet的Service方法.ServletRequest封装了关于这个请求的信息. ServletRequest接口中有一些方法. public int getContentLength() 返回请求主体的字节数.如果不知道字节长度,这个方法就会返回−1. public java.lang.String getContentType() 返回请求主体的M

《Servlet、JSP和Spring MVC初学指南》——1.10 处理HTML表单

1.10 处理HTML表单 一个Web应用程序中几乎总会包含一个或者多个HTML表单,供用户输入值.你可以轻松地将一个HTML表单从一个Servlet发送到浏览器.当用户提交表单时,在表单元素中输入的值就会被当作请求参数发送到服务器. HTML输入域(文本域.隐藏域或者密码域)或者文本区的值,会被当作字符串发送到服务器.空的输入域或者文本区会发送空的字符串.因此,有输入域名称的,ServletRequest.getParameter绝对不会返回null. HTML的select元素也向heade