javaweb_(杨)
javaweb_(杨)
抽象类的作用:
- 降低接口实现类对接口实现过程的难度
- 将接口中不需要使用的抽象方法交给抽象类进行完成,这样接口实现类只需要对接口需要方法进行重写
通过地址栏访问一定是get方式
互联网通信流程介绍
本阶段使用命令都是老旧命令,不需要记忆
一定要记住互联网通信流程细节
涉及技术(老旧):
- 控制浏览器行为技术:HTML,CSS,JAVASCRIPT
- 控制硬盘上数据库行为技术:MySql数据库管理使用(SQL重点),JDBC规范
- 控制服务端Java行为技术:Http服务器,Servlet接口,JSP技术
- 互联网通信流程开发规则:MVC
- 贯穿项目------在线考试管理系统
什么是互联网通信
两台计算机通过网络实现文件共享行为,就是(互联网通信)
互联网通信过程中角色的划分
客户端计算机:用于发送请求,来索要资源文件的计算机
服务端计算机:用于接收请求,发送资源文件的计算机
互联网通信模型
- C/S通信模型
- C,client software:客户端软件
- 客户端软件专门安装在客户端计算机上
- 帮助客户端计算机向指定服务端计算机发送请求,索要资源
- 帮助客户端计算机将服务端计算机发送回来的(二进制数据)解析为(文字,数字,图片,视频,命令)
- S,server software:服务器软件
- 服务器软件专门安装再服务端计算机上
- 服务器软件用于接收来自于特定的客户端软件发送请求
- 服务器软件再接受到请求之后自动的在服务端计算机上定位被访问的资源文件
- 服务器软件自动的将定位的文件内容解析为(二进制数据)通过网络发送回发起请求的客户端软件上
- 使用场景:个人娱乐市场,企业办公领域相对应用较少
- 优缺点:
- 优点:
- 安全性较高
- 有效减低服务端计算机工作压力
- 缺点:
- 增加客户获得服务的成本
- 更新较为繁琐
- 优点:
- C,client software:客户端软件
- B/S通信模型
- B:browser,浏览器
- 浏览器安装在客户端计算机软件
- 可以向任意服务器发送请求,索要资源文件
- 可以将服务器返回的(二进制数据)解析为(文字,数字,图片,视频,命令)
- S,server software:服务器软件
- 服务器软件专门安装再服务端计算机上
- 服务器软件用于接收任意浏览器发送请求
- 服务器软件再接受到请求之后自动的在服务端计算机上定位被访问的资源文件
- 服务器软件自动的将定位的文件内容解析为(二进制数据)通过网络发送回发起请求的浏览器上
- 适用场景:既适用于个人娱乐市场,又广泛适用于企业日常活动
- 优缺点:
- 优点:
- 不会增加用户获得服务的成本
- 几乎不需要更新浏览器
- 缺点
- 几乎无法有效对服务端计算机资源文件进行保护
- 服务端计算机工作压力异常巨大---->(B/S通信下高并发解决方案)
- 优点:
- B:browser,浏览器
共享资源文件
共享资源文件:可以通过网络进行传输的文件,都被称为共享资源文件,所有的文件内容都可以通过网络传输,所有文件都是共享资源文件
Http服务器下对于共享资源文件分类
- 静态资源文件:
- 如果文件内容是固定的,这种文件可以被称为静态资源文件(文档,图片,视频)
- 如果文件存放不是内容而是命令,这个命令只能在浏览器编译与执行,这种文件可以被称为静态资源文件(.html,.css,.js)
- 动态资源文件:
- 如果文件存放命令,并且命令不能在浏览器编译与执行:只能在服务端计算机编译执行,这样的文件可以被称为(动态资源文件)(.class)
静态资源文件与动态资源文件调用区别
静态资源文件被索要使,Http服务器直接通过(输出流)将静态文案金中内容或者命令以(二进制形式)推送给发起请求浏览器
动态文件被索要时,Http服务器需要创建当前class文件的实例对象,通过实例对象调用对应的方法处理用户的请求,通过(输出流)将运行结果以(二进制形式)推送给发起请求浏览器
class Student{public int add(int num1,int num2){int sum = num1 + num2;return sum;} } //Http服务器(自动)创建实例对象 Student stu = new Student(); int result = stu.add(10,20);
开发人员在互联网通信流程担负职责:
- 控制浏览器行为
- 开发动态资源文件来解决用户请求
Http网络协议包
网络协议包:
- 在网络中传递信息都是以(二进制)形式存在的
- 接收方(浏览器/服务器)在接收信息后,要做第一件事,就是将(二进制数据)进行解析(文字,图片,视频,命令)
- 传递信息数据量往往是比较巨大,导致接收方很难在一组连续二进制得到对应数据,比如说:浏览器发送一个请求:http://192.168.100.2:8080/index.html,这个请求信息以二进制形式发送010110111001111,Http服务器很难从二进制数据得到相关信息
- 网络协议包,一组有规律的二进制数据,在这个数据存在了固定空间,每一个空暗金专门存放特定信息,这样接收方在接收网络协议包之后,就可以到固定空间得到对应信息,网络协议包出现极大降低了接收方对接收二进制数据编译难度
常见的网络协议:
- FTP网络协议包
- Http网络协议包
Http网络协议包:
在基于B/S结构下互联网通信过程中,所有在网络中传递信息都是保存在Http网络协议包
Http请求协议包和Http响应协议包
- Http请求协议包:在浏览器准备发送请求时,负责创建一个Http请求协议包,浏览器将请求信息以二进制形式保存在Http请求协议包中的各个固定空间中,由浏览器负责将Http请求协议包推送到指定服务端计算机
- Http响应协议包:Http服务器在定位到访问的资源文件之后,负责创建一个Http响应协议包,Http服务器将定位文件内容或者文件命令以二进制形式写入到Http响应协议包各个固定空间,由Http服务器负责将Http响应协议包推送回发起请求的浏览器上
Http请求协议包内部空间(背)
按照自上而下划分,分为四个空间
空间划分:
请求行:[url:请求地址(http://www.baidu.com)method:请求方式(Post/Get) ] 请求头[请求参数信息(get方式) ] 空白行[没有任何内容,起到隔离作用 ] 请求体[请求参数信息(post方式) ]
在浏览器中是看不到空白行和请求体的,只能看到请求行和请求头
Http响应协议包内部结构
按照自上而下划分,分为四个空间
空间划分
状态行:[Http状态码 ] 响应头:[content-type:执行浏览器采用对应编译器,对响应体二进制数据进行解析cookielocation ] 空白行:[没有任何内容,起到隔离作用 ] 响应体:[可能被访问静态资源文件内容可能被访问的静态资源文件命令可能被访问的动态资源文件运行结果---都是以二进制形式--- ]
Tomcat的下载和安装,环境配置
Tomcat的文件结构
IDEA管理Tomcat
file–>setting–>build,execution,deployment–>application servers–>+号填加tomcat。
给Tomcat创建一个开关
run–>edit configurations–>+号选择tomcat server–>修改Name,jre ,(on update action,on frame deactivation)这两个修改为(update classes and resource:自动更新资源)等信息–>apply,ok
IDEA创建网站
new moudle,模块名就是网站名,这里可以是中文,因为后面会给网站起别名,创建java模块,右键,点击add frameWork support --> web application
网站内部结构
src文件夹:存放作为动态资源文件的java文件
web文件夹:
- 存放作为静态资源文件(图片,html,css,js)
- 存放网站运行时依赖的jar(mysql)驱动
- 存放网站的核心配置文件(web.xml)
web文件夹下的WEB-INF文件夹:存放依赖的jar(mysql)/核心配置文件web.xml
- lib文件夹:依赖的jar(mysql)驱动
- web.xml:通知Tomcat当前网站那些java类是动态资源文件
特别提醒:静态资源文件,是直接放在web文件下的,和WEB-INF是平级的
网站的发布:
run–>edit configurations,找到创建的开关–>deployment–>+号–>artifact–>选择相应的网站,注意修改下面的Application context:真正的网站名,以“/”开头
Servlet规范
介绍:
- servlet规范来自于JAVAEE规范中的一种
- 作用
- 在servlet规范中,指定(动态资源文件)开发步骤
- 在servlet规范中,指定Http服务器调用动态资源文件规则
- 在servlet规范中,指定Http服务器管理动态资源文件实例对象规则
Servlet接口实现类
Servlet接口来自于servlet规范下一个接口,这个接口存在http服务器提供jar包
tomcat服务器下lib文件由一个servlet-api.jar存放servlet接口(javax.servelt.Servlet接口)
Servelt规范中规定,Http服务器能调用的(动态资源文件)必须是一个Servlet实现类
class Student{//不是动态资源文件,Tomcat无法调用 } class Teacher implements Servlet{//合法动态资源文件,Tomcat有权利调用Servelt obj = new Teacher();obj.doGet(); }
Servlet接口实现类开发步骤
第一步:创建一个Java类继承于HttpServelt父类,使之成为一个Servlet接口实现类
第二步:重写HttpServlet父类两个方法,doGet()或者doPost()
浏览器以 get 方式访问 ---》oneServlet.doGet()
浏览器以 post 方式访问 ---》oneServlet.doPost()
Tomcat根据Servlet规范调用Servlet接口实现类规则
tomcat有权创建servlet接口实现类实例对象
Servlet oneServlet = new OneServlet();
Tomcat根据实例对象调用service方法处理当前请求
oneServlet.service()
HttpServlet父类中重写了service(),所以子类中可以直接使用
第三步:将Servlet接口实现类信息(注册)到Tomcat服务器中
(网站)—》(web)—>(WEB-INF)—》web.xml
<!--将Servlet接口实现类类路径地址交给Tomcat-->
<servlet><!--声明一个变量存储servlet接口实现类类路径--><servlet-name>mm</servlet-name><!--声明Servlet接口实现类类路径--><servlet-class>com.cyg.controller.OneServlet</servlet-class>
</servlet>
<!--为了降低用户访问servlet接口实现类难度,需要设置建端请求别名-->
<servlet-mapping><servlet-name>mm</servlet-name><!--设置建端请求别名,别名需要以“/”开头--><url-pattern>/one</url-pattern>
</servlet-mapping>
String mm = "com.cyg.controller.OneServlet"//Tomcat
Servlet对象生命周期
网站中所有的Servlet接口实现类的实例对象,只能由Http服务器负责创建,开发人员不能手动创建servlet接口实现类的实例对象
在默认的情况下,Http服务器接受到对于当前Servlet接口实现类第一次请求时,自动创建这个Servlet接口实现类的实例对象。
在手动配置情况下,要求Http服务器在启动时自动创建某个Servlet接口实现类的实例对象
<servlet><servlet-name>mm</servlet-name><servlet-class>com.cyg.controller.OneServlet</servlet-class><!--填写一个大于0的整数--><load-on-startup>30</load-on-startup> </servlet>
在Http服务器运行期间,一个Servlet接口实现类只能创建出一个实例对象
在Http服务器关闭时刻,自动将网站中所有的Servlet对象进行销毁
HttpServletRequest接口
介绍
- HttpServletRequest接口来自于Servlet规范中,在Tomcat中存在servlet-api.jar
- HttpServletRequest接口实现类由Http服务器负责提供
- HttpServletRequest接口负责在doGet/doPost方法运行时读取Http请求协议包中信息
- 开发人员习惯于将HttpServletRequest接口修饰的对象成为(请求对象)
作用
- 可以读取Http请求协议包中(请求行)信息
- 可以读取保存在Http请求协议包中(请求头)或者(请求体)中请求参数信息
- 可以代替浏览器向Http服务器申请资源文案金调用
public void goGet(HttpServletRequest req,HttpServletResponse res){//1.通过请求对象,读取(请求行)中(url)信息String url = req.getRequestURL().toString();//2.通过请求对象,读取(请求行)中(method)信息String method = req.getMethod();//3.通过请求对象,拂去(请求行)中uri信息//URI:资源文件精确定位地址,在请求行中并没有这个属性,实际上时URL中截取的一个字符串,这个字符串格式“/网站名/资源文件名”,就相当于端口号后面的信息,URI用于让HTTP服务器对被访问的资源文件进行定位String urio = req.getRequestURI();System.out.println(url+","+method)
}
获取(请求头)中请求参数(GET方式)
<a href="/web/one?userName=mike&password=123">通过超链接访问TwoServlet,携带请求参数</a>
TwoServlet{public void doGet(HttpServletRequest req,HttpServletResponse res){//1.通过请求对象获得(请求头)中(所有请求参数名)Enumeration paramNames = req.getParamenterNames();//将所有请求参数名称保存到一个枚举对象进行返回while(paramNames.hasMoreElements()){String paramName = (String)paramNames.nextElement();//通过请求兑现昂给读取指定的请求参数的值String value = req.getparameter(paramName);sout("请求参数名:" + paramName+ "请求参数"+value)}}
}
获取(请求体)中请求参数(POST方式)
<form action="/wyweb/two" method="post">请求参数:<input type="text" name="userName"><br><input type="submit" value="post">
</form>
TwoServlet{public void doPost(HttpServletRequest req,HttpServletResponse res){//通知请求对象,使用utf8字符集对请求体二进制内容进行一次重新解码//通过请求对象,读取(请求体)参数信息String userName = req.getParameter("userName");sout("userName:"+userName);}
}
问题:
以GET方式发送中文参数内容,得到正常结果,以POST方式发送中文参数内容,得到乱码
原因:
浏览器以GET方式发送请求,请求参数保存在(请求头),在Http请求协议包到达Http服务器之后,第一件事就是进行解码,请求头二进制内容由Tomcat负责解码,tomcat9.0默认采用 utf8
浏览器以POST方式发送请求,请求参数保存在(请求体),在Http请求协议包到达Http服务器之后,第一件事就是进行解码,请求体二进制内容由当前请求对象(request)负责解码,request默认使用(ISO8859-1)字符集,无法识别中文
解决方案
在post请求方式下,在读取请求体内容之前,应该通知请求对象使用utf8字符集对请求体内容进行一次重新解码
HttpServletResponse接口
介绍
- HttpServletResponse接口来自于Servlet规范中,在Tomcat中存在servlet-api.jar
- HttpServletResponse接口实现类由Http服务器负责提供
- HttpServletResponse接口负责将doGet/doPost方法执行结果写入到(响应体)交给浏览器
- 开发人员习惯于将HttpServletResponse接口修饰的对象成为(响应对象)
主要功能:
将执行结果以二进制形式写入到(响应体)
public void doGet(HttpServletRequest req,HttpServletResponse res){String result = "hello";//执行结果String result = "java<br>mysql<br>";//既有文字信息又有HTML标签命令String result = "红烧排骨<br>鸡蛋<br>";//既有文字信息又有HTML标签命令//没有将<br>当作html标签使用,而是当作字符串//问题原因:浏览器在接受到响应包之后,根据(响应头中content-type)属性的值,来采用对应(编译器)对(响应体中二进制内容)进行编译处理,在默认情况下 content-type="text",此时浏览器将会采用(文本编译器)对响应体二进制数据进行解析(字母,中文)//解决方案:一定要在得到输出流之前,通过响应对象对响应头中content-type属性进行一次重新赋值用于指定浏览器采用正确编译器//响应对象将结果写入到响应体//设置编译类型,字符集res.setContentType("text/html;charset=utf8");//1.通过响应对象,向Tomcat索要输出流PrintWriter out = res.getWriter();//2.通过输出流,将执行结果以二进制形式写入到响应体中//需要注意,这个输出流不用关闭,因为不是自己创建的流,而是向Tomcat借的流//out.write方法可以将(字符,字符串)以ASCII码写入到响应体中,所以被弃用out.write(result);//在实际的开发过程中都是以out.print()将真实数据写入到响应体中out.print(result)} //doGet执行完毕 //Tomcat将响应包推送给浏览器
String result = "http://www.baidu.com"; //通过响应对象,将地主之赋值给响应头中location属性 res.sendRedirect(result);//响应头 location="http://www.baidu.com" //浏览器在接受到响应包之后,如果发现响应头中存在lOcation属性,自动通过地址栏向location指定网站发送请求 //sendRedirect方法远程控制浏览器请求行为
设置响应头中(content-type)属性值,从而控制浏览器使用对应编译器将响应体二进制数据编译为(文字,图片,视频,命令)
设置响应头的中(location)属性,将一个请求地址赋值给location。从而控制浏览器向指定服务器发送请求
请求对象和响应对象的生命周期
- 在HTTP服务器接受到浏览器发送的(HTTP请求协议包)之后,自动为当前的(HTTP请求协议包)生成一个(请求对象)和一个(响应对象)
- doGet/doPost方法中的 request 对象和 response 对象 来自于 HttpServlet 中的 service()方法
- 在HTTP服务器准备推送HTTP响应协议包之前,负责将本次请求关联的(请求对象和响应对象)进行销毁
欢迎资源文件
前提:用户可以记住网站名,但是不会记住王章资源文件名
默认欢迎资源文件:用户发送了一个针对某个网站的(默认请求)时,此时由Http服务器自动从当前网站返回的资源文件
正常请求:http://localhost:8080/myweb/index.html,某个网站下的某个文件
默认请求:http://localhost:8080/myweb/
tomcat对于默认欢迎资源文件定位规则
规则位置:tomcat安装位置/conf/web.xml
<welcome-file-list><welcome-file>index.html</welcome-file><welcome-file>index.htm</welcome-file><welcome-file>index.jsp</welcome-file></welcome-file-list>
设置当前网站的默认欢迎资源文件规则
规则位置:网站/web/WEB-INF/web.xml
规则命令:
<welcome-file-list><welcome-file>login.html</welcome-file><!--servlet作为默认欢迎资源文件时,开头斜线必须删除--><welcome-file>user/find</welcome-file></welcome-file-list>
需要注意的是:当设置了当前网站的默认欢迎资源文件规则之后,原本的规则就会失效
Http状态码
介绍
- 由三位数字组成的一个符号
- Http服务器在推送响应包之前,根据本次请求处理情况将Http状态码写入到响应包中(状态行)上
- 如果Http服务器针对本次请求,返回了对应的资源文件,通过Http状态码通知浏览器应该如何处理这个结果
- 如果Http服务器针对本次请求,无法返回对应的资源文件,通过Http状态码向浏览器解释不能提供服务的原因
分类
组成:100—599,分为5个大类
1XX:最有特征(100):通知浏览器本次返回的资源文件并不是一个独立的资源文件,需要浏览器在接收响应包之后,继续向Http服务器所要依赖的其他资源文件
比如:一个页面当中,含有图片的地址,浏览器要接着取访问这个图片
2XX:最有特征(200):通知浏览器本次返回的资源文案金是要给完整独立资源文件,浏览器在接收到之后不需要索要其他关联文件
3XX:最有特征(302):通知浏览器本次返回的不是一个资源文件内容而是一个资源文件地址,需要这个浏览器根据这个地址自动发起请求来索要这个资源文件
比如:response.sendRedirect(“资源文件地址”)写入到响应头中的location中,而这个行为导致Tomcat将302状态码写入到状态行中
4XX:
- 404:通知浏览器,由于在服务端没有定位到被访问的资源文件,因此无法提供帮助
- 405:通知浏览器,在服务端已经定位到被访问的资源按文件(Servlet),但是这个Servlet对于浏览器采用的请求方式不能处理
5XX:
- 500:通知浏览器,在服务端已经定位到被访问的资源文件(Servlet),这个Servlet可以接收浏览器采用的请求方式,但是Servlet在处理请求期间,由于java异常导致处理失败
多个servlet之间调用规则
前提条件:
某些来自于浏览器发送请求,往往需要服务端中多个servlet协同处理,但是浏览器一次只能访问一个servlet,导致用户需要手动通过浏览器发起多次请求才能得到服务。这样增加洪湖获取服务难度,导致用户放弃访问当前网站
提高用户使用感受规则:
无论本次请求设计到多少个servlet,用户只需要(手动)通知浏览器发起一次请求即可
多个servlet之间调用规则:
- 重定向就觉方案
- 请求转发解决方案
重定向解决方案
工作原理:
用户第一次通过(手动方式)通知浏览器访问OneServlet。OneServlet工作完毕后,将TwoServlet地址写入到响应头location属性中,导致Tomcat将302状态码写入到状态行。在浏览器接受到响应头中location属性地址发起的第二次请求,访问TwoServlet去完成请求中剩余任务
实现命令:
response.sendRedirect(“请求地址”);,将地址写入到相应包中响应头中location属性
特征:
- 请求地址:既可以把当前网站内部的资源文件地址发送给浏览器(/网站名/资源文件名)也可以把其它网站资源按文件地址发送给浏览器(http://ip地址:端口号/网站名/资源文件名)
- 请求次数:浏览器至少发送两次请求,但是只有第一次请求是用户手动发送,后续请求都是浏览器自动发送的
- 请求方式:在重定向解决方案中,通过地址栏通知浏览器发起下一次请求,因此通过重定向解决方法调用的资源文件接收的请求方式一定是(get)
- 缺点:重定向解决方案需要在浏览器与服务器之间进行多次往返,大量时间消耗在往返次数上,增加用户等待服务时间
请求转发解决方案
工作原理:
用户第一次通过手动方式要求浏览器访问OneServlet,OneServlet工作完毕后,通过当前的请求对象代替浏览器向Tomcat发送请求,申请调用TwoServlet。Tomcat在接收到这个请求之后,自动调用TwoServlet来完成剩余任务
实现命令:
通过当前请求对象生成资源文件申请报告对象
RequestDispatcher report = request.getRequestDispatcher("/资源文件名");//一定要以“/”开头
将报告对象发送给Tomcat
report.forward(当前请求对象,当前响应对象)
优点:
- 无论本次请求涉及到多少个servlet,用户只需要手动通过浏览器发起一次请求
- servlet之间调用发生在服务端计算机上,节省服务端与浏览器之间往返次数,增加处理服务速度
特征:
- 请求次数:只需要一次
- 请求地址:只能向Tomcat服务器申请调用当前网站下资源文件地址 request.getRequestDispathcer("/资源文件名"),不要写网站名
- 请求方式:在请求转发过程中,浏览器只发送了一个Http请求协议包。参与本次请求的所有的servlet共享同一个请求协议包,因此,这些servlet接收的请求方式与浏览对其发送的请求方式保持一致
重定向是让浏览器去工作,而请求转发是让Http服务器去工作
多个servlet之间数据共享实现方案
数据共享:OneServlet工作完毕后,将产生的数据交给TwoServlet来使用
servlet规范中提供了四种数据共享方案
- ServletContext接口
- Cookie类
- HttpSession接口
- HttpServletRequest接口
ServletContext接口
介绍:
- 来自于Servlet规范中一个接口,在Tomcat中存在于servlet-api.jar,在Tomcat中负责提供这个接口实现类
- 如果两个servlet来自于同一个网站,彼此之间通过网站的ServletContext实例对象实现数据共享
- 开发人员习惯于将ServletContext对象称为(全局作用域对象)
工作原理:
每一个网站都存在一个全局作用域对象,这个全局作用对象(相当于)一个Map。在这个网站中OneServlet可以将一个数据存入到全局作用域对象,当前网站中其它Servlet此时都可以从去全局作用域对象得到这个数据进行使用
全局作用域对象生命周期:
- 在Http服务器启动过程中,自动为当前网站在内存中创建一个全局作用域对象
- 在Http服务器运行期间,一个网站只有一个全局作用域对象
- 在Http服务器运行期间,全局作用对象一直处于存活状态
- 在Http服务器准备关闭时,负责将当前网站中全局作用域对象进行销毁处理-----全局作用域对象生命周期贯穿网站整个运行期间-------
命令实现:
OneServlet{public void doGet(HttpServletRequest request,HttpServletResponse response){//1.通过(请求对象)向Tomcat索要当前网站中(全局作用域对象)ServletContext application = request.getServletContext();//2.将数据添加到全局作用域对象作为(共享数据)//Attribute是一个map类型的属性application.setAttribute("key1",数据);}
}TwoServlet{public void doGet(HttpServletRequest request,HttpServletResponse response){//1.通过(请求对象)向Tomcat素偶要当前网站中(全局作用域对象)ServletContext application = request.getServletContext();//2.从全局作用域对象得到指定关键字对应数据Object 数据 = application.getAttribute("key1");}
}
Cookie
介绍
- Cookie来自于Servlet规范中一个工具类,存在于Tomcat提供servlet-api.jar中
- 如果两个Servlet来自于同一个网站,并且为同一个浏览器/用户提供服务,此时借助于Cookie对象进行数据共享
- Cookie存放当前用户的私人数据,在共享数据过程中提高服务质量
- 在显示生活场景中,Cookie相当于用户在服务端得到的(会员卡)
原理:
用户通过浏览器第一次向myweb网站发送请求申请oneServlet。OneServlet在运行期间创建一个Cookie存储与当前用户相关的数据,OneServlet工作完毕后,(将Cookie写入到响应头)交换给当前浏览器。
浏览器收到响应包之后,将cookie存储在浏览器的缓存中,一段时间之后,用户通过(同一个浏览器)再次向(myweb网站)发送请求申请TwoServlet时。(浏览器需要无条件的将myweb网站之前推送过来的Cookie,写入到请求头)发送过去,此时TwoServlet在运行时,就可以通过读取请求头中cookie中信息,得到OnServlet提供的共享数据
实现命令
OneServlet{public void doGet(HttpServletRequest request,HttpServletResponse response){//1.创建一个Cookie对象,保存共享数据(当前用户数据)Cookie card1 = new Cookie("key1","abc");Cookie card2 = new Cookie("key2","efg");//需要注意//cookie相当于一个map//一个cookie中只能存放一个键值对//这个键值对的key与value只能是String//键值对中key不能是中文//2.(发卡)将cookie写入到响应头,交给浏览器response.addCookie(card1);response.addCookie(card2);}
}
浏览器/用户 <------响应包 (200)(cookie:key1=abc;key2=efg)(空白行)(处理结果)
浏览器向myweb网站发送请求访问TwoServlet -----> 请求包 (url , method )(请求参数:xxxcookie:key1=abc;key2=efg) (空白行)(请求体)
TwoServlet{public void doGet(HttpServletRequest request,HttpServletResponse response){//调用请求对象从请求头得到浏览器返回的CookieCookie[] cookieArray = request.getCookies();//循环遍历数据得到每一个Cookie的key于valuefor(Cookie card:cookieArray){String key = card.getName();//读取key "key1"String value = card.getValue();读取value "aabc"}}
}
Cookie销毁时机:
- 在默认情况下,Cookie对象存放在浏览器的缓存中,因此只要浏览器关闭,Cookie对象就被销毁掉
- 在手动设置情况下,可以要求浏览器将接收的Cookie存放在客户端计算机硬盘上,同时需要指定Cookie在硬盘上存活时间。在存活时间范围内,关闭了浏览器,关闭客户端计算机,关闭服务器,都不会导致Cookie被销毁。在存活时间到达时,Cookie自动从硬盘上被删除,Cookie.setMaxAge(60:单位秒)
HttpSession接口
介绍:
- HttpSession接口来自于Servlet规范下一个接口,存在于Tomact中servlet-api.jar,其实现类由Http服务器提供,Tomcat提供实现类存在于servlet-api.jar
- 如果两个Servlet来自于同一个网站,并且为同一个浏览器/用户提供服务,此时借助于HttpSession对象进行数据共享
- 开发人员习惯于将HttpSession接口修饰对象称为(会话作用域对象)
HttpSession与Cookie的区别:(面试题)
- 存储位置:一个在天上,一个在地上
- Cookie:存放在客户端计算机(浏览器内存/硬盘)
- HttpSession:存放在服务端计算机内存
- 数据类型:
- Cookie对象存储共享的数据类型只能是String
- HttpSession对象可以存储任意类型的共享数据Object
- 数据数量:
- 一个Cookie对象只能存储一个共享数据,HttpSession使用map集合存储共享数据,所以可以存储任意数量共享数据
- 参照物:
- Cookie相当于客户在服务端(会员卡)
- HttpSession相当于客户在服务端(私人保险柜)
命令实现:同一个网站下OneServlet将数据传递给TwoServlet
OneServlet{public void doGet(HttpServletRequest request,HttpServletResponse response){//1.调用请求对象向Tomcat索要当前用户在服务端的私人储物柜HttpSession session = request.getSession();//2.将数据添加到用户私人储物柜session.setAttribute("key1",共享数据);}
}
浏览器访问/myweb中的TwoServlet
TwoServlet{public void doGet(HtppServletRequest request,HttpServletResponse response){//1.调用请求对象向Tomcat索要当前用户在服务端的私人储物柜HttpSession session = request.getSession();//2.从会话作用域对象得到OneServlet提供的共享数据Object 共享数据 = session.getAttribute("key1");}
}
Http服务器如何将用户与HttpSession关联起来
cookie
getSession()与getSession(false)
- getSession():如果当前用户在服务端已经拥有了自己的私人储物柜,要求tomcat将这个私人储物柜进行返回,如果当前用户在服务端尚未拥有自己的私人储物柜,要求tomcat为当前用户创建要给全新的私人储物柜
- getSession(false):如果当前用户在服务端已经拥有了自己的私人储物柜,要求tomcat将这个私人储物柜进行返回,如果当前用户在服务端尚未拥有自己的私人储物柜,此时tomcat将返回null
HttpSession销毁时机
- 用户与HttpSession关联时使用的Cookie只能存放在浏览器缓存中
- 在浏览器关闭时,意味着用户与他的HttpSession关系被切断了
- 由于tomcat无法检测浏览器何时关闭,因此在浏览器关闭时并不会导致tomcat将浏览器关联的HttpSession进行销毁
- 为了解决这个问题,tomcat为每一个HttpSession对象设置(空闲时间),这个空闲时间默认30分钟,如果当前HttpSession对象空闲时间达到30分钟,此时Tomcat认为用户已经放弃了自己的HttpSession,此时tomcat就会销毁这个HttpSession
HttpSession空闲时间手动设置
在当前网站/web/web-inf/web.xml中
<session-config><!--当前网站中每一个session最大空闲时间5分钟--><session-timeout>5</session-timeout>
</session-config>
HttpServletRequest接口实现数据共享
介绍:
- 如果在同一个网站中,如果两个Servlet之间通过(请求转发)方式进行调用,彼此之间共享同一个请求协议包,而一个请求协议包只对应一个请求对象,因此servlet之间共享同一个请求对下给你,此时可以利用这个请求对象在两个servlet之间实现数据共享
- 在请求对象实现Servlet之间数据共享功能时,开发人员将请求对象称为(请求作用域对象)
实现命令:OneServlet通过请求转发申请调用TwoServlet时,需要给TwoServlet提供共享数据对象
OneServlet{public void goGet(HttpServletRequest request,HttpServletResponse response){//1.将数据添加到(请求作用域对象)中attribute属性request.setAttribute("key1",数据);//数据类型可以是Object//2.向Tomcat申请调用TwoServletreq.getRequestDispatcher("/two").forward(request,response);}
}TwoServlet{public void goGet(HttpServletRequest request,HttpServletResponse response){//从当前请求对象得到OneServlet写入到的共享数据Object 数据 = request.getAttribute("key1");}
}
监听器接口
介绍
- 监听器接口来自于Servlet规范下接口,共有8个接口,在tomcat存在于servlet-api.jar包
- 监听器接口需要由开发人员亲自实现,Http服务器提供jar包并没有对应的实现类
- 监听器接口用于监控(作用域对象生命周期变化时刻)以及(作用域对象共享数据变化时刻)
作用域对象:
- 在servlet规范中,认为在服务端内存中可以在某些条件下为两个servlet之间提供数据共享方案的对象,被称为作用域对象
- Servlet规范下作用域对象;
- ServletContext:全局作用域对象
- HttpSession:会话作用域对象
- HttpServletRequest:请求作用域对象
监听器接口实现类开发规范:三步
根据监听的实际情况,选择对应监听器接口进行实现
重写监听器接口声明(监听事件处理方法)
在web.xml文件将监听器接口实现类注册到Http服务器
<listener><listener-class>包名+类名</listener-class> </listener>
ServletContextListener接口
- 作用:通过这个接口合法的检测全局作用域对象被初始化时刻以及被销毁时刻
- 监听事件处理方法:
- public void contextInitialized():在全局作用域对象被Http服务器初始化时调用
- public void contextDestroyed():在全局作用域对象被Http服务器销毁时调用
ServletContextAttributeListener接口
- 作用:通过这个接口合法的检测全局作用域对象共享数据变化时刻
- 监听事件处理方法:
- public void contextAdd():在全局作用域对象添加共享数据时
- public void contextReplaced():在全局作用域对象更新共享数据时
- public void contextRemove():在全局作用域对象删除共享数据时
- 全局作用域对象共享数据变化时刻
- ServletContext application = request.getServletContext();
- application.setAttribute(“key1”,100);//新增
- application.setAttribute(“key1”,200);//更新
- application.removeAttribute(“key1”);//删除
监听器接口可以提高程序的运行时间:比如:在网站被访问时创建多个数据库连接,使用时,直接使用即可,不用再创建,并且不用关闭,再退出浏览器时,关闭连接,可节省时间
Filter接口(过滤器接口)
介绍
- 来自于Servlet规范下接口,在Tomcat中存在于servlet-api.jar包
- Filter接口实现类由开发人员负责提供,Http服务器不负责提供
- Filter接口在Http服务器调用资源文件之前,对Http服务器进行拦截
作用:
- 拦截Http服务器,帮助Http服务器检测当前请求合法性
- 拦截Http服务器,对当前请求进行增强操作
Fileter接口实现类开发步骤:三步
- 创建一个Java类实现Filter接口
- 重写Filter接口中doFilter方法
- web.xml将过滤器接口实现类注册到Http服务器
Filter拦截地址格式
命令格式:
<filter-mapping><filter-name>oneFilter</filter-name><url-pattern>拦截地址</url-pattern> </filter-mapping>
命令作用:拦截地址通知Tomcat在调用何种资源文件之前需要调用OneFilter过滤进行拦截
要求Tomcat在调用某一个具体文件之前,来调用OneFilter拦截
<url-pattern>/img/mm.jpg</url-pattern>
要求Tomcat在调用某一个文件夹下所有的资源文件之前,来调用OneFilter拦截
<url-pattern>/img/*</url-pattern>
要求Tomcat在调用任意文件夹下某种类型文件之前,来调用OneFilter拦截
<url-pattern>*.jpg</url-pattern>
要求Tomcat在调用网站中任意文件时,来调用OneFilter拦截
<url-pattern>/*</url-pattern>
可以使用过滤器拦截用户恶意登录行为
责提供
3. Filter接口在Http服务器调用资源文件之前,对Http服务器进行拦截
作用:
- 拦截Http服务器,帮助Http服务器检测当前请求合法性
- 拦截Http服务器,对当前请求进行增强操作
Fileter接口实现类开发步骤:三步
- 创建一个Java类实现Filter接口
- 重写Filter接口中doFilter方法
- web.xml将过滤器接口实现类注册到Http服务器
Filter拦截地址格式
命令格式:
<filter-mapping><filter-name>oneFilter</filter-name><url-pattern>拦截地址</url-pattern> </filter-mapping>
命令作用:拦截地址通知Tomcat在调用何种资源文件之前需要调用OneFilter过滤进行拦截
要求Tomcat在调用某一个具体文件之前,来调用OneFilter拦截
<url-pattern>/img/mm.jpg</url-pattern>
要求Tomcat在调用某一个文件夹下所有的资源文件之前,来调用OneFilter拦截
<url-pattern>/img/*</url-pattern>
要求Tomcat在调用任意文件夹下某种类型文件之前,来调用OneFilter拦截
<url-pattern>*.jpg</url-pattern>
要求Tomcat在调用网站中任意文件时,来调用OneFilter拦截
<url-pattern>/*</url-pattern>
可以使用过滤器拦截用户恶意登录行为
javaweb_(杨)相关推荐
- 用python实现杨辉三角的几种不同方式
杨辉三角的概念 比较详细的知识可以看这里,在杨辉三角中,每个数是它左上方和右上方的数的和. 1/ \1 1/ \ / \1 2 1/ \ / \ / \1 3 3 1/ \ / \ / \ / \1 ...
- LeetCode简单题之杨辉三角 II
题目 给定一个非负索引 rowIndex,返回「杨辉三角」的第 rowIndex 行. 在「杨辉三角」中,每个数是它左上方和右上方的数的和. 示例 1: 输入: rowIndex = 3 输出: [1 ...
- LeetCode简单题之杨辉三角
题目 给定一个非负整数 numRows,生成「杨辉三角」的前 numRows 行. 在「杨辉三角」中,每个数是它左上方和右上方的数的和. 示例 1: 输入: numRows = 5 输出: [[1], ...
- 杨老师课堂_Java核心技术下之控制台模拟文件管理器案例
背景需求介绍: 编写一个模拟文件管理器的程序,实现控制台对文件和文件夹的管理操作. 要求在此程序中: 当用户输入指令 1 时,代表"指定关键字检索文件",此时需要用户输入检索的目录 ...
- 最详细的----->一维数组实现杨辉三角
代码循环部分的解析在代码之后 先来看代码 #include<stdio.h> int arr[20]; int main() {arr[0] = 1;int n;scanf_s(" ...
- java利用递归画杨辉三角_用java程序编写杨辉三角形,初学者适用
原创代码(非网上照搬复制,个人原创,真实有效): import java.util.Scanner; class demo1 { public static void main(String[] ar ...
- 杨老师课堂_Java核心技术下之控制台模拟记事本案例...
预览效果图: 背景介绍: 编写一个模拟记事本的程序通过在控制台输入指令,实现在本地新建文件打开文件和修改文件等功能. 要求在程序中: 用户输入指令1代表"新建文件",此时可以从控制 ...
- 杨学海:跨境电商新通道-进口保税直邮模式解析
为什么80%的码农都做不了架构师?>>> 杨学海:跨境电商新通道-进口保税直邮模式解析 广州威云供应链管理公司总经理杨学海在第九届中国中小企业电子商务大会上表示,其品牌海外通要 ...
- 【直播】杨剑砺:数据可视化漫谈
数据可视化漫谈 目前 安泰第四届数据科学训练营 正在如火如荼的进行中.为了大家更好的学习,杨剑砺将为大家带来一场直播分享 -- 数据可视化漫谈. 直播信息 主讲人:杨剑砺,Datawhale成员,外企 ...
最新文章
- weblogic集群安装心得-程序包发布
- GPUImage 简介
- Geospark-SQL加载SHP数据
- signature=35e01da53254eb12b5fc3c020f572e6a,Signature Analyzer Use NXP MCU
- WSDM 2022 | 基于元学习的多场景多任务商家建模
- EntitySpaces2009的开发文档地址
- ASP.NET页面传值的各种方法和分析
- php传输数据arduino,Arduino如何和php,html文件一起使用?
- 9.4. Default Gateway
- 【技术白皮书】第四章:信息抽取技术产业应用现状及案例(上)
- 庞皓计量经济学第四版_庞皓计量经济学第4版笔记和课后答案
- 服务器查看GPU及各个参数
- 2017年 Python工程师面试经历分享(七家)
- Django-bootstrap3插件搭建Django+Bootstrap网站
- 计算机 蓝牙鼠标卡顿,蓝牙鼠标卡顿、漂移现象的解决方法
- java实现pdf旋转_java-Apache PDFBox旋转PDImageXObject
- vscode最常用插件
- 遍地喧嚣的智能音箱战场,究竟谁能做出中国的 Echo?
- 满血复活~喵呜~喵~呜~
- 2022.02.10_Java学习总结_新特性
热门文章
- 榆熙教育:拼多多平台考核如何达成系统考核指标
- Loadrunner之关联——用小故事理解
- win7计算机桌面快捷键显示,Win7的显示桌面在哪 Win7显示桌面快捷键是什么
- js数组中添加新元素,如果没有则添加
- 公司金融01.现值与贴现
- c语言上机总结报告,C语言程序设计上机实践心得报告
- PPI网络比对文章汇总
- 【CLAPACK函数库】CLAPACK安装与使用,编译好了出现f2c_dgemm,dgesvd_错误主要是camkelist, gcc编译库的顺序要对
- 开发工具合集专题《管理工具,DoxygenAPI文档自动生成》
- python软件设计数据分析统计服_学习笔记(一)-python制作数据分析工具