1、第四章 请求和响应请求重定向请求消息头的获取解决请求参数中的中文乱码问题请求包含请求行消息的获取请求参数的获取请求转发4 掌握如何实现请求转发与请求重定向3掌握如何解决请求和响应过程中的中文乱码问题掌握掌握掌握掌握掌握HttpServletRequest对象及其应用1掌握HttpServletRequest对象及其应用2学习目标4.14.1HttpServletResponse对象4.24.2HttpServletResponse应用4.34.3HttpServletRequest对象4.44.4HttpServletRequest应用4.54.5RequestDispatcher对象的应用点
2、击查看本小节知识架构点击查看本小节知识架构点击查看本小节知识架构点击查看本小节知识架构点击查看本小节知识架构目录返回目录4.1.14.1.24.1.3发送状态码相关的方法发送响应消息头相关的方法发送响应消息体相关的方法4.1 HttpServletResponse对象对象知识架构返回目录4.2.1【任务4-1】解决中文输出乱码问题【任务4-2】实现网页定时刷新并跳转实现请求重定向4.2 HttpServletResponse应用应用知识架构返回目录4.3.1获取请求行消息的相关方法获取请求消息头的相关方法4.3 HttpServletRequest对象对象4.3.2知识架构返回目录4.4.14
3、.4.2获取请求参数【任务4-3】解决请求参数的中文乱码问题通过Request对象传递数据4.4 HttpServletRequest应用应用知识架构返回目录4.5.14.5.3RequestDispatcher接口请求转发请求包含4.5 RequestDispatcher对象的应用对象的应用4.5.2知识架构Servlet最主要的作用就是处理客户端请求,并向客户端做出响应。为此,针对Servlet的每次请求,Web服务器在调用service()方法之前,都会创建两个对象,分别是HttpServletRequest和HttpServletResponse。其中,HttpServletReque
4、st用于封装HTTP请求消息,简称request对象。HttpServletResponse用于封装HTTP响应消息,简称response对象。request对象和response对象在请求Servlet过程中至关重要,接下来,通过一张图来描述浏览器访问Servlet的交互过程,如图所示。请求和响应 需要注意的是,在Web服务器运行阶段,每个Servlet都只会创建一个实例对象。然而,每次HTTP请求,Web服务器都会调用所请求Servlet实例的service(HttpServletRequest request,HttpServletResponse response)方法,重新创建一个r
5、equest对象和一个response对象。接下来,本章将针对request对象和response对象进行详细地讲解。请求和响应 在Servlet API中,定义了一个HttpServletResponse接口,它继承自ServletResponse接口,专门用来封装HTTP响应消息。由于HTTP响应消息分为状态行、响应消息头、消息体三部分,因此,在HttpServletResponse接口中定义了向客户端发送响应状态码、响应消息头、响应消息体的方法,接下来,本节将针对这些方法进行详细的讲解。4.1 HttpServletResponse对象 当Servlet向客户端回送响应消息时,需要在响应
6、消息中设置状态码。为此,在HttpServletResponse接口中,定义了两个发送状态码的方法,具体如下。1.setStatus(int status)方法方法 该方法用于设置HTTP响应消息的状态码,并生成响应状态行。由于响应状态行中的状态描述信息直接与状态码相关,而HTTP版本由服务器确定,因此,只要通过setStatus(int status)方法设置了状态码,即可实现状态行的发送。需要注意的是,正常情况下,Web服务器会默认产生一个状态码为200的状态行。发送状态码相关的方法4.1 HttpServletResponse对象2.sendError(int sc)方法方法 该方法用于
7、发送表示错误信息的状态码,例如,404状态码表示找不到客户端请求的资源。在response对象中,提供了两个重载的sendError(int sc)方法,具体如下: 在上面重载的两个方法中,第一个方法只是发送错误信息的状态码,而第二个方法除了发送状态码外,还可以增加一条用于提示说明的文本信息,该文本信息将出现在发送给客户端的正文内容中。4.1 HttpServletResponse对象 当Servlet向客户端发送响应消息时,由于HTTP协议的响应头字段有很多种,为此,在HttpServletResponse接口中,定义了一系列设置HTTP响应头字段的方法,如表所示。发送响应消息头相关方法4.
8、1 HttpServletResponse对象 由于在HTTP响应消息中,大量的数据都是通过响应消息体传递的,因此,ServletResponse遵循以IO流传递大量数据的设计理念。在发送响应消息体时,定义了两个与输出流相关的方法,具体如下。1getOutputStream()方法方法 该方法所获取的字节输出流对象为ServletOutputStream类型。由于ServletOutputStream是OutputStream的子类,它可以直接输出字节数组中的二进制数据。因此,要想输出二进制格式的响应正文,就需要使用getOutputStream()方法。发送响应消息头相关方法4.1 Http
9、ServletResponse对象2getWriter()方法方法 该方法所获取的字符输出流对象为PrintWriter类型。由于PrintWriter类型的对象可以直接输出字符文本内容,因此,要想输出内容全为字符文本的网页文档,需要使用getWriter()方法。 了解了response对象发送响应消息体的两个方法后,接下来,通过一个案例来学习这两个方法的使用,请查看教材文件4-1。 接下来,对文件4-1进行修改,使用getWriter()方法发送消息体,请查看教材文件4-2。 案例代码4.1 HttpServletResponse对象注意:注意:虽然response对象的getOutput
10、Stream()和getWriter()方法都可以发送响应消息体,但是,它们之间互相排斥,不可同时使用,否则会发生IllegalStateException异常,如图所示。图中发生异常的原因就是在Servlet中,调用response.getWriter() 方法之前已经调用了response.getOutputStream() 方法。4.1 HttpServletResponse对象任务案例案例代码 接下来,通过解决中文输出乱码问题来熟悉本阶段的知识点,请查看教材【任务4-1】。【任务4-1】解决中文输出乱码问题任务案例案例代码 接下来,通过实现网页定时刷新并跳转来熟悉本阶段的知识点,请查看
11、教材【任务4-2】。【任务4-2】实现网页定时刷新并跳转 在某些情况下,针对客户端的请求,一个Servlet类可能无法完成全部工作。这时,可以使用请求重定向来完成。所谓请求重定向,指的是Web服务器接收到客户端的请求后,可能由于某些条件限制,不能访问当前请求URL所指向的Web资源,而是指定了一个新的资源路径,让客户端重新发送请求。 为了实现请求重定向,在HttpServletResponse接口中,定义了一个sendRedirect()方法,该方法用于生成302响应码和Location响应头,从而通知客户端重新访问Location响应头中指定的URL,sendRedirect()方法的完整语
12、法如下所示:实现请求重定向4.2 HttpServletResponse应用 需要注意的是,参数location可以使用相对URL,Web服务器会自动将相对URL翻译成绝对URL,再生成Location头字段。 为了使读者更好地了解sendRedirect()方法如何实现请求重定向,接下来,通过一个图来描述sendRedirect()方法的工作原理,如图所示。 在图中,当客户端访问Servlet1时 , 由于在Servlet1中调用了sendRedirect() 方法将请求重定向到Servlet2,因此, Web服务器在收到Servlet1的响应消息 后,立刻向Servlet2发送请求。Ser
13、vlet2对请求处理完毕后,再将响应消息回 送给客户端。4.2 HttpServletResponse应用 了解了sendRedirect()方法的工作原理后,接下来,通过一个用户登录的案例,分步骤讲解sendRedirect()方法的使用,请查看教材4.2.1小节。 案例代码4.2 HttpServletResponse应用在Servlet API中,定义了一个HttpServletRequest接口,它继承自ServletRequest接口,专门用来封装HTTP请求消息。由于HTTP请求消息分为请求行、请求消息头和请求消息体三部分,因此,在HttpServletRequest接口中定义了获
14、取请求行、请求头和请求消息体的相关方法,接下来,本节将针对这些方法进行详细地讲解。4.3 HttpServletRequest对象 当访问Servlet时,会在请求消息的请求行中,包含请求方法、请求资源名、请求路径等信息,为了获取这些信息,在HttpServletRequest接口中,定义了一系列用于获取请求行的方法,如表所示。获取请求行信息的相关信息4.3 HttpServletRequest对象 在表中,列出了一系列用于获取请求消息行信息的方法,为了使读者更好地理解这些方法,接下来,通过一个案例来演示这些方法的使用,请查看教材文件4-10。 案例代码4.3 HttpServletReque
15、st对象 当请求Servlet时,需要通过 请求头向服务器传递附加信 息,例如,客户端可以接收 的数据类型,压缩方式,语 言等等。为此,在 HttpServletRequest接口中 ,定义了一系列用于获取 HTTP请求头字段的方法, 如表所示。获取请求消息头的相关方法4.3 HttpServletRequest对象 在表中,列出了一系列用于读取HTTP请求消息头字段的方法,为了更好地掌握这些方法,接下来通过一个案例来学习这些方法的使用,请查看教材文件4-11。 案例代码4.3 HttpServletRequest对象 在实际开发中,经常会使用Referer头字段,例如,一些站点为了吸引人气并
16、且提高站点访问量,提供了各种软件的下载页面,但是它们本身没有这些资源,只是将下载的超链接指向其它站点上的资源。而真正提供了下载资源的站点为了防止这种“盗链”,就需要检查请求来源,只接收本站链接发送的下载请求,阻止其它站点链接的下载请求。 接下来通过一个案例,分步骤讲解如何利用Referer请求头防止“盗链”,请查看教材4.3.2小节的动手体验。 案例代码 动手体验:利用Referer请求头防止“盗链” 在实际开发中,经常需要 获取用户提交的表单数据 ,例如,用户名、密码、 电子邮件等,为了方便获 取表单中的请求参数,在 HttpServletRequest接口 的父类ServletReques
17、t中 ,定义了一系列获取请求 参数的方法,如表所示。获取请求参数4.4 HttpServletRequest应用 表中,列出了HttpServletRequest获取请求参数的一系列方法。其中,getParameter()方法用于获取某个指定的参数,而getParameterValues()方法用于获取多个同名的参数。接下来,通过一个具体的案例,分步骤讲解这两个方法的使用,请查看教材文件4-13。 案例代码4.4 HttpServletRequest应用任务案例案例代码 接下来,通过解决请求参数的中文乱码问题来熟悉本阶段的知识点,请查看教材【任务4-3】。【任务4-3】解决请求参数的中文乱码问
18、题 Request对象不仅可以获取一系列数据,还可以通过属性传递数据。在ServletRequest接口中,定义了一系列操作属性的方法,具体如下:setAttribute()方法方法 该方法用于将一个对象与一个名称关联后存储进ServletRequest对象中,其完整语法定义如下: 需要注意的是,如果ServletRequest对象中已经存在指定名称的属性,setAttribute()方法将会先删除原来的属性,然后再添加新的属性。如果传递给setAttribute()方法的属性值对象为null,则删除指定名称的属性,这时的效果等同于removeAttribute()方法。通过Request对象
19、传递数据4.4 HttpServletRequest应用getAttribute()方法方法 该方法用于从ServletRequest对象中返回指定名称的属性对象,其完整的语法定义如下:removeAttribute()方法方法 该方法用于从ServletRequest对象中删除指定名称的属性,其完整的语法定义如下:4.4 HttpServletRequest应用getAttributeNames()方法方法 该方法用于返回一个包含ServletRequest对象中的所有属性名的Enumeration对象,在此基础上,可以对ServletRequest对象中的所有属性进行遍历处理。getAtt
20、ributeNames()方法的完整语法定义如下: 需要注意的是,只有属于同一个请求中的数据才可以通过ServletRequest对象传递数据。关于ServletRequest对象操作属性的具体用法,将在后面的小节进行详细讲解。在此,大家只需了解即可。4.4 HttpServletRequest应用 当一个Web资源收到客户端的请求后,如果希望服务器通知另外一个资源去处理请求,这时,除了使用sendRedirect()方法实现请求重定向外,还可以通过RequestDispatcher接口的实例对象来实现。在ServletRequest接口中定义了一个获取RequestDispatcher对象的
21、方法,如表所示。RequestDispatcher接口4.5 RequestDispatcher对象的应用 获取到RequestDispatcher对象后,最重要的工作就是通知其它Web资源处理当前的Servlet请求,为此,在RequestDispatcher接口中,定义了两个相关方法,如表所示。 表中列举的两个方法中,forward()方法可以实现请求转发,include()方法可以实现请求包含,关于请求转发和请求包含的相关知识,将在下面的小节中进行详细讲解。4.5 RequestDispatcher对象的应用 在Servlet中,如果当前Web资源不想处理请求时,可以通过forward(
22、)方法将当前请求传递给其它的Web资源进行处理,这种方式称为请求转发。为了使读者更好地理解使用forward()方法实现请求转发的工作原理,接下来通过一张图来描述,如下图所示。 从图中可以看出,当客户端访问Servlet1 时,可以通过forward()方法将请求转发 给其它Web资源,其它Web资源处理完 请求后,直接将响应结果返回到客户端。请求转发4.5 RequestDispatcher对象的应用 了解了forward()方法的工作原理后,接下来,通过一个案例来学习forward()方法的使用,请查看教材文件4-164-17。 案例代码4.5 RequestDispatcher对象的应用
23、 请求包含指的是使用include()方法将Servlet请求转发给其它Web资源进行处理,与请求转发不同的是,在请求包含返回的响应消息中,既包含了当前Servlet的响应消息,也包含了其他Web资源所作出的响应消息。为了使读者更好地理解使用include()方法实现请求包含的工作原理,接下来,通过一个图来描述如图所示。 从图中可以看出,当客户端访问Servlet1 时,通过调用include()方法将其它Web 资源包含了进来,这样,当请求处理完 毕后,回送给客户端的响应结果既包含 当前Servlet的响应结果,也包含其它Web资源的响应结果。请求包含4.5 RequestDispatche
24、r对象的应用 了解了include()方法的工作原理后,接下来,通过一个案例来讲解include()方法的使用,请查看教材文件4-184-19。 案例代码4.5 RequestDispatcher对象的应用 本章主要介绍了HttpServletResponse对象和HttpServletRequest对象的使用,其中 HttpServletResponse对象封装了HTTP响应消息,并且提供了发送状态码、发送响应消息头、发送响应消息体的方法。使用这些方法可以解决中文输出乱码问题,实现网页的定时刷新跳转,请求重定向等。HttpServletRequest对象封装了HTTP请求消息,也提供了获取请求行、获取请求消息头、获取请求参数的方法。使用这些方法可以解决请求参数的中文乱码问题,并且使用request域对象传递数据的方法,还可以实现请求转发和请求包含。HttpServletResponse和HttpServletRequest在Web开发中至关重要,大家要认真学习,深刻掌握。4.6 本章小结