web基础(1)

一、HTTP协议
htyper text transform protocal:超文本传输协议:如何在互联网上传输网页。
HTTP协议 基于请求-响应模型
HTTP协议分为请求部分,响应部分.
(A)请求部分(请求行/请求头/请求体):
请求行(请求方式 本次请求路径 协议/版本),请求方式(POST/GET,一共设计7个方法);本次请求哪些内容;本次请求采用的协议以及协议版本

请求头:1_告诉服务器对客户端描述2_对本次请求描述
格式:
K1:v1
K2:v2
K3:v3

观察HTTP协议请求头:
Host:主机 Accept:接收的 Language:语言 Connection:连接
User-agent:客户代理 Content:内容

火狐浏览器下访问百度图片.

https://ss0.bdstatic.com/5aV1bjqh_Q23odCf/static/superman/img/logo/bd_logo1_31bdc765.png

观察本次请求过程:

Host:"ss0.bdstatic.com"
User-Agent:"Mozilla/5.0 (Windows NT 6.1; WOW64; rv:46.0) Gecko/20100101 Firefox/46.0"
Accept:"text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8"
Accept-Language:"zh-CN,zh;q=0.8,en-US;q=0.5,en;q=0.3"
Accept-Encoding:"gzip, deflate, br"
Connection:"keep-alive"
Referer:
If-Modified-Since:
Cookie:
Content-Length:

Host: 本次请求的主机路径
User-Agent:告诉服务端本次请求客户端所在的平台以及本次请求采用的浏览器
Accept:用于指定客户端接受哪些类型的信息.eg:Accept:image/gif,表明客户端希望接受GIF图象格式的资源;Accept:text/html,表明客户端希望接受html文本.
Accept-Language:告诉服务端,浏览器可以识别的语言种类
Accept-Encoding:告诉服务端,浏览器可以哪些类型压缩格式数据 gzip,defalte
connection: keep-alive/ closed
Content-Type:本次请求内容,向服务端发起的时候,发送数据格式,
Referer: Http协议头中的Referer主要用来让服务器判断来源页面,即用户是从哪个页面来的,通常被网站用来统计用户来源,是从搜索页面来的,还是从其他网站链接过来,或是从书签等访问,以便网站合理定位.
If-Modified-Since:把上次请求的资源的最后修改时间还给服务器;

GET/POST区别?
1 .get不安全 post安全
2:由于GET方式受浏览器地址栏约束,所以传输的数据量比POST少. PS:协议本身没有约束GET比POST少
3:GET包含在请求行的,请求路径之后传递到服务端 www.ab.com?name=tom&age=18&sex=nan
POST方式包含在请求体发送到服务端了name=tom&age=18&sex=nan

(B)响应部分(响应行/响应头/响应体):

格式:
HTTP/1.1  200  OK(换行)
K1:v1
K2:v2
K3:v3
空行
<html>
  首页内容
</html>

响应行:
HTTP/1.1 200 OK回车换行(本次响应采用的协议 状态码:协议设计之初,用一些数字描述了本次响应 状态描述:用文字本次响应进行简短描述)

状态代码有三位数字组成,第一个数字定义了响应的类别,且有五种可能取值:
1xx:指示信息–表示请求已接收,继续处理
2xx:成功–表示请求已被成功接收、理解、接受
3xx:重定向–要完成请求必须进行更进一步的操作
4xx:客户端错误–请求有语法错误或请求无法实现
5xx:服务器端错误–服务器未能实现合法的请求

常见状态代码,状态描述说明:

200   OK         //客户端请求成功
404   Not Found    //请求资源不存在,eg:输入了错误的URL
500   Internal Server Error   //服务器发生不可预期的错误
302   move found 重定向,当响应码为302时,表示服务器要求浏览器重新再发一个请求,
服务器会发送一个响应头Location,它指定了新请求的URL地址
304   当用户第一次请求index.html时,服务器会添加一个名为Last-Modified响应头,这个头
说明了index.html的最后修改时间,浏览器会把index.html内容,以及最后响应时间缓
存下来.当用户第二次请求index.html时,在请求中包含一个名为If- Modified-Since请
求头,它的值就是第一次请求时服务器通过Last-Modified响应头发送给浏览器的值,即
index.html最后的修改时间,If-Modified-Since请求头就是在告诉服务器,我这里浏览器
缓存的index.html最后修改时间是这个,您看看现在的 index.html最后修改时间是不
是这个,如果还是,那么您就不用再响应这个index.html内容了,我会把缓存的内容直接
显示出来.而服务器端会获取If-Modified-Since值,与index.html的当前最后修改时间比
对,如果相同,服务器会发响应码304,表示index.html与浏览器上次缓存的相同,无需再
次发送(节省传输成本),浏览器可以显示自己的缓存页面,如果比对不同,那么说明
index.html已经做了修改,服务器会响应200.

三、客户端向服务端发送HTTP协议的请求部分
在这里插入图片描述

1_创建Socket对象,连接51cto网站所在的服务器,访问51cto的首页
2_通过socket获取到输出流对象和输入流对象
通过输出流将HTTP协议的请求部分发送到51cto网站所在服务器
3_服务端获取到HTTP请求部分,对本次请求做了响应
4_客户端(TestClient)通过获取到的输入流对象,读取来自服务端
响应到客户端的数据

服务端向客户端响应HTTP协议的响应部分:
在这里插入图片描述

四、web开发的基本概念
WEB通信底层实现过程:
在这里插入图片描述
1_启动服务端的服务器,运行main函数,创建ServerSocket监听服务端的8080端口号
2_客户端建立一个Socket,对服务端发起一个请求
3_服务端的ServerSocket监听到来自客户端的Socket对自己的请求,获取到一个和客户端对应的Socket对象. 此时服务端和客户端都有一个Socket对象,都可以获取到自己的输入流和输出流
4_客户端通过获取到的输出流将HTTP协议请求部分发送到服务端
5_服务端通过输入流读取来自客户端的数据
6_服务端通过输出流向客户端将HTTP协议的响应部分发送到客户端
7_客户端通过输入流读取来自服务端的数据

WEB资源介绍:
互联网上的各个网站下存放着哪些内容呢?有静态的文件,也有动态运行着着程序.静态文件称之伟静态资源,运行着的程序称之为动态资源.
静态资源:指web页面中供人们浏览的数据始终是不变.比如:HTML,CSS,JS,图片,多媒体.
动态资源:指web页面中供人们浏览的数据是由程序产生的,不同时间点访问web页面看到的内容各不相同.比如:JSP/Servlet,ASP.NET,PHP。

URL请求路径
统一资源定位符是对互联网上资源位置的一种表示(互联网上的每个文件都有一个唯一的URL).
格式:协议://域名:端口号/资源位置?参数=值

Tomcat:web服务器
创建个各个网站(动态程序/静态文件),发布在服务器下.当服务器启动之后,就可以访问服务器下的各个网站中的文件,程序.

Tomcat目录结构
configuration:配置 log:日志
各个目录中存放的什么内容? work temp
bin:启动和停止服务器所需资源
conf:存放tomcat服务器配置信息
lib:tomcat和web应用(自己实现的网站)所需要的JAR包
logs:日志信息
Webapps:存放各个WEB应用
work: JSP

Web项目最基础的目录结构要求
根目录(网站)
根目录(网站)/WEB-INF
根目录(网站)/WEB-INF/lib
根目录(网站)/WEB-INF/classes
根目录(网站)/WEB-INF/web.xml
在这里插入图片描述

各种引擎:
1.服务器响应到客户端浏览器的内容都是字符串。
2.浏览器需要有专业的程序识别html标签部分,识别HTML标签的程序就是HTML引擎
3.浏览器需要有专业的程序识别css代码部分,识别CSS代码的程序就是CSS引擎.
4:类似的专业识别JS代码的就是JS引擎.

五、web执行流程
1.实现项目,发布到服务器下
2.启动WEB服务器Tomcat
运行tomcat内部的main函数,
启动ServerSocket对象,监听服务端的8080端口号,
等待来自客户端的请求
3.用户在浏览器地址栏输入 http://localhost:8080/test/myFirst ,向服务端发起请求, 浏览器底层建立一个和服务端对应的socket,将HTTP协议的请求部分发送到服务端 浏览器底层通过socket可以获取到2种管道: 输出,输入.
4.服务端监听到一个和客户端对应的socket对象,通过socket可以获取到2种流对象
5.服务端分析请求行部分,获取到本次请求的项目,以及项目下的资源

 http://localhost:8080/test/myFirst
 http://localhost:8080/test/demo01.html

6.如果请求的是静态文件资源 demo01.html通过输入流将静态的文件读入到内存,结合输出流和HTTP协议响应 完成本次响应
7.如果请求的是动态路径
TOMCAT在当前的项目下test下的web.xml中通过动态的路径”/myFirst”,寻找到
“/myFirst”对应的类的全路径MyFirstServlet ,tomcat可以通过反射创建MyFirstServlet对应的对象,调用对象下的构造函数,init方法,service方法
8.Tomcat结合http协议响应部分和输出流向客户端进行响应
9.浏览器通过输入流接收来自服务端的数据,进行解析和处理

六、Servlet深度分析
Servlet出现的技术背景
随着IT技术的发展,有了网络,迫切需要通过网络来传输数据,此时JDK中嵌入了Socket这类API,通过这类API就可以通过网络传输数据. 有了socket是可以在网络中传输数据了,但是数据如何传,想怎么传就怎么传?不是的,需要用协议约束一下,就有了我们的HTTP协议.
但是随着技术的发展,迫切需要我们可以访问服务端的某段程序让其执行.例如我们点击登录,希望服务端有段程序可以接受我们的数据,sun早期的设计人员并没有急于实现这种技术.而是先做一些抽象的设计.sun的设计人员认为,先应该抽取一些粗糙的接口来描述一些运行在服务端的JAVA程序应该能做些什么事情. 经过缜密分析之后,sun早期的大牛觉得运行在服务端的JAVA程序应该实现init,service,destroy这几个接口.分别代表初始化,服务和销毁三件事情.后来SUN的大牛,觉得这种方式太繁琐了,于是设计了一个抽象类就是GenericServlet,这个类实现了Servlet中的init和destroy,但是对service仅仅是提供了一个抽象方法.

什么是Servlet?
Servlet 运行在服务端的Java小程序,是sun公司提供一套规范,用来处理客户端请求,响应给浏览器的动态资源(是运行在服务端的程序,而不是以静态文件形式存在).
Servlet是JavaWeb三大组件之一(Servlet,Filter,Listener),且最重要。

Servlet的作用是什么?
用来处理从客户端发送过来的请求,并对该请求作出响应.
Servlet的任务有 :获取请求数据、处理请求、完成响应。

Servlet生命周期
1.当用户通过浏览器首次访问某个Servlet时,tomcat会调用servlet的构造函数创建 一个Servlet对象,之后调用servlet下的init方法(仅执行一次),
2.调用servlet下的service方法,在service方法中判断本次是GET/POST方法,调用servlet 下的doget/dopost方法
3.以后从客户端浏览器每次向服务端对当前servlet发起请求,仅仅只执行其下的
service__>doget/dopost
4.停止服务器(正常/中断)/重新加载项目 servlet销毁
正常停止服务器/重新加载项目会执行destory方法

Servlet相关配置
1.启动创建Servlet

<load-on-startup>2</load-on-startup>
含义:让服务器启动就创建Servlet

2.url-pattern的编写
”/”不可缺少,否则服务器启动就报错
3.ServletConfig获取配置信息
在web.xml中为当前的sevlet配置相关参数

<init-param>
		<param-name>user</param-name>
		<param-value>root</param-value>
	</init-param>
	<init-param>
		<param-name>password</param-name>
		<param-value>123456</param-value>
	</init-param> 

用到的API
通过servletConfig获取web.xml中为当前servlet配置的参数信息.

ServletContext
Tomcat启动的时候,需要识别webapps下的各个WEB应用,识别各个WEB应用的同时为每个WEB应用创建对应的对象ServletContext,一个WEB应用对应一个
ServletContext.每个ServletContext中都有一个很大的MAP,并且tomcat在启动之初就向这个MAP中放入了大量的键值对的数据.当然我们也可以通过程序向这个大的MAP中放入键值对的数据.
注意:一个web应用对应唯一的一个ServletContext对象.
ServletContext生命周期同整个web应用的生命周期一致.
在这里插入图片描述

ServletContext的作用
1.如何获取ServletContext对象?
ServletContext servletContext=getServletContext();

SevletContext中已经存放了很多键值对的数据?
全局的WEB.xml+当前WEB的web.xml
当前WEB路径
2. 多个Servlet之间共享数据
由于一个WEB应用只有一个ServletContext对象,当我们在访问服务端的Servlet时,可以利用ServletContext对象来实现共享数据.

3.获取到WEB项目下指定资源
WEB项目的运行位置和源码位置不在同一个位置,有时候我们需要获取到WEB项目在运行过程中,指定资源的真实路径或者指定资源的输入流,此时可以通过ServletContext来获取.ServletContext里存放了当前web项目的路径等信息.

  String realPath=
    ServletContext.getRealPath("/WEB-INF/conf/conf01.properties")
获取服务端指定目录下指定资源/目录的真实路径    

InputStream is=
    ServletContext.getResourceAsStream("/WEB-INF/conf/conf01.properties")
获取服务端指定目录下指定文件的输入流对象

4.获取到整个WEB全局的配置信息

5.获取到文件的mime类型
我们每次向客户端响应的内容类型可能是不一样的.发现如果本次响应的内容类型是一个HTML网页,那么在contentType消息头中对应的值是:text/html;如果本次响应的内容类型是一个css文件.有时候用户会下载我们服务端的不同资源,为了让浏览器更好的识别返回到客户端的内容类型,

String value=ServletContext.getMimeType("333.avi");
ServletContext在tomcat/conf/web.xml中,根据文件后缀来查找本次响应内容是什么.

ServletContext相当于横跨在tomcat和我们自己写的Servlet中间的一个对象. 我们可以在Servlet中通过ServletContext(Servlet上下文)获取到tomcat提供一些功能.Tomcat通过识别各个ServletContext管理各个WEB应用下的Servlet.

案例:记录用户登录成功次数
在这里插入图片描述

Java基础项目/web项目的区别:
java项目:一台机器main开始,到main结束。
Web项目:客户端浏览和服务端配合运行,基于请求响应,底层通过HTTP协议做支撑.
运行时间
java项目:大部分有开始,有结束
Web项目:开始没结束

七、Response对象
1.Request/Response生命周期
每次服务端获取到来自客户端的请求之后,解析HTTP请求部分,将HTTP请求部分封装在HttpServletRequest对象中,同时创建HttpServletResponse对象,之后在服务端完成本次响应之后,服务端就回收了刚才创建好的Request,Response对象. 下次请求到达服务端,会分配新的HttpServletRequest/HttpServletResponse对象.

总之:
HttpServletRequest对象代表的是从客户端到服务端请求这个过程。
HttpServletResponse代表从服务端到客户端响应这个过程。

HttpServletResponse代表从服务端到客户端响应这个过程,而且结合协议我们知道HTTP协议响应包含三大块内容,分别是响应行,响应头,响应体.
HttpServletResponse可以控制响应部分的三个部分。
Response控制响应行

//http/1.1  200  ok
//response.setStatus(302);
//response.sendError(404, "ni yao qiu qing de zi bu cun zai ");

Response控制响应头

*_
//测试利用response控制响应头
response.setHeader("test", "0000");
*_
1_实现重定向302+location,
2_一句话搞定 response.sendRedrect(”路径”);
3_通过控制响应头实现定时刷新
4_重定向/定时刷新

response控制响应体

PrintWriter out=response.getWriter();
out.println(“ssss”);

OutputStream os=response.getOuputStream();
os.print();

八、解决WEB的乱码问题
1.eclipse软件设置好UTF-8,Mysql安装时选择UTF8,保证页面部分采用UTF8编码。
2.表单向服务端提交数据
GET方式中文乱码问题: 手动转码
POST方式中文乱码问题: request.setCharacterEncoding(“utf-8”);
3.如果是下载文件时,另存为弹出文件有乱码,利用工具类设置
DownLoadUtils.setConentType(request, fName, response,getServletContext());
4.服务端向客户端响应中文乱码
response.setContentType(“text/html;charset=utf-8”);

九、Request
作用:
1.获取到请求部分三大块,客户端的部分信息eg:IP
2.利用request实现请求转发(重点),利用request中的MAP存储数据

十、重定向/转发区别
1.重定向2次请求响应,转发1次请求响应。
2.实现代码格式
重定向: response.sendRedirect(“/项目名称/路径”);
转发 /当前项目路径
request.getRequestDispather(“/路径”).forWard(request,reponse);

十一、Cookie
Cookie运行过程分析
当客户端和服务端的多次请求响应过程中,需要将部分数据以Cookie的形式保
存在客户端,执行过程如下

创建Cookie

Cookie  ck1=new Cookie(“k1”,”v1”);
ck1.setMaxAge(60*60*24*7);
ck1.setPath(“/day38”);

发送cookie

response.addCookie(ck1);

获取cookie

Cookie[] cks=request.getCookies();
for(Cookie ck:cks){
   ck.getName();
   ck.getValue();
}

删除cookie

获取到待删除的cookie
ck.setMaxAge(0);
   ck.setPath(“/day38”); 
   response.addCookie(ck);

案例记录用户上次访问时间
在这里插入图片描述

步骤:
第一步.获得从客户端带过来的所有的Cookie:
第二步.从所有的Cookie中查找指定名称的Cookie:
第三步.判断是否是第一次访问:
是第一次:显示欢迎
不是第一次:显示欢迎 同时显示上次访问时间.
第四步.记录当前的时间,并且利用Cookie将时间回写到浏览器端.

Cookie的分类
会话级别的Cookie:默认的.关闭了浏览器Cookie就销毁了.
持久级别的Cookie:需要设置有效时长的.关闭浏览器也不会销毁的Cookie.

setMaxAge(int expiry);  以秒为单位的时间,超过了该时间后Cookie会自动销毁.
setMaxAge(0),手动删除持久性的Cookie。(前提:path和name必须一致)
setPath(String uri);	设置Cookie的有效路径.

十二、Session
当浏览器向服务端发起的请求需要保存一些数据时,而且数据保存在服务端时,可以调用request.getSession()在服务端创建一个session对象。底层的实现过程为Tomcat在内存中生成一个叫做sessionid的随机的字符串。通过这个sessionid,在服务端为本次会话关联一个session对象。session对象中有各种属性,其中还封装了一个空map对象。

SessionAPI
创建 request.getSession();
向session放入数据

  	sess.setAttribute(name,obj)
  	sess.getAttribute(name,obj)
  	sess.getAttributeNames()
   	sess.removeAttribute(name);

销毁session sess.invalidate();

 sess.getLastAccessTime(); //获取上次访问时间
  sess.getCreateTime();//创建时间

十二、过滤器Filter
JavaWeb中的过滤器的概念:对请求和响应进行拦截或者增强的对象,就是过滤器。
在这里插入图片描述
运行图解
在这里插入图片描述
创建步骤
第一步:创建一个类,实现过滤器接口
第二步:具体需要执行的过滤任务,写在doFilter
第三步:过滤器需要在web.xml中配置

FilterChain功能介绍

在这里插入图片描述

过滤器放行执行过程
在这里插入图片描述
Filter创建时间:在服务器启动的时候 。
Filter销毁: 在服务器关闭的时候,过滤器销毁。

FilterConfig ;获取filter相关的配置信息
在这里插入图片描述

十三、javaweb监听器
JavaWEB中的监听器主要监听JavaWEB中的request、session、servletContext对象的各种变化。

主要监听的任务:
监听request、ServletContext 、session对象的创建和销毁
监听request、session、ServletContext 对象存放的数据变化情况
监听session中保存的JavaBean的状态

监听器创建步骤
1.1)创建一个类,实现监听器接口
例如:
在这里插入图片描述
2.在监听器对象的方法中,书写相关的代码
3.在web.xml中配置当前监听器。

当服务器加载项目的时候,会读取web.xml文件中listener标签,那么服务器会自动创建监听器对象,并且自动调用其方法。

ServletContext创建销毁监听
在这里插入图片描述

案例:定时任务
需求:项目启动时,获取服务器时间(new Date()),每一秒钟更新一次,打印在控制台。
思路
1.监控项目的启动(使用ServletContextListener来监听ServletContext对象的初始化)
2.获取服务器时间:new Date();
3.每一秒更新一次:定时器Timer
4.给定时器设置定时任务

HttpSessionListener对象监听session的创建与销毁监听
案例:统计在线人数
问题:什么时候我们可以知道用户访问了网站?
只要用户访问了我们的网站,session一定会创建。只要用户离开,点退出,session就销毁。

属性监听器
主要是监听使用setAttribute、removeAttribute方法。

Session中的bean(JavaBean)监听
Session中保存一个Java对象的时候,或者把Java对象从Session中移除的时候,会触发专门用来监听Session中对象变化的监听器中的方法。

猜你喜欢

转载自blog.csdn.net/tangiwang/article/details/89491373
今日推荐