HTTP协议:
1.约束了浏览器以何种格式向服务端发送数据:
2.约束了服务器应该以何种格式来接受客户端发送的数据:
3.约束了服务器应该以何种格式来反馈数据给浏览器;
4.约束了浏览器应该以何种格式来接收服务器反馈的数据.
说白了HTTP协议就是浏览器和服务器之间的一问一答的数据需要按照一定的格式.
现在大多数浏览器使用HTTP1.1版本的协议:
1.在一个TCP连接上可以传送多个HTTP请求和响应
2.多个请求和响应过程可以重叠进行
3.增加了更多的请求头和响应头
请求消息:
请求行:位于请求消息的第一行
格式:请求方式 资源路径 HTTP版本号
常用请求方式:GET和POST方式
Get请求方式:
a、若请求服务器上的某个资源,没有指定请求方式,则默认为GET方式
b、可以通过GET方式向服务器传递数据。具体方式就是在URL请求路径后加上?多个参数以&分割。
比如 http://localhost:8080/a.html?username=abc&password=123
注:GET请求方式,数据不安全且有URL长度限制(1K)
Post请求方式:
a、若使用Post请求方式传递数据,可以借助form表单的method="post"
b、数据相对安全,且长度没有限制
若干请求头:从第二行开始到下一个空行。作用:向服务器传递客户端的一些基本信息
请求实体:从第一个空行开始,后面的都是正文。(可以没有,GET方式就没有),只有POST请求才有请求实体.
GET/POST区别:
get:没有请求实体,参数在地址栏,提交数据大小有限制,get有缓存
post:有请求实体,参数在请求实体中,大小无限制,没有缓存,更安全
从浏览器到服务器的响应的整个过程:
- 在浏览器中,输入一个url地址.
解析出来url的ip和端口.
ip用来定位主机,端口用来定位程序.
www.wolfcode.cn -----> 变成一个ip.
2.通过ip和端口,使用TCP协议来连接服务器.
三次握手.
3.通过端口找到指定的程序.发送请求信息.
要访问该程序的资源,请求头,请求参数====>HTTP协议.
4.通过请求信息,处理业务逻辑.
如果仅仅是访问一个静态的资源,直接给浏览器把资源以流的形式响应回去.
如果是动态资源(通过java代码获取出来的数据),
先在服务器中使用java代码,完成功能.返回一个界面,界面中包含动态的数据.
5.遵循HTTP协议,把数据响应给浏览器:
响应行,响应头,响应实体(HTML界面)
6.浏览器获取到响应信息,去解析.
MIME:text/html. image/gif, 浏览器的渲染.
7.这次请求结束之后,会保持一定的时间的连接.超过连接时间,断开连接,下一次请求需要重新执行上面的步骤.
什么是servlet?
servlet是一种规范,是连接客户端与服务端的一个组件,是构成web动态网页的关键,它完成客户端与服务端之间的逻辑处理
开发servlet的流程:
准备工作:
项目搭建:
-
webapp
- index.html
- WEB-INF
classes
lib
web.xml
不要忘记导入jar包 servlet-api.jar
开发:
定义一个类 实现servlet接口
实现未实现的方法
其中service方法才是重点
web.xml
<servlet>
<servlet-name>ServletHello</servlet-name>
<!--被管理的servlet的全限定名-->
<servlet-class>com.servletdemo.hello.ServletHello</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>ServletHello</servlet-name>
<!--必须以斜杠开头-->
<url-pattern>/ServletHello</url-pattern>
</servlet-mapping>
然后重启服务器
servlet生命周期:
servlet的对象的创建到servlet对象的销毁这个过程.(生命周期的方法,是tomcat调用的.)
生命周期的方法:
public HelloServlet(): 构造方法,服务器创建对象的时候,执行.只创建一个对象.
void init(ServletConfig config): 初始化方法.第一次创建对象的时候,执行.
void service(ServletRequest req, ServletResponse resp): 服务方法,只要请求该资源一次,就会执行一次
void destory():销毁方法.扫尾的操作.服务器正常关闭的时候执行.
第一次访问服务器会创建servlet对象,执行init方法,执行service方法
会把请求资源封装在request对象中
第N次访问
不会再执行初始化方法,直接执行service方法
servlet请求流程:
1.解析url
http://localhost/a/ServletHello
ip/port/上下文路径/资源名
localhost:如果不存在 不能连接
2.通过上下文路径: /a 去service.xml文件中找是否存在该项目
3.带着资源名 /ServletHello 去webapp中的web.xml文件中找
url-pattern ----->name----->class
拿到全限定名后可以创建对象
然后执行初始化方法init();
service();
把创建的对象存进缓存池中
当再次被访问时 不在执行初始化和创建对象,会只执行service();
再次访问时会去判断是否时第一次访问:
去缓存池中寻找 是否存在当前请求的类的对象
实例缓存池: Map<String, Servlet> map;
if(map.get(“全限定名”) == null){
// 第一次访问,执行第六步
} else{
// 第N次,直接执行第七步
}
servlet继承体系:
servlet
GenericServlet
如果写了多个servlet,每一个service方法中,都需要强转类型.
解决方案:
专门定义一个类,把对象强转.HttpServlet.
书写servlet的模板:
1. 继承HttpServlet.
2.复写参数带着Http开头的service方法.
3.注释父类的默认实现.