1.1 HttpServletResponse对象

在Servlet API中,定义了一个HttpServletResponse接口,它继承自ServletResponse接口,专门用来封装HTTP响应消息。由于HTTP响应消息分为状态行、响应消息头、消息体三部分,因此,在HttpServletResponse接口中定义了向客户端发送响应状态码、响应消息头、响应消息体的方法。

1.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.IOExecption

public void sendError(int code, String message)

throws java.io.IOExecption

第一个方法只是发送错误信息的状态码,而第二个方法除了发送状态码外,还可以增加一条用于提示说明的文本信息,该文本信息将出现在发送给客户端的正文内容中。

1.1.2发送响应消息头相关的方法

当Servlet向客户端发送响应消息时,由于HTTP协议的响应头字段有很多种,为此,在HttpServletResponse接口中,定义了一系列设置HTTP响应头字段的方法。

方法声明

功能描述

void addHeader(String name, String value)

用来设置HTTP协议的响应头字段,参数name用于指定响应头字段的名称,参数value用于指定响应头字段的值。第一个方法可以增加同名的响应头字段,第二个方法则会覆盖同名的头字段

void setHeader(String name, String value)

void addIntHeader(String name, String value)

专门用于设置包含整数值的响应头。避免了使用addHeader和addHeader方法时,需要将int类型的设置值转换为String类型分麻烦

void setIntHeader(String name, String value)

void setContentLength(int len)

设置响应消息的实体内容的大小,单位为字节。对于HTTP协议来说,此方法是设置Content-Length响应头字段的值

void setContentType(String type)

设置Servlet输出内容的MIME类型,对于HTTP协议来说,是设置Content-Type头字段中的值。发送内容是jpeg图像,需要将响应头字段的类型设置为”image/jpeg”。响应内容为文本,setContentType方法还可以设置字符编码,如text/html;charset=UTF-8。

void setCharacterEncoding(String charset)

设置输出内容使用的字符编码,对HTTP协议来说,是设置Content-Type头字段中的字符集编码部分。一般不使用

addHeader()、setHeader()、addIntHeader()、setIntHeader()方法用于设置各种头字段,而setContentType()和setCharacterEncoding()方法用于设置字符编码,这些设置字符编码的方法可以有效解决乱码问题。

1.1.3发送响应消息体相关的方法

由于在HTTP响应消息中,大量的数据都是通过响应消息体传递的,因此,ServletResponse遵循以IO流传递大量数据的设计理念。在发送响应消息体时,定义了两个与输出流相关的方法,具体如下:

(1)getOutputStream()方法

该方法所获取的字节输出流对象为ServletOutputStream类型。由于ServletOutputStream是OutputStream的子类,它可以直接输出字节数组中的二进制数据。因此,要想输出二进制格式的响应正文,就需要使用getOutputStream()方法。

(2)getWriter()方法

该方法所获取的字符输出流对象为PrintWriter类型。由于PrintWriter类型的对象可以直接输出字符文本内容,因此,要想输出内容全为字符文本的网页文档,需要使用getWriter()方法。

注意:虽然response对象的getOutputStream()和getWriter()方法都可以发送响应消息体,但是,它们之间互相排斥,不可同时使用,否则会发生illegalStateException异常。

若是能写出来的内容就用字符流,其他的全部用字节流。

 

1.2文件下载原理(两个头两个流)

response---响应对象,作用:给浏览器做响应信息的。

响应的组成:响应行、响应头、响应体。

1.2.1操作响应行

格式:协议/版本 状态码 状态码说明 HTTP/1.1 200 OK

常用的方法:

操作状态码:5种状态码

1 2 3正常响应   4 5 有问题的响应

setStatus(状态码):针对的是1xx 2xx 3xx

在代码中写重定向需要2步:(后续会被更好的方法取代)

设置状态码 setStatus(302);

设置一个头 response.setHeader(“location”,”servlet路径”);

1.2.2操作响应头(重点)

格式:key:value(value可以是多个值)

常用方法:setHeader(String key, String value):设置字符串形式的响应头

(了解)addHeader(String key, String value):添加字符串形式的响应头,若没有设置则设置,若设置过则添加

常用的响应头(掌握):

(1)location:重定向

重定向方式一(了解),需要配合302状态码一起使用

response.setStatus(302);

response.setHeader(“location”, ”重定向的地址”);

重定向方式二(掌握)

response.sendRedirect(“url”);

(2)Content-type:设置文件的MIME类型,并且通知浏览器用什么编码打开

(了解)response.setHeader(“content-type”, “文件的MIME类型;charset=utf-8”);

(重要)response.setContentType(“文件的MIME类型;charset=utf-8”);

response.setContentType(“文件的MIME类型”);设置单一的头

(3)refresh:定时刷新

response.setHeader(“refresh”, “秒数;url=跳转的路径”);

(4)content-disposition:文件下载

固定的:response.setHeader(“content-disposition”,”attachment;filename=”文件名称);

1.2.3文件下载

通常情况下,不需要使用第三方组件实现,而是直接使用Servlet类和输入/输出流实现。与访问服务器文件不同的是,要实现文件的下载,不仅需要指定文件的路径,还需要在HTTP协议中设置两个响应消息头,具体如下:

//设定接收程序处理数据的方式

setHeader(“content-disposition”,”attachment;filename=”文件名称);

//设定实体内容的MIME类型

setContentType(“content-type:application/x-msdownload”);

浏览器通常会直接处理响应的实体内容,需要在HTTP响应消息中设置两个响应消息头字段,用来指定接收程序处理数据内容的方式为下载方式。

使用工具类:commons-io-1.4.jar

方法:IOUtils.copy(is, os);  //解决流的对拷

当单击“下载”超链接时,系统将请求提交到对应的servlet。在该servlet中,首先获取下载 文件地址,并根据该地址创建文件字节输入流,然后通过该流读取下载文件内容,最后将读取的内容通过输出流写到目标文件中。

 

1.3 response解决中文乱码问题

在开发中,如果需要响应给浏览器中文数据,需要使用getWriter()方法,tomcat使用getWriter()处理字符时,默认编码是ISO8859-1。响应给浏览器的数据,此时为乱码。

在HttpServletResponse对象中,提供了两种解决乱码的方案。

第一种方式:

//设置HttpServletResponse用utf-8编码,此数据提供给tomcat使用

response.setCharacterEncoding(“utf-8”);

//告知浏览器用utf-8编码查看数据

response.setHeader(“Content-Type”, ”taxt/html;charset=utf-8”);

第二种方式:

//使用通用方法,setContentType底层自动调用了setCharacterEncoding

response.setContentType(“text/html;charset=utf-8”);

通常情况下,为了使代码更加简洁,会采用第二种方式。

 

1.4生成随机验证码

作用:防止用户使用程序不停地访问服务器进行恶意登陆。

通过servlet生成验证码,通过response来响应到页面。

 

1.5统计一个Servlet的访问次数

servletContext上下文对象(全局管理者)

1.5.1 servletContext生命周期

创建:当服务器一运行,就会为部署在它里面的每一个项目分别生成一个servletContext对象。

销毁:服务器正常关闭或者项目移除的时候,servletContext对象就会销毁。

1.5.2 servletContext的作用:

(1)资源共享(本项目下的所有servlet都可以共享它)

(2)获取全局的初始化参数

(3)获取一个文件的MIME类型(一个html文件即text/html类型)

(4)管理文件(获取文件路径,根据文件获取流)

1.5.3获取servletContext的方式

(1) ServletContext getServletConfig().getServletContext()

(2) ServletContext getServletContext()

1.5.4获取

servletConfig(servlet配置对象)对象和ServletContext对象

直接在自己的servlet里面调用:

this.getServletConfig()

this.getServletContext()

 

1.6常用的方法(掌握)

获取全局的初始化参数

String getInitParameter(String name):获取指定的初始化参数

获取一个文件的MIME类型

getMimeType(String filename):获取文件的mime类型

管理文件

getRealPath(String path):获取当前项目在tomcat服务器中的根路径

InputStream is=new FileInputStream(new File(path)) 之前的获取方式

getResourceAsStream(String path):根据文件获取流

资源共享的方法(可以当作是map集合)

setAttribute(String key,Object value):存储值

Object getAttribute(String key):获取值,若没有则返回一个null

removeAttribute(String key):移除值