HTTP协议
- HTTP:超文本传输协议,详细规定了浏览器和服务器之间的通信规则,通过网络传输HTML文档数据的协议
- HTTP是一个应用层的协议,由请求和相应构成,一次请求一次响应
- HTTP协议的特点:
1.采用的是B/S架构
2.HTTP可以传输各种类型的数据,比如文本,图片,音频和视频等
3.HTTP1.0之前使用的是种短连接的方式,什么是短连接,就是限制每次连接只处理一个请求,服务器处理完成之后
并收到浏览器的应答之后.就会断开连接.这种方式的好处是可以节省传输时间.但是缺点是,我请求了一个HTML文档,这个文档中又包含了,其他JS文件,图片文件,CSS文件,每当浏览器,遇这样一个Web资源,就会建立一个会话,那这样的话需要消耗资源和时间的.
现在我们使用的HTTP1.1的版本使用的是长连接.使用长连接的情况下,当一个网页打开完成后,客户端和服务端之间传输数据时,连接不会关闭,如果客户端再次访问这个服务器上的网页,会继续使用这一条已经建立好的连接.当然,这个连接不会永久保持,服务器中可以设置这个保持连接时间.
4.HTTP协议是一种无状态协议,什么叫协议的状态,就是指下一次传输可以记住本次传输数据的能力,那所谓无状态协议,就是http不会为了下一次连接,而维护本次连接所传输的数据,比如浏览器打开一个网页后,关闭浏览器,然后再次打开浏览器,但是服务器并不知道客户关闭了一次浏览器,所以HTTP是无状态协议,那如果说我们在一个网站中的多个页面间需要共享同一个数据,我们可以通过Cookie和Session来实现.
HTTP之请求Request
所谓的请求:浏览器网服务器发送数据
请求
请求行:请求信息的第一行
请求头:从请求信息的第二行开始到请空行
请求空行:从请求信息的第三行开始到请求空行结束
请求体:从请求空行往下
请求行:
GET /HTTPTest/login?username=zhangsan&password=123456 HTTP/1.1
- 格式:请求方式 /请求的主机名? 请求资源 协议/版本
- 请求常见的方式:get post
get:会把请求的参数拼接到url后面,数据大小有限制,get请求没有请求体
post:会把请求参数放到请求体里面,数据大小无限制
请求头
-
格式 key:value,value (键值)
-
常见的请求头
Accept: text/html,image/* --告诉服务器当前客户端可以接收的文档的类型。其实这里包含了*/*,就表示什么都可以接收; 大类型/小类型 比如 text/css text/javascript
Accept-Charset: ISO-8859-1 --告诉服务器,客户端提交的表单可能使用的编码类型
Accept-Encoding: gzip --浏览器发给服务器,声明浏览器支持的编码类型
Accept-Language:zh-cn --语言环境
Host: localhost:8080 --访问主机
If-Modified-Since: Tue, 11 Jul 2000 18:23:51 GMT 客户端第二次请求此URL时,根据 HTTP 协议的规定,浏览器会向服务器传送 If-Modified-Since 报头,询问该时间之后文件是否有被修改过:
后面跟的时间是本地浏览器存储的文件修改时间Referer: http://www.baidu.com/index.jsp --来自哪个页面、防盗链
User-Agent: Mozilla/4.0 (compatible; MSIE 5.5; Windows NT 5.0)
Cookie
Connection:Keep-Alive --链接状态 长链接
Date: Tue, 11 Jul 2000 18:23:51 GMT --时间
HTTP之Response
所谓的响应:就是服务器往浏览器返回数据
响应:
响应行:响应信息的第一行
响应头:响应行的下一行
响应空行:响应头的下一行
响应体:响应空行的下一行
响应行:
HTTP/1.1 200 OK
- 格式: 协议/版本 响应状态码 响应的描述
响应头
Location: http://www.baidu.org/index.jsp --跳转方向 302重定向
Server:apache tomcat --服务器型号
Content-Encoding: gzip --数据压缩
Content-Length: 80 --数据长度
Content-Language: zh-cn --语言环境
Content-Type: text/html; charset=GB2312 --告诉浏览器,服务器返回的文本采用什么编码
Last-Modified: Tue, 11 Jul 2000 18:23:51 GMT 在浏览器第一次请求某一个URL时,服务器端的返回状态会是200,内容是你请求的资源,同时有一个Last-Modified的属性标记此文件在服务期端最后被修改的时间,
Refresh: 1;url=http://www.hehe.org --定时刷新
Content-Disposition: attachment; filename=aaa.zip --下载
Set-Cookie:SS=Q0=5Lb_nQ; path=/search 让浏览器将数据保存到本地
Expires: -1 --缓存 -1 就是让页面立即过期
Cache-Control: no-cache --浏览器和缓存服务器都不应该缓存页面信息强制每次请求直接发送给源服务器,而不经过本地缓存版本的校验
Connection: Keep-Alive --保持连接 长链接
Date: Tue, 11 Jul 2000 18:23:51 GMT
动态Web开发技术
常见的动态web开发技术:servlet jsp php .ent
Servlet
- 概念:运行在服务器端的小程序,它定义了一个类被浏览器访问的规则,是一个接口
- 功能:接受请求 处理请求 做出响应
快速入门
- 0.创建web项目
- 1.定义一个Java类,实现Servlet接口
- 2.重写所有未实现方法
- 3.配置Servlet,在web.xml
<!-- 配置Servlet,为了配置Servlet的访问路径 -->
<servlet>
<!--给servelet起名字-->
<servlet-name>demo1</servlet-name>
<!--配置servlet全路径-->
<servlet-class>cn.itcast.servlet.ServletDemo1</servlet-class>
</servlet>
<!--配置servlet映射-->
<servlet-mapping>
<servlet-name>demo1</servlet-name>
<!--配置在浏览器里面请求servlet的虚拟路径-->
<url-pattern>/demo</url-pattern>
</servlet-mapping>
- 4.发布项目
- 5.访问/demo路径访问该Servlet
浏览器中:http://127.0.0.1:8080/项目名/web.xml中配置的虚拟路径名
服务器通过反射的方式 创建Servlet对象,调用其方法
servlet生命周期:
-
被创建:默认情况下,Servlet第一次被访问时,被创建,调用init()方法。
只执行一次。Servlet是单例的。可能会存在线程安全问题,尽量不要定义成员变量。
可以配置Servlet的创建时机。在web.xml的标签中配置
0 -
提供服务:每一次被访问时,会调用service()方法提供服务
-
被销毁:服务器关闭时,servlet被销毁。
服务器正常关闭是,在销毁Servlet之前,会调用destory()方法
ServletConfig对象:
配置对象 ServletConfig是一个接口 在Servlet初始化的时候 有服务器创建其子类对象传递给 init()方法
功能:
- 1.获取servlet初始化参数
* String getInitParameter(String name)
* Enumeration getInitParameterNames()
*
例子
System.out.println(config.getInitParameter("src"));
System.out.println(config.getInitParameter("href"));
Enumeration<String> names = config.getInitParameterNames();
while (names.hasMoreElements()) {
String key = names.nextElement();
System.out.println(key);
System.out.println(config.getInitParameter(key));
}
初始化参数可在 web.xml中配置
<servlet>
<servlet-name>demo3</servlet-name>
<servlet-class>com.click369.servlet.ServletDemo3</servlet-class>
<!--配置一些初始话参数-->
<init-param>
<param-name>src</param-name>
<param-value>c://a.txt</param-value>
</init-param>
<init-param>
<param-name>href</param-name>
<param-value>d://a.txt</param-value>
</init-param>
</servlet>
<servlet-mapping>
<servlet-name>demo3</servlet-name>
<url-pattern>/demo3</url-pattern>
</servlet-mapping>
- 获取ServletContext对象 因为 ServletContext对象是由服务器创建出来的 我们要获取其对象 得通过ServletConfig对象中的方法才能获取出来
* ServletContext getServletContext() - 3.获取servlet配置的名称 就是在web.xml中给servlet起的名字
* String getServletName()
* Servlet中对应getServletConfig方法。要想使用该方法获取config对象。
则需要提升config对象的作用域。
1.声明成员变量ServletConfig
2.在init方法中赋值
3.在getServletConfig方法中获取
创建方式
- 实现Servlet
- 继承GenericServlet
1.适配器
2.对ServletConfig进行优化。提升config对象的作用域
3.实现了ServletConfig接口,简化对config对象的使用方式 - 继承HttpServlet:对http协议的封装
* 重写doGet()和doPost()…方法 注意去掉super.doGet(); 和 super.doPost();
自动创建Servlet
ServletContext:代表了整个web应用
特点:
由服务器创建
单例
* 功能:
- 域对象:在域的范围内共享数据
* 范围:整个web应用
* 存储所有用户共享的数据
* setAttribute():
* getAttribute():
* removeAttribute():
JavaWeb中四大域对象:
* ServletContext:代表整个web应用
* HttpSession:会话域
* ServletRequest:请求域
* PageContext:页面域
-
获取文件mime类型:
* getMimeType(文件名称): -
获取文件运行的真实路径:
* 真实路径:指服务器路径
* getRealPath():
* 1.webRoot下:项目根目录下
* 2.WEB-INF下: 项目根目录下/WEB-INF
* 3.src下: 项目根目录下/WEB-INF/classes -
注意:如果getRealPath("/"),获取的路径是项目的根目录
//根目录
ServletContext context = this.getServletContext();
String rootpath = context.getRealPath("/");
//System.out.println(rootpath);
//1.webRoot
String b = context.getRealPath("/b.txt");
System.out.println(b);
//2.WEB-INF
String c = context.getRealPath("/WEB-INF/c.txt");
System.out.println©;
//3.src
String a = context.getRealPath("/WEB-INF/classes/a.txt");
System.out.println(a); -
ServletContext只能用于web环境。如果是非web环境,则使用ClassLoader来获取真实路径
比如我web项目里有一个普通的java工具类 我想获取文件的真实路径 那我就用不了 ServletContext
//1.获取该类对应的类加载器对象
ClassLoader loader = this.getClass().getClassLoader();
//2.获取文件运行的真实路径
URL url = loader.getResource(“a.txt”);
String path = url.getPath();
//注意类加载器来获取路径也有局限性 只能获取src目录下的文件
// 方式2
InputStream stream = MyUtil.class.getResourceAsStream("/a.txt");
System.out.println(stream);