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):移除值