servlet详解
一, HttpServletResponse响应对象
HttpServletResponse响应对象,内部封装了有关响应的所有操作,只要是针对请求进行数据响应,我们必须用到这个对象
HttpServletResponse是一个接口,继承了ServletReaponse接口,注意使用的时候区分
- 响应行
响应行有两部分
(1)HTTP/1.1
网络传输协议,请求应该遵循的协议
HTTP/1.1代表本次请求应该遵循的网络传输协议为http的1.1版本
http:超文本传输协议,是用于从万维网传输超文本到本地浏览器的传输协议,基于TCP的应用协议,是一个基于请求与响应的无状态协议。
无状态:协议对每一次请求的处理没有记忆功能,当下一次请求时,拿不到上次请求过程中的信息,每次请求响应之间没有关联。
Http的版本迭代:
0.9:简介快速的协议,只能传输文本数据
1.0:每一次的请求和响应都需要建立客户端与服务器的连接,不支持长连接,就是无连接
1.1:在1.0的基础上支持长连接keep-alive
HTTP是基于TCP协议的,我们需要了解一下建立连接的三次握手
第一次握手:客户端向服务器发送了一个请求,服务端接受到信息后知道自己与客户端要进行连接而且是可以连接的
第二次握手:此时客户并不知道服务器是否接收到请求或者是否让自己去连接,所以服务端接受到请求后要向客户端发送一个响应,告知受到了连接消息,并且允许客户端连接
第三次握手:客户端确认与服务端的连接信息后,才开始连接到服务器并且发送数据
(2)响应状态码
常见的响应状态码
1xx:服务器接受到请求,需要请求者继续执行操作,比如再次发送请求才能做出反应
2xx:成功 例如:200
3xx:重定向本次响应成功后就,需要再发送一个请求来完成最终的操作例如:304
4xx:客户端错误,比如路径错误或者无法完成请求 例如404 路径错误 405 方法访问权限不够
5xx:服务器错误,服务器内部在请求处理时发生了错误,这种错误最典型的就是java代码执行的时候发生了异常 例如 500服务器内部错误 - 响应头
在network中,每个请求response headers选项内,除去第一行的响应行信息外,其余的都是本次响应中的头信息,也就是说一次响应中可以包含多个头信息的值
关键字
(1)Content-Length:响应数据的长度
(2)Content-Type:响应数据的类型
(3)refresh:定时刷新,可以实现页面跳转,路径访问的延迟执行
大类型/小类型
text/html video/mp4 image/jpg
如果是文本格式,要指定编码格式,二进制字节不需要
如果要进行数据响应,那么这个头是必须设置的
设置方法:
(1)response.setHeader(“响应头的关键字”,“值”);
(2)response.addHeader(“响应头的关键字”,“值”);
区别:
setHeader 方法只能设置一个,多了之后后面的就覆盖了前面的
addHeader 可以设置多个
3.响应体
(1)概念:响应的数据就是响应体,响应对象response在返回数据,响应数据的时候会将html页面,图片,文件,音频视频等信息通过响应主体返回给浏览器页面,响应体的大部分数据都是文本形式的。
(2)用法:响应数据是由response对象完成的,将响应的数据通过输出流写出去
响应数据时,只能通过response自带的输出流完成写出操作,不能new
response自带的输出流有两个,
response.getWriter() printWrite打印流,只能响应数据
response.getOutStream() ServletOutStream字节输出流,不仅可以响应文本数据,还可以完成二进制数据的响应
二, HttpServletRequest请求对象
HttpServletRequest本身是一个接口,继承了ServletRequest接口
作用:
获取请求中的数据,获取协议,主机,端口,请求路径,项目根目录名称,参数列表,请求方式等信息
- 请求行
获取请求路径中的各部分信息等
@WebServlet("/requestLine")
public class RequestLineServlet extends HttpServlet {
@Override
protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
System.out.println("接收到请求行的请求");
String scheme = request.getScheme();//协议 只有名称
String protocol = request.getProtocol();//协议 + 版本号
String serverName = request.getServerName();//主机地址
int localPort = request.getLocalPort();//本地端口号
int serverPort = request.getServerPort();//服务器端口号
String contextPath = request.getContextPath();//项目根目录名称
String requestURI = request.getRequestURI();//完整的url,从项目根目录开始,到最后访问的资源
//a标签默认的请求方式为get请求
String method = request.getMethod();//请求方式
String queryString = request.getQueryString();//参数列表
System.out.println(scheme);
System.out.println(protocol);
System.out.println(serverName);
System.out.println(localPort);
System.out.println(serverPort);
System.out.println(contextPath);
System.out.println(requestURI);
System.out.println(method);
System.out.println(queryString);
System.out.println(scheme + "://" + serverName + ":" + localPort + contextPath);
/*
web文件夹是存放web资源的根目录,但是我们以后项目中会存在好多模块,比如:
医生模块、药品模块
在web文件夹中创建doctor、medicine文件夹,在文件夹中书写页面
此时我们如果想要访问模块中的页面:
http://localhost:8080/hospital/doctor/add.html
http://localhost:8080/hospital/doctor/insertDoctor 错误404!
http://localhost:8080/hospital/insertDoctor 正确
Servlet的访问必须跟在项目根目录后面!
*/
}
}
- 请求头
接收头信息的方法
request.getHeader(“头信息中的关键字”) - 请求体
(1)获取请求体中的信息
一个关键字对应一个值
request.getParameter(“数据关键字”);返回字符串
一个关键字对应多个值
request.getParameterValues(“数据关键字”);返回数组 String[] 字符串数组
(2)处理乱码的问题
get请求
tomcat8.0之前
String username= request.getParameter(“username”);
username=new String(“username.getBytes(“iso8859-1”)”,“utf-8”);
tomcat8.0和之后
自动处理了乱码问题
post请求
每个版本都需要处理这个问题
request.setCharacterEncoding(“utf-8”);
三,域对象
- 什么是域对象
存在作用域的对象称为域对象,在其作用范围内,可以实现数据共享 - 域对象的最大作用
在其作用范围内,能够实现数据共享,我们可以将域对象理解成为数据存储,传递的载体。 - 使用场景
实现页面间的数据传递 - 域对象的使用方法
(1)setAttribute(“域对象中的关键字”,Object类型的值);
如果域中没有此关键字,则为添加数据
如果域中存在此关键字,则为修改数据
(2)getAttrbute(“数据存储的关键字”);
获取域对象中的数据,返回值是Object类型
(3)removeAttribute(“数据中存储的关键字”);
删除域对象中的数据 - 域对象 (之后会学习别的域对象)
(1)request:请求对象
(2)ServletContext全局管理者对象
区别:
request:
当请求到达Servlet时创建
请求结束,响应完成时销毁
作用范围仅限本次请求
ServletContext
发布项目,tomcat启动项目加载时创建
服务器关闭
作用于整个web项目的运行期间
域对象选用的原则(合适就好)
四,请求转发与重定向
后台模块,只要涉及到路径的跳转,模块的切换,那么我们肯定需要用到请求转发和重定向。
- 请求转发
在服务器中会把请求到别的页面,把数据传递过去
request.getRequestDispatcher(“change”).forward(request,response); - 重定向
只传递请求,不传递数据
response.sendRedirect(“change”); - 区别
(1)请求转发是服务器行为,重定向是客户端行为
(2)请求转发是request对象调用方法,重定向是response对象调用方法
(3)请求转发只有一次请求,可以实现request域对象中的数据共享,而重定向是多次请求,多次响应
(4)请求转发的效率要高于重定向
(5)请求转发url地址栏不变,而重定向会发生变化
(6)既然请求转发是服务器行为,所以只能访问服务器内部资源,而重定向是浏览器行为,地址栏会变,所以可以访问服务器外部资源
五,post和get的主要区别
- 对长度的限制
get在发送数据时,url最大长度是2048个字符 post无限制 - 安全性
get会显示在地址栏。post不会,而且post不会在浏览器历史或者日志中 - 数据类型
get只运行ASCLL字符,post没有限制