一、学习目标
1.HttpServletResponse对象
2.HttpServletResponse 应用
3.HttpServletRequest 对象
4.RequestDispatcher接口
二、重要知识点
Servlet最主要的作用就是处理客户端请求,并向客户端做出响应。为此,针对Servlet的每次请求,Web 服务器在调用service()方法之前,都会创建两个对象,分别是 HttpServletRequest和 HttpServletResponse。其中, HttpServletRequest 用于封装HTTP请求消息,简称request对象。HttpSelrvletResponse用于封装 HTTP 响应消息,简称response对象。request 对象和response对象在请求Servlet过程中至关重要,接下来,通过一张图来描述浏览器访问 Servlet的交互过程。
1.HttpServletResponse对象
1.1 发送状态相关的方法
当Servlet向客户端回送响应消息时,需要在响应消息中设置状态码。为此,在HttpServletResponse接口中,定义了两个发送状态码的方法,具体如下。
(1)setStatus(int status)方法
该方 法用于设置HTTP响应消息的状态码,并生成响应状态行。由于响应状态行中的状态描述信息直接与状态码相关,而HTTP版本由服务器确定,因此,只要通过setStatus(int status)方法设置了状态码,即可实现状态行的发送。需要注意的是,正常情况下,Web服务器会默认产生一个状态码为200的状态行。
(2) sendError(int sc)方法
该方法用于发送表示错误信息的状态码,例如,404状态码表示找不到客户端请求的资源。在response对象中,提供了两个重载的sendError(int sc)方法,具体如下。
public void sendError (int code) throws java. io. IOException
public void sendError (int code, String message) throws java. io.
其中第一个是发送错误信息的状态码,第二个方法不仅可以发送状态码还可以增加一条用于提示的文本信息,这个提示信息会出现在发送给客户端正文内容中。
1.2发送响应消息头相关的方法
当 Servlet向客户端发送响应消息时,由于HTTP 协议的响应字段有很多种,为此,在HtpServletResponse接口中,定义了一系列设置HTTP响应头字段的方法,如表
方法声明 | 功能描述 |
---|---|
void addHeeder(String name, String value) | |
void setHeader(String name,String value) | 这两个方法都是用来设置 HTTP 协议的响应头字段,其中,参数name用于指定响应头字段的名称,参数vaue用于指定响应头字段的值。不同的是,addHeader()方法可以增加同名的响应头字段而 setHeader)方法则会覆盖同名的头字段 |
void addlntHeader(String name,int value) | |
void setlntHeader(String name,int value) | 这两个方法专门用于设置包含整数值的响应头。避免了使用addHeader()与setHeader)方法时,需要将int突型的攻置值转换为String类型的麻烦 |
void setContentLength(int len) | 该方法用于设置响应消息的实体内容的大小,单位为字节。对于HTTP协议来说,这个方法就是设詈Content-Length 问N头字段的值 |
void setContentType(String type) | 该方法用于设置 Servlet 输出内容的MIME类型,对于HTTP协议来说,就是设置Content-Type响应头字段的值。例如,如果发送到客户端的内容是 jpeg 格式的图像数据,就需要将响应头字段的类型设置为“imageljpeg"。需要注意的是,如果响应的内容为文本,setContentType()方法还可以设置字符编码,如:text/html;charset=UTF-8 |
void setLocale(Locale loc) | 该方法用于设置响应消息的本地化信息。对HTTP 来说,就是设置Content-Language 啊应头子段和 Content-Type头字段中的字符集编码部分。需要注息的是,如果 HTTP 消息没有设置Content-Type 头子段,SeILocale()万法设置的字符集编码不会出现在HTTP 消息的啊应头十,如未调用 setCharacterEncoding()setLocale()方法将不再具有指定字符集编码的功能 |
void setCharacterEncoding(Stringcharset) | 该方法用于设置内容使用的字符编码,对HTTP协议来说,,就是设置Content-Type头字段中的字符集编码部分。如果没有设置 Content-Type头字段,setCharacterEncoding方法设置的字符集编码不会出现在HTTP消息的响应头中。SetCharaclerEncoding()方法比setContentType()和setLocale()方法的优先权高,它的设置结果将覆盖setContentType()和setLocale()方法所设置的字符码表 |
1.3发送响应消息体相关的方法
由于在HTTP响应消息中,大量的数据都是通过响应消息体传递的,因此, ServletResponse遵循以IO流传递大量数据的设计理念。在发送响应消息体时,定义了两个与输出流相关的方法,
具体如下:
1.getOutputStream()方法
该方法所获取的字节输出流对象为ServletOutputStream 类型。由于ServletOutputStream是OutputStream的子类,它可以直接输出字节数组中的二进制数据。因此,要想输出二进制格式的响应正文,就需要使用getOutputStream()方法。
2. getWriter()方法
该方法所获取的字符输出流对象为PrintWriter类型。由于PrintWriter类型的对象可以直接输出字符文本内容, 因此,要想输出内容全为字符文本的网页文档, 需要使用getWriter()方法。
2.HttpServletResponse 应用
3.HttpServletRequest 对象
4.RequestDispatcher接口
三、实际运用
1.HttpServletResponse 应用
解决中文输出乱码的问题
在这里插入代码片
-
创建ChineseServlet
-
配置映射信息,查看运行结果
在web xm中配置完ChineseServlet的映射后,启动Tomcal服务器,在浏览器的地批栏中输入地址"http://localhost:9999/04/chinese"访问ChineseServle。浏览器显示的内容都是“???", 说明发生了乱码问题。实际上此处产生乱码的原因是response对象的字符输出流在编码时,采用的是ISO- 8859- 1的字符码表,该码表并不兼容中文,会将“中国”编码为“63 63” (在IS0-8859- 1的码表中查不到的字符就会显示63 )。当浏览器对接收到的数据进行解码时,会采用默认的码表GB2312,将“63”解码为“?”。因此,浏览器将“中国”两个字符显示成了“???”。
为了解决上述编码错误,在HttpServletResponse 接口中,提供了一个setCharacterEncding()方法,该方法用于设置字符的编码方式,设置字符编码使用的码表为UTF-8。response.setCharacterEncoding(“utf-8”) ;
在浏览器的地址栏中输入URL ""http://localhost:9999/04/chinese’“再次访问。
浏览器中显示的乱码虽然不是”???"但也不是需要输出的“中国。通过分析发现,这是由于浏览器解码错误导致的。
浏览器的显示内容没有出现乱码,由此说明,通过修改浏览器的编码方式可以解决乱码,但是,这样的做法仍然是不可取的,因为不能让用户每次都去改动浏览器编码。为此,在HttpServletResponse对象中,提供了两种解决乱码的方案,具体如下。
第1种方式:
//设置HttpServletResponse使用utf-8编码
response. setCharacterEncoding (“utf-8”) ;
//通知浏览器使用utf-8解码
response . setHeader (“Content-Type”, “text/html; charset=utf-8”) ;
如图:
第2种方式:
//包含第一种方式的两个功能
response. setContentType (" text/html;charset=utf-8");
通常情况下,为了使代码更加简洁,会采用第2种方式。使用HttpServletResponse对象的第2种方式来解决乱码问题,修改后的代码。
如图:
任务二: 实现网页定时刷新并转跳
- 创建Servlet
- 配置映射信息,查看运行结果
在实际开发中,有时需要当前页面具有自动刷新的功能,使当前页面每隔3秒自动刷新。也可以显示当前时间。
启动Tomcal服务器,在浏览器的地批栏中输入地址"http://localhost:9999/04/fresh"访问fresh。
例:
RefreshServlet
实现请求重定向
在某些情况下,针对客户端的请求,一个Servlet类可能无法完成全部工作。这时,可以使用请求重定向来完成。所谓请求重定向,指的是Web服务器接收到客户端的请求后,可能由于某些条件限制,不能访问当前请求URL所指向的Web资源,而是指定了一个新的资源路径,让客户端重新发送请求。
为了实现请求重定向,在HttpServletResponse接口中,定义了一个sendRedirect()方法,该方法用于生成302响应码和Location响应头,从而通知客户端重新访问Location响应头中指定的URL, sendRedirect()方法的完整语法如下所示。
public void sendRedirect (java. lang.String location)
throws java. io. IOException
需要注意的是,参数location可以使用相对URL,Web服务器会自动将相对URL翻译成绝对URL,再生成Location头字段。
3.HttpServletRequest 对象
3.1 获取请求行信息的相关方法
3.2 获取请求消息头的相关方法
4.HttpServletRequest 应用
5.RequestDispatcher 对象的应用
5.1 请求转发
RequestResultServlet
启动Tomcal服务器,在浏览器的地批栏中输入地址"http://localhost:9999/04/Result"访问 RequestResultServlet。
RequestFowardServlet
启动Tomcal服务器,在浏览器的地批栏中输入地址"http://localhost:9999/04/foward"访问 RequestFowardServlet。