一、存储单元
1、位(bit):一个数字0或者一个数字1,代表一位。
字节(byte):每逢8位是一个字节,这是计算机存储单元胡最小单位。
二、命令符(cmd)
启动: win + R(r) 输入cmd 回车
切换盘符: 盘符名称: 例如:c(C): 回车
进入文件夹: cd 文件夹名称
进入多级文件夹: cd 文件夹名称1\文件夹名称2\文件夹名称3 回车
返回上一级: cd .. 回车
直接回根路径: cd \ 回车
查看当前内容: dir 回车
清屏: cls 回车
退出: exit 回车
三、JDK和JRE
JRE(Java Runtime Environment):是Java 程序的运行时环境,包含JVM和运行时所需要的核心类库。
JDK(Java Development Kit):是Java程序开发工具包,包含JRE和开发人员使用的工具。
我们想要运行一个已有的Java程序,那么只需要安装JRE即可。
我们想要开发一个全新的Java程序,那么必须安装JDK。
四、java注释
1. 单行注释://
2. 多行注释:/………/
多用于多行,对目前用不到的代码或者写的注释词比较多可选择多行注释
3. 文本注释:/*……../
多用于方法或者类,当开发项目的时候,方法多的时候容易记不住此方法是干什么的,此时可以使用文本注释进行对方法解释,以及对方法中要传的变量进行解释,方便以后进行查找。
五、java关键字和java标识符
1. java关键字
- 定义:有特殊含义,被保留的,不能随意使用的字符。
特点:
定义:是指在程序中,我们自己定义的内容。例如类的名字,方法的名字和变量的名字等,都是标识符。
- 命名规则(硬性要求):
- 标识符可以包含英文字母26个(区分大小写)、数字,$(美元符号)和下划线(_)。
- 标识符不能以数字开头。
- 标识符不能使用关键字。
命名规范(软性要求):
定义:在程序运行期间,固定不变的量。
分类:
定义:在程序运行期间,发生变化的量。
-
七、数据类型
1. 基本数据类型
整数【short(2个字节),byte(1个字节),int(4个字节),long(8个字节)】:在用的时候默认为int类型
- 浮点数【float(4个字节),doubl(8个字节)】:在用的时候默认为double类型
- 字符【chart(2个字节)】
布尔【true(1个字节),false(1个字节)】:在用的时候默认为true
2. 引用类型
-
八、软件架构
1. C/S:Client/Server 客户端/服务器
在用户本地有一个客户端程序,在远程有一个服务器端程序
- 如:QQ,迅雷…
- 优点:用户体验好
-
2. B/S:Browser/Server 浏览器/服务器
只需要一个浏览器,用户通过不同的网址(URL),客户访问不同的服务器端程序
- 优点:开发,安装,部署,维护 简单
- 缺点:
- 如果应用过大,用户的体验可能会受到影响
- 对硬件要求过高
九、JavaScript
- JavaScript发展史
- 1992年:Nombase公司,开发出第一门客户端脚本语言,专用于表单的校验。命名为:C— ,后台更名为ScriptEase
- 1995年:Netscape(网景)公司,开发了一门客户端脚本语言:LiveScript。后来,请来了SUN公司的专家,修改LiveScript,命名为JavaScript。
- 1996年:微软公司抄袭JavaScript开发出JScript语言
- 1997年:ECMA(欧洲计算机制造协会),ECMAScript,就是所有客户端脚本语言的标准。
- 由此可见,Java 和 JavaScript 一点关系都没以后,JavaScript 就是想火才起的这个名字,因为那个时候Java很火了,他们就好象雷锋与雷锋塔的关系。
JavaScript = ECMAScript + JavaScript自己特有的东西(BOM + DOM)
- JavaScript发展史
ECMAScript:客户端脚本语言的标准
1. 基本语法:
- 与html结合方式
- 外部JS:
- 定义
- 内部JS:
- 定义,通过src引入外部的js文件
- 注意:
- 概念:某种组件被执行了某些操作后,触发某些代码的执行。
- 事件:某些操作。如:单击,双击,键盘按下了,鼠标移动了。
- 事件源:组件。如:按钮,文本输入框….
- 监听器:代码。
- 注册监听:将事件,事件源,监听器结合在一起。当事件源上发生了某个事件,则触发执行某个监听器代码。
常见的事件:
- 点击事件:
- onclick :单击事件
- ondblclick:双击事件
- 焦点事件:
- onblur:失去焦点
- onfocus:元素获取焦点
- 加载事件:
- onload:一张页面或一幅图像完成加载。
- 鼠标事件:
- onmousedown:鼠标按钮被按下
- onmouseup:鼠标按键被松开
- onmousemove:鼠标被移动
- onmouseover:鼠标移动到某元素之上
- onmouseout:鼠标从某元素移开。
- 键盘事件:
- onkeydown:某个键盘按键被按下
- onkeyup:某个键盘按键被松开
- onkeypress:某个键盘按键被按下并松开
- 选择和改变
- onchange:域的内容被改变
- onselect:文本被选中
- 表单事件:
- 点击事件:
概念:Browser Object Model 浏览器对象模型。将浏览器的各个组成部分封装成对象。
组成:
- Window:窗口对象
- 创建:
- 方法:
- 与弹出框有关方法:
- alert():显示带有一段消息和一个确认按钮的警告框。
- confirm():显示带有一段消息以及确认按钮和取消按钮的对话框。获取点击那个按钮的结果:var flag= confirm(“确定要关闭吗”); 返回true/false
- 如果用户点击确认按钮,则方法返回true
- 如果用户点击取消按钮,则方法返回false
- prompt():显示可提示用户输入的对话框
- 返回值:获取用户输入的值
- 与打开关闭有关的方法
- close():关闭浏览器窗口。原则:谁调用我,我关谁
- open():打开一个新的浏览器窗口。返回新的Window对象。打开一个新的
- 与定时器有关的方法
- setTimeout():在指定的毫秒数后电泳函数或计算表达式。只执行一次
- 参数:js代码或者方法对象,毫秒值
- 返回值:唯一标识,用于取消定时器
- clearTimeout():取消setTimeout()方法设置的timeout。
- setInterval():按照指定的周期(以毫秒计)来调用函数或者计算表达式(每多少毫秒执行某方法或者某计算表达式)。可执行多次
- 参数:js代码或者方法对象,毫秒值
- 返回值:唯一标识,用于取消定时器
- clearInterval():取消setInterval()设置的timeout.
- setTimeout():在指定的毫秒数后电泳函数或计算表达式。只执行一次
- 与弹出框有关方法:
- 属性:
- 获取其他BOM对象:history,location,Navigator,Screen
- 获取DOM对象:document
- 特点:
- Window对象不需要创建可以直接使用。Window使用方法:window.方法名()
- Window引用可以省略。———->方法名();
- Navigator:浏览器对象
- Screen:显示器屏幕对象
- History:历史记录对象
- 创建(获取):
- window.history
- history
- 方法:
- back():加载history列表中的前一个URL。
- forward():加载history列表中的下一个URL。
- go(参数):加载history列表中的某个具体页面
- 参数:
- 正数:前进几个历史纪录
- 负数:后退几个历史纪录
- 参数:
- 属性:
- length:返回当前窗口历史列表中的url数量。
- 创建(获取):
- Location:地址栏对象
- Window:窗口对象
概念:一个前端开发的框架,BootStrap,来自Twitter,是目前很受欢迎的前段框架。BootStrap是基于HTMLL,CSS,JavaScript的,它简洁灵活,使得Web开发更加快捷。
同一套页面可以兼容不同分辨率的设备。
- 实现:依赖于栅格系统:将一行平均分成12个格子,可以制定元素占几个格子。
步骤:
- 定义容器。相当于之前的table.
- 容器分类:
- container:两边留白
- container-fluid:每一种设备都是100%宽度
- 容器分类:
- 定义行。相当于之前的tr 样式:row
- 定义元素。制定该元素在不同的设备上,所占的格子数目。
- 设备代号:
- xs:超小屏幕 手机(<769px):col-xs-12
- sm:小屏幕 平板(>=768px)
- md:中等屏幕 桌面显示器(>=992px)
- lg:大屏幕 大桌面显示器(>=1200px)
- 设备代号:
- 注意:
- 定义容器。相当于之前的table.
可扩展:标签都是自定义的。
- 功能:
- 存储数据:
- 配置文件
- 在网络中传输
- 存储数据:
XML与HTML的区别:
基本语法:
- XML文档的后缀名.xml
- XML第一行必须定义为文档声明:<?xml version = ‘1.0’?>
- XML文档中有且仅有一个根标签
- 属性值必须使用引号(单双都可)引起来
- 标签必须正确关闭
- XML标签名称区分大小写。
快速入门:
<?xml version='1.0'?> <users> <user id='1'> <name>zhangsan</name> <age>20</age> <gender>male</gender> </user> <user id='2'> <name>lisi</name> <age>21</age> <gender>famale</gender> </user> </user>组成部分:
- 文档声明:
- 格式:<?xml 属性列表 ?>
- 属性列表:
- version:版本号,必须的属性
- encoding:编码格式。告知解析引擎当前文档使用的字符集(编码格式)。默认值:ISO-8859-1。
- standalone:是否独立
- 取值:
- yes:不依赖其他文件
- no:依赖其他文件
- 取值:
- 指令:结合css的。引用<?xml-stylesheet type=”text/css” hreg=”a.css”?>
- 标签:标签名称自定义的。
- 规则:
- 名称可以包含字母、数字以及其他的字符。
- 名称不能以数字或者标点符号开始。
- 名称不能以字母 xml(或者 XML Xml等)开始。
- 名称不能包含空格
- 规则:
- 文本:
- CDATA区:在该区域中的数据会被原样展示。
- 格式:<![CDATA[数据]]>
- <![CDATA[if(a c){}]]>
- CDATA区:在该区域中的数据会被原样展示。
- 文档声明:
约束:规定XML文档的书写规则
- 作为框架的使用者:
- 能够在XML中引入约束文档
- 能够简单的读懂约束文档
- 分类:
- DTD:一种简单的约束技术
- Schema:一种复杂的约束技术
- DTD:
- 引入DTD文档到XML文档中
- 内部dtd:将约束规则定义在XML文档中
- 内部dtd:将约束的规则定义外部的dtd文档中
- 本地:<!DOCTYPE 根标签名 SYSTEM “dtd文档的位置”>
- 网络:<!DOCTYPE 根标签名 PUBLIC “dtd文件名字” “dtd文件的位置URL”
- 引入DTD文档到XML文档中
- Schema:
- 引入
- 填写XML文档的根元素
- 引入xsi前缀。xmlns:xsi = “http://www.w3.ort/2001/XMLSchema-istance“
- 引入xsd文件命名空间。xsi:schemaLocation = “http://www.itcast.cn/xml student.xsd”
- 为每一个xsd约束声明一个前缀,作为标识 xmlns = “http://www.itcast.cn/xml“
<students xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns = "http://www.itcast.cn/xml" xsi:schemaLocaton= "http://www.itcast.cn/xml student.xsd">解析:操作XML文档,将文档中的数据读取到内存中
- 引入
- 作为框架的使用者:
操作XML文档
- 解析(读取):将文档中的数据读取到内存中。
- 写入:将内存中的数据保存到XML文档中,持久化的存储。
- 解析XML的方式:
- DOM:将标记语言文档一次性加载进内存,在内存中形成一颗DOM树。
- 优点:操作方便,可以对文档进行CRUD的所有操作。
- 缺点:占内存。
- SAX:逐行读取,基于事件驱动的。
- 优点:不占内存。
- 缺点:只能读取,不能增删改。
- DOM:将标记语言文档一次性加载进内存,在内存中形成一颗DOM树。
- XML常见解析器:
- JAXP:sun公司提供的解析器,支持dom和sax两种思想。
- DOM4J:一款非常优秀的解析器。
- Jsoup:Jsoup是一款Java的HTML解析器,可直接解析某个URL地址,HTML文档内容。它提供了一套非常省力的API,可通过DOM,CSS以及类似说JQuery的操作方法来取出和操作数据。
- PULL:Android操作系统内置的解析器,sax方式的。
- Jsoup:
- 快速入门:
- 步骤:
- 导入jar包:jsoup-1.11.2.jar
- 获取Document对象
- 获取对应的标签Element对象
- 获取数据
- 下面是一个例子(要求:获取user.xml中的第一个元素的name值) ```java package com.web;
- 步骤:
- 快速入门:
import java.io.File; import java.io.IOException;
import org.jsoup.Jsoup; import org.jsoup.nodes.Document; import org.jsoup.nodes.Element; import org.jsoup.select.Elements;
public class JsoupDemo { public static void main(String[] args)throws IOException { //2. 获取Document对象,根据XML文档获取 //2.1 获取user.xml的path String path=JsoupDemo.class.getClassLoader().getResource(“user.xml”).getPath(); //2.2 解析xml文档,加载文档进内存,获取dom树———->Document Document document=Jsoup.parse(new File(path),”UTF-8”); //3. 获取元素对象Element Elements elements=document.getElementsByTag(“name”);
System.out.println(elements.size()); //3.1 获取第一个name的Element对象 Element element =elements.get(0); //3.2 获取数据 String name =element.text(); System.out.println(name); }}
```xml <?xml version="1.0" encoding="UTF-8"?> <!--user.xml--> <users> <user number="u_1001"> <name>tom</name> <age>20</age> <sex>male</sex> </user> <user number="u_1002"> <name>jeck</name> <age>20</age> <sex>female</sex> </user> </users>- 对象的使用:
- Jsoup:工具类,可以解析html或xml文档 ,返回Doucument。
- parse:解析html或xml文档,返回Document
- parse(File in ,String charsetName ):解析xml或html文件的。
- parse(String html):解析xml或html字符串
- parse(URL url,int timeoutMillis):通过网络路径获取指定的html或xml文档对象
- parse:解析html或xml文档,返回Document
- Document:文档对象。代表内存中的dom树。
- 获取Element对象
- getElementById(String id):根据id属性值获取唯一的element对象。
- getElementByTag(String tagName):根据标签名称获取元素对象集合
- getElementByAttribute(String key):根据属性名称获取元素对象集合
- getElementByAttributeValue(String key,String value):根据对应的属性名称和属性值获取元素对象集合。
- 获取Element对象
- Elements:元素Element对象的集合。可以当做ArrayList
来采用。 - Element:元素对象
- 获取子元素对象
- getElementById(String id):根据id属性值获取唯一的element对象。
- getElementByTag(String tagName):根据标签名称获取元素对象集合
- getElementByAttribute(String key):根据属性名称获取元素对象集合
- getElementByAttributeValue(String key,String value):根据对应的属性名称和属性值获取元素对象集合。
- 获取属性值:
- String attr(String key):根据属性名称获取属性值,key值不区分大小写
- 获取文本内容
- String text():获取所有子标签的纯文本内容
- String html():获取标签体的所有内容(包括子标签的字符串内容)
- 获取子元素对象
- Node:节点对象
- 是Document和Element的父类
- Jsoup:工具类,可以解析html或xml文档 ,返回Doucument。
- 快捷查询方式:
- selector:选择器
- 使用的方法:Elements select(String cssQuery)
- 语法:参考Selector类中定义的语法 ```java package com.web;
- 使用的方法:Elements select(String cssQuery)
- selector:选择器
import java.io.File; import java.io.IOException;
import org.jsoup.Jsoup; import org.jsoup.nodes.Document; import org.jsoup.nodes.Element; import org.jsoup.select.Elements;
public class JsoupSelector { public static void main(String[] args) throws IOException { String path=JsoupDemo.class.getClassLoader().getResource(“user.xml”).getPath(); //2.2 解析xml文档,加载文档进内存,获取dom树———->Document Document document=Jsoup.parse(new File(path),”UTF-8”);
//3. 查询name标签 Elements elements=document.select("name"); System.out.println(elements); System.out.println("----------------------------------------------------------------"); //4. 查询id为username的元素 Elements elements1=document.select("#age"); System.out.println(elements1); System.out.println("-----------------------------------------------------------------"); //5. 获取user标签并且number属性值为u_1001的age子标签 //5.1 获取user标签并且number属性值为u_1001 Elements elements3=document.select("user[number='u_1001']"); //5.2 获取user标签并且number属性值为u_1001的age子标签 Elements elements4=document.select("user[number='u_1001'] > age"); System.out.println(elements4); }}
1. XPath:XPath即为XML路径语言,它是一种用来确定XML(标准通用标记语言的子集)文档中某部分位置的语言。 1. 使用Jsoup的XPath需要额外导入两个jar包。-------->JsoupXpath-0.1.2.jar和commons-lang3-3.1.jar 1. 查询w3school参考手册,使用xpath的语法完成查询 ```java package com.web; import java.io.File; import java.io.IOException; import java.util.List; import org.jsoup.Jsoup; import org.jsoup.nodes.Document; import cn.wanghaomiao.xpath.exception.XpathSyntaxErrorException; import cn.wanghaomiao.xpath.model.JXDocument; import cn.wanghaomiao.xpath.model.JXNode; public class JsoupXpath0 { public static void main(String[] args) throws IOException, XpathSyntaxErrorException { String path=JsoupDemo.class.getClassLoader().getResource("user.xml").getPath(); //2.2 解析xml文档,加载文档进内存,获取dom树------->Document Document document=Jsoup.parse(new File(path),"UTF-8"); //3. 根据Document对象,创建JXDocument对象 JXDocument jxDocument=new JXDocument(document); //4. 结合xpath语法查询 //4.1 查询所有user标签 List<JXNode> jxNodes=jxDocument.selN("//user"); for(JXNode jxNode : jxNodes) { System.out.println(jxNode); } System.out.println("--------------------------------------"); //4.2查询所有user标签下的name List<JXNode> jxNodes1=jxDocument.selN("//user/name"); for(JXNode jxNode : jxNodes1) { System.out.println(jxNode); } System.out.println("--------------------------------------"); //4.3查询所有user标签下的带有id属性的name标签 List<JXNode> jxNodes2=jxDocument.selN("//user/name[@id]"); for(JXNode jxNode : jxNodes2) { System.out.println(jxNode); } System.out.println("--------------------------------------"); //4.4查询所有user标签下的带有id属性的age标签,并且id属性值为age List<JXNode> jxNodes3=jxDocument.selN("//user/age[@id='age']"); for(JXNode jxNode : jxNodes3) { System.out.println(jxNode); } } }十二、Tomcat
回顾:
资源分类:
- 静态资源:所有用户访问后,得到的结果都是一样的,称为静态资源,静态资源可以直接被浏览解析
- 如:html、css、JavaScript
动态资源 :每个用北方问候后户访问相同的资源后,得到的结果可能一样。称为动态资源。动态资源被访问后,需要先转为静态资源,再返回给浏览器。
IP:电子设备在网络中的唯一标识
- 端口:应用程序在计算机中唯一标识。 0~65536
传输协议:规定了数据传输的规则
webLogic:oracle公司,大型的JavaEE服务器,支持所有的JavaEE规范,收费的。
- webphere:IBM公司,大型的JavaEE服务器,支持所有的JavaEE规范,收费的。
- JBOSS:JBOSS公司,大型的JavaEE服务器,支持所有的JavaEE规范,收费的(使用的时候是免费的,但是文档和其他的服务是收费的)。
- Tomcat:Apache基金 组织,中小型的JavaEE服务器,仅仅支持少量的JavaEE规范的servlet/jsp。开源的,免费的。
*. JavaEE:Java语言在企业级开发使用的技术规范的总和,一共规定了13项大的规范。
Tomcat:web服务器
- 下载:http://tomcat.apache.org/
- 安装:解压压缩包即可 *:安装目录建议不要有中文和空格
- 卸载:删除目录就行了
- 启动:
- bin/startup.bat 双击运行该文件即可
- 访问自己:浏览器输入:http://localhost:8080
- 访问别人:浏览器输入:http://别人的ip:8080
- 可能遇到的问题:
- 黑窗口一闪而过:
- 原因:没有正确配置JAVA_HOME环境变量
- 解决方案:正确配置JAVA_HOME环境变量
- 启动报错:
- 暴力:找到占用的端口号,并且找到对应的线程,杀死该线程
- cmd —-> netstat -ano
- 温柔:修改自身的端口号
- config/server.xml
- 修改
- 一般会将tomcat的默认端口号修改为80,80端口号是http协议的默认端口号。
- 好处:在访问时,就不用输入端口号
- 好处:在访问时,就不用输入端口号
- 暴力:找到占用的端口号,并且找到对应的线程,杀死该线程
- 黑窗口一闪而过:
- 关闭:
- 正常关闭:
- bin/shutdown.bat
- ctrl+c
- 强制关闭:
- 点击启动窗口的X
- 点击启动窗口的X
- 正常关闭:
配置:
- 部署项目的方式:
- 直接将项目放到webapps目录下即可。
- /项目名 :项目的访问路径 ——>虚拟路径
- 简化部署:将项目打成一个war包,再将war包放置webapps目录下。(war包会自动解压缩)
- 配置conf/server.xml文件
- 在
标签中配置 - docBase:项目存放的路径
- path:虚拟路径
- 在
- 在conf\Catalina\localhost创建任意名称的xml文件。在文件中编写
*. 虚拟路径 :xml的文件名
- 直接将项目放到webapps目录下即可。
- 动态项目:
- 部署项目的方式:
Servlet就是一个接口,定义了Java类浏览器访问到(tomcat识别)的规则。
-
快速入门:
创建JavaEE项目
- 定义一个类,实现Servlet接口
- public class ServletDome1 implements Servlet
- 实现接口中的抽象方法
- 提供服务的方法 public void service(………)
配置Servlet
- web.xml
```xml
demo1 cn.itcast.web.servlet.ServletDome1
执行原理
- web.xml
```xml
当服务器接受到客户端浏览器的请求后,会解析请求URL路径,获取访问的Servlet的资源路径
- 查找web.xml文件,是否有对应的
标签内容。 - 如果有,则在找到对应的
全类名。 - tomcat会将字节码文件加载进内存,并且创建其对象。
-
Servlet中的生命周期方法:
被创建:执行init方法,只执行一次。被创建时执行
- Servlet什么时候被创建?
- 默认情况下,第一次被访问时,Servlet被创建
- 可以配置执行Servlet的创建时机。
- 在
标签下配置 - 第一次访问时,创建
的值为负数 - 在服务器启动时,创建
的值为0或正整数
- 第一次访问时,创建
- 在
- Servlet的init方法,只执行一次,说明一个Servlet在内存中只存在一个对象,Servlet是单例的。
- 多个用户同时访问时,可能存在线程安全问题。造成高并发问题。
- 解决:尽量不要在Servlet中定义成员变量。即使定义了成员变量,也不要对其修改。
- Servlet什么时候被创建?
- 提供服务:执行service方法,执行多次。被访问时执行
- 每次访问Servlet时,Service方法都会被调用一次
被销毁:执行destory方法,只执行一次。被销毁时访问
创建JavaEE项目,选择Servlet的版本3.0以上,可以不创建web.xml。
- 定义一个类,实现Servlet接口。
- 重写方法。
在类上使用@WebServlet注解,进行配置
Servlet —-> 接口
- GenericServlet —-> 抽象类
- 将Servlet接口中其他的方法做了默认空实现,只将service()方法作为抽象。
HttpServlet —-> 抽象类
urlpartten:Servlet访问路径
IDEA会为每一个tomcat部署的项目单独建立的一份配置文件
- 查看控制台的log:Using CATALINA_BASE:”C:\Users\fqy.IntelliJIdea2018.1\system\tomcat_itcat”
- 工作空间项目 和 tomcat部署的web项目
- tomcat真正访问的是“tomcat部署的web项目”,“tomcat部署的web项目”对应着“工作空间项目”的web目录下的所有资源。
- WEB-INF目录下的资源不能直接被浏览器访问。
-
十四、HTTP
概念:Hyper Text Transfer Portocol 超文本传输协议
传输协议:定义了客户端和服务器端通信时,发送数据的格式
- 特点:
- 基于TCP/IP的高级协议。
- 默认端口号:80。
- 基于请求/响应模型的:一次请求对应一次响应。
- 无状态:每次请求之间都会建立新的链接。
历史版本
请求行
- 格式:请求方式 请求url 请求协议/版本 —> GET /login.html HTTP/1.1
- 请求方式:
- HTTP协议中有7种请求方式,常用的有2种
- GET:
- 请求参数在请求行中,在url后面。
- 请求的url长度有限制的
- 不太安全
- POST:
- 请求参数在请求体中。
- 请求的url长度没有限制的
- 相对安全
- GET:
- HTTP协议中有7种请求方式,常用的有2种
- 请求头
- 请求头名称:请求头值
- 常见的请求头
- User-Agent:浏览器告诉服务器,我访问你使用的的浏览器信息
- 可以在服务器端货去该头的信息,解决浏览器的兼容性的问题
- Referer:http://localhost/login.html
- 告诉服务器,我(当前请求)从哪里来?
- 作用:
- 防盗链:
- 统计工作:
- 作用:
- 告诉服务器,我(当前请求)从哪里来?
- User-Agent:浏览器告诉服务器,我访问你使用的的浏览器信息
- 请求空行
- 空行,就是用于分割POST请求的请求头和请求体。
请求体(正文)
定义:一次会话中包含多次请求和响应。
- 一次会话:浏览器第一次给服务器资源发送请求,会话建立,直到有一方断开为止。
- 功能:再一次会话的范围内的多次请求间,共享数据。
方式:
概念:客户端会话技术,将数据保存到客户端。
快速入门:
使用步骤:
创建Cookie对象,绑定数据
new Cookie(String name,String value);发送Cookie对象
response.addCookie(Cookie cookie);iii. 获取Cookie,拿到数据
Cookie[] request.getCookie();
原理:
- 基于响应头set-cookie和请求头cookie实现
- cookie的细节:
- 一次可不可以发送多个cookie?
- 可以,可以创建多个Cookie对象,使用response调用多次addCookie方法发送cookie即可。
- cookie在浏览器中保存多长时间?
- 默认情况下,当浏览器关闭后,Cookie数据被销毁。
- 持久化存储:
- setMaxAge(int seconds)
- 正数:将Cookie数据写道硬盘的文件中。持久化存储。cookie的存活时间。
- 负数:默认值
- 零:删除cookie信息。
- setMaxAge(int seconds)
- cookie能不能存中文?
- 在tomcat8之前cookie中不能直接存储中文数据。
- 需要将中文数据转码——-一般采用URL编码(%E3)
- 在tomcat8之后cookie支持中文数据。
- 在tomcat8之前cookie中不能直接存储中文数据。
- cookie共享问题?
- 假设在一个tomcat服务器中部署了多个web项目,那么在这些web项目中cookie能不能共享?
- 默认情况下cookie不能共享
- setPath(String path):设置cookie的获取范围。默认情况下,设置当前的虚拟目录
- 如果要共享,则可以将path设置为”/“
- 不同的tomcat服务器间cookie共享问题?
- setDomain(String path):如果设置一级域名相同,那么多个服务器之间cookie可以共享
- setDomain(“.baidu.com”),那么tieba.baidu.com和news.baidu.com中的cookie可以共享。
- setDomain(String path):如果设置一级域名相同,那么多个服务器之间cookie可以共享
- 假设在一个tomcat服务器中部署了多个web项目,那么在这些web项目中cookie能不能共享?
- 一次可不可以发送多个cookie?
- cookie的特点和作用:
- 特点:
- cookie存储数据在客户端浏览器
- 浏览器对于单个cookie的大小有限制(4kb)以及对同一个域名下的总cookie数量也有限制(20个)
- 作用:
- cookie一般用于存储少量的不太敏感的数据。
- 在不登录的情况下,完成服务器对客户端的身份识别。
- 特点:
- 案例:记住上一次访问时间
- 需求:
- 访问一个Servlet,如果是第一次访问,则提示:您好,欢迎首次访问。
- 如果不是第一次访问,则提示:欢迎回来,您上次访问时间为:显示时间字符串
- 分析:
- 可以采用Cookie来完成
- 在服务器中的Servlet判断是否有一个名为lastTime的cookie
- 有:不是第一次访问
- 响应数据:欢迎回来,您上次访问时间为:2021年2月27日 10:53:50
- 写回Cookie:lastTime=2021年2月27日 10:53:50
- 没有,是第一次访问
- 响应数据:你好,欢迎您首次访问
- 写回Cookie:lastTime=2021年2月27日 10:53:50
- 有:不是第一次访问
- 代码实现 ```java package pegatron.sw.learn;
- 需求:
import java.io.IOException; import java.net.URLDecoder; import java.net.URLEncoder; import java.text.SimpleDateFormat; import java.util.Date;
import javax.servlet.ServletException; import javax.servlet.annotation.WebServlet; import javax.servlet.http.Cookie; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse;
@WebServlet(“/cookieTest”) public class CookieTest extends HttpServlet{ @Override protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { //设置响应的消息体的数据格式以及编码 resp.setContentType(“text/html;charset=utf-8”); //獲取Cookie Cookie[] c=req.getCookies(); boolean flag=false;//判斷cookie為lastTime是否存在 //獲取數據 if(c!=null && c.length >0){ for (Cookie cookie : c) { String name=cookie.getName();//獲取名稱 if(“lastTime”.equals(name)){//判斷名稱是否是lastTime //有,則不是第一次訪問 flag=true; //設置Cookie的value的值 //獲取當前時間字符串,重新設置Cookie的值,重新發送cookie Date date=new Date(); SimpleDateFormat sdf=new SimpleDateFormat(“yyyy年MM月dd日 HH:mm:ss”); String str_date=sdf.format(date); System.out.println(“編碼前” + str_date); //url编码 str_date=URLEncoder.encode(str_date,”utf-8”); System.out.println(“編碼后” +str_date); cookie.setValue(str_date); cookie.setMaxAge(606024*30);//設置存活時間 resp.addCookie(cookie);
//響應數據 String value=cookie.getValue(); System.out.println("解码前:"+value); //URL解码: value = URLDecoder.decode(value,"utf-8"); System.out.println("解码后:"+value); resp.getWriter().write("<h1>歡迎回來,你上次訪問時間為:"+value+"</h1>"); break; } } } if(c==null || c.length == 0 || flag==false){ //沒有,是第一次訪問 //設置cookie的value //獲取當前時間的字符串,重新設置Cookie的值,重新發送cookie Date date=new Date(); SimpleDateFormat sdf=new SimpleDateFormat("yyyy年MM月dd日 HH:mm:ss"); String str_date=sdf.format(date); System.out.println("編碼前" + str_date); //url编码 str_date=URLEncoder.encode(str_date,"utf-8"); System.out.println("編碼后" +str_date); Cookie cookie=new Cookie("lastTime", str_date); //設置存活時間 cookie.setMaxAge(60*60*24*30); resp.addCookie(cookie); resp.getWriter().write("<h1>您好!歡迎首次訪問</h1>"); } } @Override protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { this.doPost(req, resp); }}
Session
- 概念:服务器端会话技术,在一次会话的多次请求共享数据,将数据保存在服务端的对象中。HttpSession
- 快速入门:
- 获取HttpSession对象:
- HttpSession session = request.getSession();
- 使用HttpSession对象:
- Object getAttribute(String name)
- void setAttribute(String name,String value)
- void removeAttribute(String name);
- 获取HttpSession对象:
- 原理:
- session的实现是依赖于cookie的。
- 细节:
- 当客户端关闭后,服务器不关闭,两次获取session是否为同一个?
- 默认情况下不是。
- 如果需要相同。则可以创建Cookie,键为SESSIONID,设置最大存活时间,让cookie持久化保存。
- 客户端不关闭,服务器端关闭后,两次获取session是同一个吗?
- 不是同一个,但是要确保数据不丢失
- session的钝化:
- 在服务器正常关闭之前,将session对象序列化到硬盘上
- session的活化:
- 在服务器启动后,将session文件转化为内容中的session对象即可。
- session的钝化:
- 不是同一个,但是要确保数据不丢失
- session的失效时间?
- 服务器关闭
- session对象调用invalidate()。
- session默认失效时间30分钟
- 可以才web.xml配置失效时间,单位分钟
30
- 可以才web.xml配置失效时间,单位分钟
- 当客户端关闭后,服务器不关闭,两次获取session是否为同一个?
- session的特点
- session用于存储一次会话的多次请求的数据,存储在服务器端。
- session可以存储任意类型,任意大小的数据。
session和cookie的区别:
M:Model,模型
- 完成具体的业务操作。如:查询数据库,封装对象
- V:View,视图
- 展示数据
C:Controller,控制器
优点:
- 耦合性低,方便维护,可以利用分工协作
- 重用性高
- 缺点:
- 使项目结构变得复杂,对开发人员要求高。
- 概念:某种组件被执行了某些操作后,触发某些代码的执行。
- 外部JS:
