[TOC]

一、存储单元

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关键字

  1. 定义:有特殊含义,被保留的,不能随意使用的字符。
  2. 特点:

    1. 完全小写的字母。
    2. 有特殊颜色。

      2. java标识符

  3. 定义:是指在程序中,我们自己定义的内容。例如类的名字,方法的名字和变量的名字等,都是标识符。

  4. 命名规则(硬性要求):
    1. 标识符可以包含英文字母26个(区分大小写)、数字,$(美元符号)和下划线(_)。
    2. 标识符不能以数字开头。
    3. 标识符不能使用关键字。
  5. 命名规范(软性要求):

    1. 类名规范:首字母要大写,后面每个单词首字母要大写(大驼峰命名法)。
    2. 变量名规范:首字母小写,后面每个单词首字母要大写(小驼峰命名法)。
    3. 方法名规范:同变量名规范(小驼峰命名法)。

      六、常量和变量

      1. 常量

  6. 定义:在程序运行期间,固定不变的量。

  7. 分类:

    1. 字符串常量:凡是用双引号引起来的部分,叫做字符串常量。
    2. 整数常量:直接写上数字,没有小数点。
    3. 浮点数常量:直接写上数字,有小数点。
    4. 字符常量:凡是用单引号引起来的单个字符,叫做字符常量。两个单引号中间必须有且仅有一个字符,。没有不行,有两个或多个不行。
    5. 空常量:null。代表没有任何数据。

      2. 变量

  8. 定义:在程序运行期间,发生变化的量。

  9. 声明格式:数据类型 变量名 = 变量值

    七、数据类型

    1. 基本数据类型

  10. 整数【short(2个字节),byte(1个字节),int(4个字节),long(8个字节)】:在用的时候默认为int类型

  11. 浮点数【float(4个字节),doubl(8个字节)】:在用的时候默认为double类型
  12. 字符【chart(2个字节)】
  13. 布尔【true(1个字节),false(1个字节)】:在用的时候默认为true

    2. 引用类型

  14. 除去基本类型之外都是引用类型。比如说类,数组,接口等。

    八、软件架构

    1. C/S:Client/Server 客户端/服务器

  15. 在用户本地有一个客户端程序,在远程有一个服务器端程序

  16. 如:QQ,迅雷…
  17. 优点:用户体验好
  18. 缺点:开发,安装,部署,维护 麻烦

    2. B/S:Browser/Server 浏览器/服务器

  19. 只需要一个浏览器,用户通过不同的网址(URL),客户访问不同的服务器端程序

  20. 优点:开发,安装,部署,维护 简单
  21. 缺点:
    1. 如果应用过大,用户的体验可能会受到影响
    2. 对硬件要求过高

      九、JavaScript

      1. JavaScript发展史
        1. 1992年:Nombase公司,开发出第一门客户端脚本语言,专用于表单的校验。命名为:C— ,后台更名为ScriptEase
        2. 1995年:Netscape(网景)公司,开发了一门客户端脚本语言:LiveScript。后来,请来了SUN公司的专家,修改LiveScript,命名为JavaScript。
        3. 1996年:微软公司抄袭JavaScript开发出JScript语言
        4. 1997年:ECMA(欧洲计算机制造协会),ECMAScript,就是所有客户端脚本语言的标准。
      2. 由此可见,Java 和 JavaScript 一点关系都没以后,JavaScript 就是想火才起的这个名字,因为那个时候Java很火了,他们就好象雷锋与雷锋塔的关系。

      JavaScript = ECMAScript + JavaScript自己特有的东西(BOM + DOM)

ECMAScript:客户端脚本语言的标准

1. 基本语法:

  1. 与html结合方式
    1. 外部JS:
      1. 定义
    2. 内部JS:
      1. 定义,通过src引入外部的js文件
    3. 注意:
      1. ```

        事件监听机制:

      1. 概念:某种组件被执行了某些操作后,触发某些代码的执行。
        1. 事件:某些操作。如:单击,双击,键盘按下了,鼠标移动了。
        2. 事件源:组件。如:按钮,文本输入框….
        3. 监听器:代码。
        4. 注册监听:将事件,事件源,监听器结合在一起。当事件源上发生了某个事件,则触发执行某个监听器代码。
      2. 常见的事件:

        1. 点击事件:
          1. onclick :单击事件
          2. ondblclick:双击事件
        2. 焦点事件:
          1. onblur:失去焦点
          2. onfocus:元素获取焦点
        3. 加载事件:
          1. onload:一张页面或一幅图像完成加载。
        4. 鼠标事件:
          1. onmousedown:鼠标按钮被按下
          2. onmouseup:鼠标按键被松开
          3. onmousemove:鼠标被移动
          4. onmouseover:鼠标移动到某元素之上
          5. onmouseout:鼠标从某元素移开。
        5. 键盘事件:
          1. onkeydown:某个键盘按键被按下
          2. onkeyup:某个键盘按键被松开
          3. onkeypress:某个键盘按键被按下并松开
        6. 选择和改变
          1. onchange:域的内容被改变
          2. onselect:文本被选中
        7. 表单事件:
          1. onsubmit:确认按钮被点击
          2. onreset:重置按钮被点击

            BOM(Browser Object Model):

      3. 概念:Browser Object Model 浏览器对象模型。将浏览器的各个组成部分封装成对象。

      4. 组成:

        1. Window:窗口对象
          1. 创建:
          2. 方法:
            1. 与弹出框有关方法:
              1. alert():显示带有一段消息和一个确认按钮的警告框。
              2. confirm():显示带有一段消息以及确认按钮和取消按钮的对话框。获取点击那个按钮的结果:var flag= confirm(“确定要关闭吗”); 返回true/false
                1. 如果用户点击确认按钮,则方法返回true
                2. 如果用户点击取消按钮,则方法返回false
              3. prompt():显示可提示用户输入的对话框
                1. 返回值:获取用户输入的值
            2. 与打开关闭有关的方法
              1. close():关闭浏览器窗口。原则:谁调用我,我关谁
              2. open():打开一个新的浏览器窗口。返回新的Window对象。打开一个新的
            3. 与定时器有关的方法
              1. setTimeout():在指定的毫秒数后电泳函数或计算表达式。只执行一次
                1. 参数:js代码或者方法对象,毫秒值
                2. 返回值:唯一标识,用于取消定时器
              2. clearTimeout():取消setTimeout()方法设置的timeout。
              3. setInterval():按照指定的周期(以毫秒计)来调用函数或者计算表达式(每多少毫秒执行某方法或者某计算表达式)。可执行多次
                1. 参数:js代码或者方法对象,毫秒值
                2. 返回值:唯一标识,用于取消定时器
              4. clearInterval():取消setInterval()设置的timeout.
          3. 属性:
            1. 获取其他BOM对象:history,location,Navigator,Screen
            2. 获取DOM对象:document
          4. 特点:
            1. Window对象不需要创建可以直接使用。Window使用方法:window.方法名()
            2. Window引用可以省略。———->方法名();
        2. Navigator:浏览器对象
        3. Screen:显示器屏幕对象
        4. History:历史记录对象
          1. 创建(获取):
            1. window.history
            2. history
          2. 方法:
            1. back():加载history列表中的前一个URL。
            2. forward():加载history列表中的下一个URL。
            3. go(参数):加载history列表中的某个具体页面
              1. 参数:
                1. 正数:前进几个历史纪录
                2. 负数:后退几个历史纪录
          3. 属性:
            1. length:返回当前窗口历史列表中的url数量。
        5. Location:地址栏对象
          1. 创建(获取):
            1. window.location
            2. location
          2. 方法:
            1. reload():重新加载当前文档,刷新
          3. 属性:
            1. href:设置或返回完整的路径

              十、BootStrap

              BootStrap:

      5. 概念:一个前端开发的框架,BootStrap,来自Twitter,是目前很受欢迎的前段框架。BootStrap是基于HTMLL,CSS,JavaScript的,它简洁灵活,使得Web开发更加快捷。

        1. 框架:一个半成品软件,开发人员可以在框架基础上,在进行开发,简化编码。
        2. 好处:
          1. 定义了很多的CSS样式和JS插件。我们开发人员直接可以使用这些样式和插件得到丰富的页面效果。
          2. 响应式布局:同一套页面可以兼容分辨率的设备。

            响应式布局:

      6. 同一套页面可以兼容不同分辨率的设备。

      7. 实现:依赖于栅格系统:将一行平均分成12个格子,可以制定元素占几个格子。
      8. 步骤:

        1. 定义容器。相当于之前的table.
          1. 容器分类:
            1. container:两边留白
            2. container-fluid:每一种设备都是100%宽度
        2. 定义行。相当于之前的tr 样式:row
        3. 定义元素。制定该元素在不同的设备上,所占的格子数目。
          1. 设备代号:
            1. xs:超小屏幕 手机(<769px):col-xs-12
            2. sm:小屏幕 平板(>=768px)
            3. md:中等屏幕 桌面显示器(>=992px)
            4. lg:大屏幕 大桌面显示器(>=1200px)
        4. 注意:
          1. 一行中如果格子数目超过12,则超出部分自动换行。
          2. 栅格类属性可以向上兼容。栅格类适用于与屏幕宽度大于或等于分界点大小的设备。
          3. 如果真实设备宽度小于了设置栅格类属性的设备代码的最小值,会一个元素占满一整行。

            十一、XML

            概念:Extensible Markup Language 可扩展标记语言

      9. 可扩展:标签都是自定义的。

      10. 功能:
        1. 存储数据:
          1. 配置文件
          2. 在网络中传输
      11. XML与HTML的区别:

        1. XML标签都是自定义的,HTML标签是预定义。
        2. XML的语法严格,HTML语法松散。
        3. XML是存储数据的,HTML是展示数据。
        4. 他们是兄弟,有个共同的爸爸就是W3C。

          语法

      12. 基本语法:

        1. XML文档的后缀名.xml
        2. XML第一行必须定义为文档声明:<?xml version = ‘1.0’?>
        3. XML文档中有且仅有一个根标签
        4. 属性值必须使用引号(单双都可)引起来
        5. 标签必须正确关闭
        6. XML标签名称区分大小写。
      13. 快速入门:

        <?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>
        
      14. 组成部分:

        1. 文档声明:
          1. 格式:<?xml 属性列表 ?>
          2. 属性列表:
            1. version:版本号,必须的属性
            2. encoding:编码格式。告知解析引擎当前文档使用的字符集(编码格式)。默认值:ISO-8859-1。
            3. standalone:是否独立
              1. 取值:
                1. yes:不依赖其他文件
                2. no:依赖其他文件
        2. 指令:结合css的。引用<?xml-stylesheet type=”text/css” hreg=”a.css”?>
        3. 标签:标签名称自定义的。
          1. 规则:
            1. 名称可以包含字母、数字以及其他的字符。
            2. 名称不能以数字或者标点符号开始。
            3. 名称不能以字母 xml(或者 XML Xml等)开始。
            4. 名称不能包含空格
        4. 文本:
          1. CDATA区:在该区域中的数据会被原样展示。
            1. 格式:<![CDATA[数据]]>
            2. <![CDATA[if(a c){}]]>
      15. 约束:规定XML文档的书写规则

        1. 作为框架的使用者:
          1. 能够在XML中引入约束文档
          2. 能够简单的读懂约束文档
        2. 分类:
          1. DTD:一种简单的约束技术
          2. Schema:一种复杂的约束技术
        3. DTD:
          1. 引入DTD文档到XML文档中
            1. 内部dtd:将约束规则定义在XML文档中
            2. 内部dtd:将约束的规则定义外部的dtd文档中
              1. 本地:<!DOCTYPE 根标签名 SYSTEM “dtd文档的位置”>
              2. 网络:<!DOCTYPE 根标签名 PUBLIC “dtd文件名字” “dtd文件的位置URL”
        4. Schema:
          1. 引入
            1. 填写XML文档的根元素
            2. 引入xsi前缀。xmlns:xsi = “http://www.w3.ort/2001/XMLSchema-istance
            3. 引入xsd文件命名空间。xsi:schemaLocation = “http://www.itcast.cn/xml student.xsd”
            4. 为每一个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文档,将文档中的数据读取到内存中

      16. 操作XML文档

        1. 解析(读取):将文档中的数据读取到内存中。
        2. 写入:将内存中的数据保存到XML文档中,持久化的存储。
      17. 解析XML的方式:
        1. DOM:将标记语言文档一次性加载进内存,在内存中形成一颗DOM树。
          1. 优点:操作方便,可以对文档进行CRUD的所有操作。
          2. 缺点:占内存。
        2. SAX:逐行读取,基于事件驱动的。
          1. 优点:不占内存。
          2. 缺点:只能读取,不能增删改。
      18. XML常见解析器:
        1. JAXP:sun公司提供的解析器,支持dom和sax两种思想。
        2. DOM4J:一款非常优秀的解析器。
        3. Jsoup:Jsoup是一款Java的HTML解析器,可直接解析某个URL地址,HTML文档内容。它提供了一套非常省力的API,可通过DOM,CSS以及类似说JQuery的操作方法来取出和操作数据。
        4. PULL:Android操作系统内置的解析器,sax方式的。
      19. Jsoup:
        1. 快速入门:
          1. 步骤:
            1. 导入jar包:jsoup-1.11.2.jar
            2. 获取Document对象
            3. 获取对应的标签Element对象
            4. 获取数据
            5. 下面是一个例子(要求:获取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>
      
      1. 对象的使用:
        1. Jsoup:工具类,可以解析html或xml文档 ,返回Doucument。
          1. parse:解析html或xml文档,返回Document
            1. parse(File in ,String charsetName ):解析xml或html文件的。
            2. parse(String html):解析xml或html字符串
            3. parse(URL url,int timeoutMillis):通过网络路径获取指定的html或xml文档对象
        2. Document:文档对象。代表内存中的dom树。
          1. 获取Element对象
            1. getElementById(String id):根据id属性值获取唯一的element对象。
            2. getElementByTag(String tagName):根据标签名称获取元素对象集合
            3. getElementByAttribute(String key):根据属性名称获取元素对象集合
            4. getElementByAttributeValue(String key,String value):根据对应的属性名称和属性值获取元素对象集合。
        3. Elements:元素Element对象的集合。可以当做ArrayList来采用。
        4. Element:元素对象
          1. 获取子元素对象
            1. getElementById(String id):根据id属性值获取唯一的element对象。
            2. getElementByTag(String tagName):根据标签名称获取元素对象集合
            3. getElementByAttribute(String key):根据属性名称获取元素对象集合
            4. getElementByAttributeValue(String key,String value):根据对应的属性名称和属性值获取元素对象集合。
          2. 获取属性值:
            1. String attr(String key):根据属性名称获取属性值,key值不区分大小写
          3. 获取文本内容
            1. String text():获取所有子标签的纯文本内容
            2. String html():获取标签体的所有内容(包括子标签的字符串内容)
        5. Node:节点对象
          1. 是Document和Element的父类
      2. 快捷查询方式:
        1. selector:选择器
          1. 使用的方法:Elements select(String cssQuery)
            1. 语法:参考Selector类中定义的语法 ```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 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

      回顾:

      资源分类:

      1. 静态资源:所有用户访问后,得到的结果都是一样的,称为静态资源,静态资源可以直接被浏览解析
        1. 如:html、css、JavaScript
      2. 动态资源 :每个用北方问候后户访问相同的资源后,得到的结果可能一样。称为动态资源。动态资源被访问后,需要先转为静态资源,再返回给浏览器。

        1. 如:servlet/jsp、php、、asp…

          网络通信三要素:

      3. IP:电子设备在网络中的唯一标识

      4. 端口:应用程序在计算机中唯一标识。 0~65536
      5. 传输协议:规定了数据传输的规则

        1. 基础协议:
          1. tcp:安全协议,三次握手。速度稍慢
          2. udp:不安全协议。速度快。

            常见 的java相关的web服务器软件 :

      6. webLogic:oracle公司,大型的JavaEE服务器,支持所有的JavaEE规范,收费的。

      7. webphere:IBM公司,大型的JavaEE服务器,支持所有的JavaEE规范,收费的。
      8. JBOSS:JBOSS公司,大型的JavaEE服务器,支持所有的JavaEE规范,收费的(使用的时候是免费的,但是文档和其他的服务是收费的)。
      9. Tomcat:Apache基金 组织,中小型的JavaEE服务器,仅仅支持少量的JavaEE规范的servlet/jsp。开源的,免费的。

      *. JavaEE:Java语言在企业级开发使用的技术规范的总和,一共规定了13项大的规范。

      Tomcat:web服务器

      1. 下载:http://tomcat.apache.org/
      2. 安装:解压压缩包即可 *:安装目录建议不要有中文和空格
      3. 卸载:删除目录就行了
      4. 启动:
        1. bin/startup.bat 双击运行该文件即可
        2. 访问自己:浏览器输入:http://localhost:8080
        3. 访问别人:浏览器输入:http://别人的ip:8080
        4. 可能遇到的问题:
          1. 黑窗口一闪而过:
            1. 原因:没有正确配置JAVA_HOME环境变量
            2. 解决方案:正确配置JAVA_HOME环境变量
          2. 启动报错:
            1. 暴力:找到占用的端口号,并且找到对应的线程,杀死该线程
              1. cmd —-> netstat -ano
            2. 温柔:修改自身的端口号
              1. config/server.xml
              2. 修改
              3. 一般会将tomcat的默认端口号修改为80,80端口号是http协议的默认端口号。
                1. 好处:在访问时,就不用输入端口号
      5. 关闭:
        1. 正常关闭:
          1. bin/shutdown.bat
          2. ctrl+c
        2. 强制关闭:
          1. 点击启动窗口的X
      6. 配置:

        1. 部署项目的方式:
          1. 直接将项目放到webapps目录下即可。
            1. /项目名 :项目的访问路径 ——>虚拟路径
            2. 简化部署:将项目打成一个war包,再将war包放置webapps目录下。(war包会自动解压缩)
          2. 配置conf/server.xml文件
            1. 标签中配置
              1. docBase:项目存放的路径
              2. path:虚拟路径
          3. 在conf\Catalina\localhost创建任意名称的xml文件。在文件中编写
            1. *. 虚拟路径 :xml的文件名
        2. 动态项目:
          1. java动态项目的目录结构:
            1. 项目的根目录
              1. WEB-INF目录:
                1. web.xml:web项目的配置文件。
                2. classes目录:放置字节码文件的目录。
                3. lib目录:放置依赖的jar包。

                  十三、servlet

                  servlet:server applet

                  概念:运行在服务器端的小程序

      7. Servlet就是一个接口,定义了Java类浏览器访问到(tomcat识别)的规则。

      8. 将来我们自定义一个类,实现Servlet接口,重写方法。

        快速入门:

      9. 创建JavaEE项目

      10. 定义一个类,实现Servlet接口
        1. public class ServletDome1 implements Servlet
      11. 实现接口中的抽象方法
        1. 提供服务的方法 public void service(………)
      12. 配置Servlet

        1. web.xml ```xml demo1 cn.itcast.web.servlet.ServletDome1

        demo1 /demo1 ```

        执行原理

      13. 当服务器接受到客户端浏览器的请求后,会解析请求URL路径,获取访问的Servlet的资源路径

      14. 查找web.xml文件,是否有对应的标签内容。
      15. 如果有,则在找到对应的全类名。
      16. tomcat会将字节码文件加载进内存,并且创建其对象。
      17. 调用其方法。

        Servlet中的生命周期方法:

      18. 被创建:执行init方法,只执行一次。被创建时执行

        1. Servlet什么时候被创建?
          1. 默认情况下,第一次被访问时,Servlet被创建
          2. 可以配置执行Servlet的创建时机。
            1. 标签下配置
              1. 第一次访问时,创建的值为负数
              2. 在服务器启动时,创建的值为0或正整数
        2. Servlet的init方法,只执行一次,说明一个Servlet在内存中只存在一个对象,Servlet是单例的。
          1. 多个用户同时访问时,可能存在线程安全问题。造成高并发问题。
          2. 解决:尽量不要在Servlet中定义成员变量。即使定义了成员变量,也不要对其修改。
      19. 提供服务:执行service方法,执行多次。被访问时执行
        1. 每次访问Servlet时,Service方法都会被调用一次
      20. 被销毁:执行destory方法,只执行一次。被销毁时访问

        1. Servlet被销毁时执行。服务器关闭时,Servlet被销毁
        2. 只有服务器正常关闭时,才会执行destory方法。
        3. destory方法在Servlet被销毁之前执行,一般用于释放资源。

          Servlet3.0

          好处:

          支持注解配置。可以不需要web.xml了。

          步骤:

      21. 创建JavaEE项目,选择Servlet的版本3.0以上,可以不创建web.xml。

      22. 定义一个类,实现Servlet接口。
      23. 重写方法。
      24. 在类上使用@WebServlet注解,进行配置

        1. @WebServlet(“资源路径”)。

          Servlet的体系结构

      25. Servlet —-> 接口

      26. GenericServlet —-> 抽象类
        1. 将Servlet接口中其他的方法做了默认空实现,只将service()方法作为抽象。
      27. HttpServlet —-> 抽象类

        1. 对http协议的一种封装,简化操作
        2. 定义类继承HttpServlet
        3. 复写doGet/doPost方法

          Servlet相关配置

      28. urlpartten:Servlet访问路径

        1. 一个Servlet可以定义多个访问路径:@WebServlet({“/d1”,”dd2”,”ddd3”})
        2. 路径定义规则:
          1. /xxx
          2. /xxx/xxx:多层路径
          3. *.do

            IDEA与tomcat的相关配置

      29. IDEA会为每一个tomcat部署的项目单独建立的一份配置文件

        1. 查看控制台的log:Using CATALINA_BASE:”C:\Users\fqy.IntelliJIdea2018.1\system\tomcat_itcat”
      30. 工作空间项目 和 tomcat部署的web项目
        1. tomcat真正访问的是“tomcat部署的web项目”,“tomcat部署的web项目”对应着“工作空间项目”的web目录下的所有资源。
        2. WEB-INF目录下的资源不能直接被浏览器访问。
      31. 断点测试:使用“小虫子”启动dubug启动。

        十四、HTTP

        概念:Hyper Text Transfer Portocol 超文本传输协议

      32. 传输协议:定义了客户端和服务器端通信时,发送数据的格式

      33. 特点:
        1. 基于TCP/IP的高级协议。
        2. 默认端口号:80。
        3. 基于请求/响应模型的:一次请求对应一次响应。
        4. 无状态:每次请求之间都会建立新的链接。
      34. 历史版本

        1. 1.0:每次请求响应都会建立新的链接
        2. 1.1:复用链接

          请求消息数据格式

      35. 请求行

        1. 格式:请求方式 请求url 请求协议/版本 —> GET /login.html HTTP/1.1
        2. 请求方式:
          1. HTTP协议中有7种请求方式,常用的有2种
            1. GET:
              1. 请求参数在请求行中,在url后面。
              2. 请求的url长度有限制的
              3. 不太安全
            2. POST:
              1. 请求参数在请求体中。
              2. 请求的url长度没有限制的
              3. 相对安全
      36. 请求头
        1. 请求头名称:请求头值
        2. 常见的请求头
          1. User-Agent:浏览器告诉服务器,我访问你使用的的浏览器信息
            1. 可以在服务器端货去该头的信息,解决浏览器的兼容性的问题
          2. Referer:http://localhost/login.html
            1. 告诉服务器,我(当前请求)从哪里来?
              1. 作用:
                1. 防盗链:
                2. 统计工作:
      37. 请求空行
        1. 空行,就是用于分割POST请求的请求头和请求体。
      38. 请求体(正文)

        1. 封装POST请求消息的请求参数。

          十五、会话技术

          会话:

      39. 定义:一次会话中包含多次请求和响应。

        1. 一次会话:浏览器第一次给服务器资源发送请求,会话建立,直到有一方断开为止。
      40. 功能:再一次会话的范围内的多次请求间,共享数据。
      41. 方式:

        1. 客户端会话技术:Cookie
        2. 服务器端会话技术:Session

          Cookie:

      42. 概念:客户端会话技术,将数据保存到客户端。

      43. 快速入门:

        1. 使用步骤:

          1. 创建Cookie对象,绑定数据

            new Cookie(String name,String value);
            
          2. 发送Cookie对象

            response.addCookie(Cookie cookie);
            

            iii. 获取Cookie,拿到数据

            Cookie[] request.getCookie();
            
      44. 原理:

        1. 基于响应头set-cookie和请求头cookie实现
      45. cookie的细节:
        1. 一次可不可以发送多个cookie?
          1. 可以,可以创建多个Cookie对象,使用response调用多次addCookie方法发送cookie即可。
        2. cookie在浏览器中保存多长时间?
          1. 默认情况下,当浏览器关闭后,Cookie数据被销毁。
          2. 持久化存储:
            1. setMaxAge(int seconds)
              1. 正数:将Cookie数据写道硬盘的文件中。持久化存储。cookie的存活时间。
              2. 负数:默认值
              3. 零:删除cookie信息。
        3. cookie能不能存中文?
          1. 在tomcat8之前cookie中不能直接存储中文数据。
            1. 需要将中文数据转码——-一般采用URL编码(%E3)
          2. 在tomcat8之后cookie支持中文数据。
        4. cookie共享问题?
          1. 假设在一个tomcat服务器中部署了多个web项目,那么在这些web项目中cookie能不能共享?
            1. 默认情况下cookie不能共享
            2. setPath(String path):设置cookie的获取范围。默认情况下,设置当前的虚拟目录
              1. 如果要共享,则可以将path设置为”/“
          2. 不同的tomcat服务器间cookie共享问题?
            1. setDomain(String path):如果设置一级域名相同,那么多个服务器之间cookie可以共享
              1. setDomain(“.baidu.com”),那么tieba.baidu.com和news.baidu.com中的cookie可以共享。
      46. cookie的特点和作用:
        1. 特点:
          1. cookie存储数据在客户端浏览器
          2. 浏览器对于单个cookie的大小有限制(4kb)以及对同一个域名下的总cookie数量也有限制(20个)
        2. 作用:
          1. cookie一般用于存储少量的不太敏感的数据。
          2. 在不登录的情况下,完成服务器对客户端的身份识别。
      47. 案例:记住上一次访问时间
        1. 需求:
          1. 访问一个Servlet,如果是第一次访问,则提示:您好,欢迎首次访问。
          2. 如果不是第一次访问,则提示:欢迎回来,您上次访问时间为:显示时间字符串
        2. 分析:
          1. 可以采用Cookie来完成
          2. 在服务器中的Servlet判断是否有一个名为lastTime的cookie
            1. 有:不是第一次访问
              1. 响应数据:欢迎回来,您上次访问时间为:2021年2月27日 10:53:50
              2. 写回Cookie:lastTime=2021年2月27日 10:53:50
            2. 没有,是第一次访问
              1. 响应数据:你好,欢迎您首次访问
              2. 写回Cookie:lastTime=2021年2月27日 10:53:50
        3. 代码实现 ```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

      1. 概念:服务器端会话技术,在一次会话的多次请求共享数据,将数据保存在服务端的对象中。HttpSession
      2. 快速入门:
        1. 获取HttpSession对象:
          1. HttpSession session = request.getSession();
        2. 使用HttpSession对象:
          1. Object getAttribute(String name)
          2. void setAttribute(String name,String value)
          3. void removeAttribute(String name);
      3. 原理:
        1. session的实现是依赖于cookie的。
      4. 细节:
        1. 当客户端关闭后,服务器不关闭,两次获取session是否为同一个?
          1. 默认情况下不是。
          2. 如果需要相同。则可以创建Cookie,键为SESSIONID,设置最大存活时间,让cookie持久化保存。
        2. 客户端不关闭,服务器端关闭后,两次获取session是同一个吗?
          1. 不是同一个,但是要确保数据不丢失
            1. session的钝化:
              1. 在服务器正常关闭之前,将session对象序列化到硬盘上
            2. session的活化:
              1. 在服务器启动后,将session文件转化为内容中的session对象即可。
        3. session的失效时间?
          1. 服务器关闭
          2. session对象调用invalidate()。
          3. session默认失效时间30分钟
            1. 可以才web.xml配置失效时间,单位分钟
              1. 30
      5. session的特点
        1. session用于存储一次会话的多次请求的数据,存储在服务器端。
        2. session可以存储任意类型,任意大小的数据。
      6. session和cookie的区别:

        1. session存储数据在服务器端,cookie在客户端
        2. session没有数据大小限制,cookie有
        3. session数据安全,cookie相对不安全

          十六、MVC:开发模式

          概念:

      7. M:Model,模型

        1. 完成具体的业务操作。如:查询数据库,封装对象
      8. V:View,视图
        1. 展示数据
      9. C:Controller,控制器

        1. 获取用户输入
        2. 调用模型
        3. 将数据交给试图展示

          优缺点:

      10. 优点:

        1. 耦合性低,方便维护,可以利用分工协作
        2. 重用性高
      11. 缺点:
        1. 使项目结构变得复杂,对开发人员要求高。