web项目classNotFound异常

Beanutils使用报错:java.lang.NoClassDefFoundError: org/apache/commons/beanutils/BeanUtils

在web项目中出现类似classNotFound异常时,检查所需要的jar包是否放在WEB-INF/lib目录下,不是libs!

HTTP-request

1.HTTP协议

  • 概念:Hyber Text Transfer Protocal 超文本传输协议

  • 定义了客户端和服务器端通信时,发送数据的格式

  • 特点:

    1. 基于TCP/IP的高级协议
    2. 默认端口号80
    3. 基于请求/响应模型:一次请求对应一次响应
    4. 无状态:每次请求之间相互独立,不能交互数据
  • 历史版本

    • 1.0版本:每次请求都会重新建立连接
    • 1.1版本:复用连接

2.HTTP请求消息数据格式

  1. 请求行

    请求方式 请求url 请求协议/版本

    • GET
      1. 请求参数在请求行中,在url后
      2. 请求的url长度有限制
    • POST
      1. 请求参数在请求体中
      2. 请求的url长度没有限制
  2. 请求头:请求头名称:请求头值,键值对格式

    • Host:请求的主机
    • User-Agent:浏览器告诉服务器浏览器版本信息。可以在服务器端获取该头的信息,解决浏览器的兼容性问题
    • Accept:本浏览器可以接受的资源格式
    • Accept-Lanuage:支持语言环境
    • Accept-Encoding:压缩格式
    • Referer:告诉服务器,当前请求从哪里来。
      1. 防盗链
      2. 统计工作
  3. 请求空行

    空行,分割POST请求消息的请求头和请求体

  4. 请求体(正文)

    • 封装POST请求消息的请求参数

3.请求响应原理

  1. tomcat服务器会根据请求url中的资源路径,创建对应的servlet对象。
  2. tomcat服务器会创建request和response对象,request对象中封装请求消息数据。
  3. tomcat将request和response两个对象传递给service方法,并且调用service
  4. 在service方法中可以通过request对象获取请求消息数据通过response对象设置响应消息数据。
  5. 服务器在给浏览器做出响应之前,会从response对象中取设置的响应消息数据。

4.request对象

4.1request对象继承体系结构

  • ServletRequest:接口
  • HttpServletRequest:接口,继承ServletRequest
  • org.apache.catalina.connector.RequestFacade:实现HttpServletRequest接口

4.2request功能

  • 获取请求消息数据

    1. 获取请求行数据

      eg. GET /test/demo?name=zhangsan HTTP/1.1

      • 获取请求方式:String getMethod(); GET

      • 获取虚拟目录:String getContextPath(); /test

      • 获取Servlet路径:String getServletPath(); /demo

      • 获取GET方式请求参数:String getQueryString(); name=zhangsan

      • 获取请求URI(统一资源标识符):String getRequestURI(); /test/demo

        获取请求URL(统一资源定位符):String getRequestURL(); http://localhost:8080/test/demo

      • 获取请求协议:String getProtocol: HTTP/1.1

      • 获取客户机的IP地址:String getRemoteAddr();

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    @WebServlet("/requestdemo1")
    public class requestdemo1 extends HttpServlet {
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

    }

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    System.out.println(request.getMethod());
    System.out.println(request.getContextPath());
    System.out.println(request.getServletPath());
    System.out.println(request.getQueryString());
    System.out.println(request.getRequestURI());
    System.out.println(request.getRequestURL());
    System.out.println(request.getProtocol());
    System.out.println(request.getRemoteAddr());
    }
    }
    /*输入的链接:http://localhost:8080/test/requestdemo1?name=zhangsan
    GET
    /test
    /requestdemo1
    name=zhangsan
    /test/requestdemo1
    http://localhost:8080/test/requestdemo1
    HTTP/1.1
    0:0:0:0:0:0:0:1
    */
    1. 获取请求头数据
      • String getHeader(String name):通过请求头的名称获取请求头的值
      • Enumeration < String >getHeaderNames():获取所有的请求头名称
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    @WebServlet("/requestdemo2")
    public class requestdemo2 extends HttpServlet {
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    //获取请求头数据
    //获取所有请求头名称
    Enumeration<String> headerNames = request.getHeaderNames();
    while (headerNames.hasMoreElements()){
    String name = headerNames.nextElement();
    //根据名称获取请求头的值
    String value = request.getHeader(name);
    System.out.println(name+"---->"+value);
    }
    //简单防盗链
    String referer = request.getHeader("referer");
    System.out.println(referer);
    // http://localhost/test/requestdemo2
    if (referer!=null){
    if (referer.contains("/test")){
    System.out.println("播放");
    }else{
    System.out.println("不播放");
    }
    }
    }
    }
  1. 获取请求体数据

    • 请求体:只有POST请求方式,才有请求体,在请求体中封装了POST请求的请求参数

    • 步骤

      (1) 获取流对象,字节流或字符流

      • BufferedReader getReader():获取字符输入流,只能操作字符数据
      • ServletInputStream():获取字节输入流,可以操作所有数据类型
      1
      2
      3
      4
      5
      6
      7
      8
      9
      protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
      //获取请求消息体
      BufferedReader br = request.getReader();
      //读取数据
      String line = null;
      while ((line= br.readLine())!=null){
      System.out.println(line);
      }
      }

      (2) 从流对象中拿数据

  • 获取请求参数通用方式

    1. String getParameter(String name):根据参数名称获取参数值 username=hxx

    2. String[] getParameterValues(String name):根据参数名称获取参数值的数组 hobby=xx&hobby=yy

    3. Enumeration< String >getParameterNames():获取所有请求的参数名称

    4. Map< String,String[] > getParameterMap():获取所有参数的map集合

    5. 中文乱码问题:

      get方式:tomcat8已经将get方式乱码问题解决

      post方式:会乱码,需要在获取参数前设置编码 request.setCharacterEncoding(“utf-8”);

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    //设置流的编码,要和所对应的页面格式相同
    request.setCharacterEncoding("utf-8");
    //POST 请求参数
    //根据参数名称获取参数值
    String username = request.getParameter("username");
    System.out.println(username);

    String[] hobbies = request.getParameterValues("hobby");
    for (String hobby : hobbies) {
    System.out.println(hobby);
    }

    //获取所有请求参数的名称
    Enumeration<String> parameterNames = request.getParameterNames();
    while(parameterNames.hasMoreElements()){
    //参数名字
    String name = parameterNames.nextElement();
    //根据参数名字获取参数值
    String parameter = request.getParameter(name);
    System.out.println(name+"---->"+parameter);
    }

    //获取所有参数的map集合
    Map<String, String[]> parameterMap = request.getParameterMap();
    //获取键值
    Set<String> keySet = parameterMap.keySet();
    //根据键值获取值
    for (String name : keySet) {
    String[] values = parameterMap.get(name);
    for (String value : values) {
    System.out.println(value);
    }
    }
    }
  • 请求转发:一种在服务器内部的资源跳转方式

    1. 通过request对象获取请求转发器对象

      RequestDispatcher getRequestDispacher(String path):参数为转发资源的路径

    2. 使用RequestDispatcher对象进行转发

      forward(ServletRequest request, ServletResponse response)

    1
    request.getRequestDispatcher("/requestdemo5").forward(request,response);
    1. 特点
      • 浏览器地址栏路径不发生变化
      • 只能转发到当前服务器内部资源中
      • 转发是一次请求
  • 共享数据

    • 域对象:一个有作用范围的对象,可以在范围内共享数据
    • request域:代表一次请求,一般用于请求转发的多个资源中共享数据
    • 方法
      1. setAttribute(String name,Object obj):存储数据
      2. Object setAttribute(String name):通过键获取值
      3. removeAttribute(String name):通过键移除键值对
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    @WebServlet("/requestdemo4")
    public class requestdemo4 extends HttpServlet {
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    //设置request域
    request.setAttribute("msg","hxx");
    //转发到demo5
    request.getRequestDispatcher("/requestdemo5").forward(request,response);
    }
    }

    @WebServlet("/requestdemo5")
    public class requestdemo5 extends HttpServlet {
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    System.out.println("demo5--------");
    //获取request域值
    Object msg = request.getAttribute("msg");
    System.out.println(msg);

    }
    }
  • 获取ServletContext对象

    • servletContext getServletContext()

Servlet基本原理和配置

1.Servlet概述

  1. 概念:server applet,运行在服务器端的小程序

    • servlet是一个接口,定义了Java类被浏览器访问到(Tomcat识别)的规则
    • 自定义类,实现servlet接口,复写方法
  2. 简单项目

    • 创建按JavaEE项目

    • 定义一个类,实现servlet接口

      • 注:将tomcat安装目录下的bin/servlet-api.jar包导入项目中
      • public class servletdemo1 implements Servlet
    • 实现接口中的抽象方法

    • 在web.xml文件中配置servlet ,写在根标签里

      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      11
      12
      <servlet>
      <!--给servlet取名,任意 -->
      <servlet-name>demo</servlet-name>
      <!-- 指明servlet路径,包名.类名 -->
      <servlet-class>cn.hxx.servletdemo1</servlet-class>
      </servlet>
      <servlet-mapping>
      <!--servlet映射,必须与servlet-name同名 -->
      <servlet-name>demo</servlet-name>
      <!--这是浏览器中输入的访问该servlet的url-->
      <url-pattern>/hxx</url-pattern>
      </servlet-mapping>
    • servlet注解配置方法

      在实现类前面加注解 @WebServlet(资源路径)

2.执行原理

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

  2. 查找web.xml文件,是否有对应的 <url-pattern>标签体内容

  3. 如果有,则再找到对应的 <servlet-class>全类名

  4. tomcat将字节码文件加载进内存,并且创建其对象

  5. 调用方法

3.生命周期

  1. 被创建:执行init方法,只执行一次
    • 默认情况下,第一次被访问时,servlet被创建
    • 可以配置执行Servlet的创建时机:在web.xml中 <servlet> 标签体中配置
      1.第一次被访问时,创建,<load-on-startup> 的值为负数
      2.在服务器启动时,创建 ,<load-on-startup> 为0或者正数
    • servlet的init方法,只执行一次,说明一个servlet在内存中只存在一个对象,servlet是单例的。多个用户同时访问时可能存在线程安全问题,所以尽量不要在servlet定义成员变量。即使定义了成员变量,也不要修改值。
  2. 提供服务:执行service方法,执行多次
  3. 被销毁:执行destroy方法,执行一次。服务器正常关闭时,servlet被销毁。在销毁之前被执行,用于释放资源。
  4. getServletInfo:获取servlet的一些信息:版本、作者等等
  5. getServletConfig:获取ServletConfig对象(servlet的配置对象)

4. IDEA、tomcat、servlet相关配置

  1. 启动tomcat控制台或命令窗口中文乱码,将tomcat安装目录/conf/logging.properties中的所有UTF-8修改为gbk格式

  2. IDEA会为每一个tomcat部署的项目单独简历一份配置文件

    • 查看控制台的log:Using CATALINA_BASE: “C:\Users\97130\AppData\Local\JetBrains\IntelliJIdea2020.2\tomcat\Unnamed_tomcat_2”
  3. 工作空间项目 和tomcat部署的web项目

    • tomcat真正访问的是“tomcat部署的web项目”,其存放在整个项目的out\artifacts目录

    • tomcat部署的web项目对应着“工作空间项目”的web目录下的所有资源

    • tomcat断点调试

5.servlet体系结构

  • servlet —- 接口
  • GenericServlet :将servlet接口中其他的方法做了默认空实现,只将service()方法作为抽象方法。在定义servlet类时,可以直接集成GenericServlet类,实现service方法
1
2
3
4
5
6
7
@WebServlet("/demo2")
public class servletdemo2 extends GenericServlet {
@Override
public void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException {
System.out.println("hello demo2.service....");
}
}
  • HttpServlet:对HTTP协议的一种封装,简化操作
    1. 定义类继承HttpServlet
    2. 复写doGet或doPost
1
2
3
4
5
6
7
8
9
10
11
@WebServlet("/demo3")
public class servletdemo3 extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
System.out.println("demo3 doGet......");
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
System.out.println("demo3 doPost......");
}
}
  • urlpattern:servlet访问路径
    1. 一个servlet可以定义多个访问路径:@WebServlet({“/demo3”,”/dd3”})
    2. 路径定义规则
      • /xxx
      • /xxx/xxx:多层路径,目录结构
      • *.后缀名

tomcat项目部署

1.web服务器软件

  • 服务器:安装了服务器软件的计算机

  • web服务器:接收用户请求,处理请求,做出响应

  • 在web服务器中可以部署web项目,让用户通过浏览器来访问这些项目

  • web容器:动态资源的运行环境

  • 常见的Java相关的web服务器软件

    weblogic:Oracle公司,大型的Javaee服务器,支持所有的javaee规范

    websphere:IBM公司

    JBOSS:

    tomcat:Apache组织、servlet/JSP

2.tomcat

  1. 启动:双击bin目录下的startup.bat

    • 若出现黑窗口一闪而过是因为没有正确配置JAVA_HOME环境变量
    • 启动报错,找到占用的端口号和对应的进程,杀死该进程。
      • 在cmd中输入netstat -ano,找到 IP:端口号 如127.0.0.1:8080,以及对应的PID,在任务管理器中将对应的进程关闭
      • 修改自身的端口号:在tomcat安装目录中的conf目录下找到sever.xml文件,将其中port进行修改
  2. 访问:在浏览器中输入http://127.0.0.1:8080/ 或者http://localhost:8080/

  3. 关闭

    • 双击bin目录下的shutdown.bat
    • 或者按ctrl+c
  4. 配置:部署项目的方式

    • 直接将项目放到tomcat安装目录下的webapps目录下。

      • 例如:创建hello文件夹,文件夹下编写一个helloworld.html文件,启动tomcat,在浏览器中输入localhost:8080/hello/helloworld.html,就可以访问这个静态资源文件。

        /hello:项目的访问路径—>虚拟目录

    • 将项目工程直接打包成war包,放入webapps目录下,浏览器访问,tomcat会自动解压该包。如果没有的话,就重启一下tomcat

      • 例如将上面的helloworld.html压缩成hello.war文件,放到webapps目录下,解压后出现hello目录,下面存放helloword.html
    • 配置conf/sever.xml文件

      <Host> 标签体中配置,其中docBase代表项目存放的路径,path为虚拟目录

      1
      2
      <!--部署项目-->
      <Context docBase="E:\JAVA\JavaScript\HTML\hello" path="/hxx" />
      • 例如:上面在hello文件夹中存放了helloworld.html文件,启动tomcat后,在浏览器中输入:localhost:8080/hxx/helloworld.html
    • 热部署方式:在conf\Catalina\localhost目录下创建任意名称的xml文件,在文件中编写 <Context docBase="E:\JAVA\JavaScript\HTML\hello" /> ,同样的docBase是项目的位置,虚拟目录是xml文件的名字。

  • 例如创建hxx.xml,然后再上面docBase目录下编写一个helloworld.html文件,启动tomcat,再浏览器中输入:localhost:8080/hxx/helloworld.html

3.与IDEA集成,创建部署web项目

  • 静态项目和动态项目

    • 目录结构

      Java动态项目的目录结构:

      –项目根目录

      ​ –WEB-INF目录

      ​ –web.xml:web项目的核心配置文件,只有这个文件的是静态项目

      ​ –classes:防止字节码文件目录

      ​ –lib目录:放置以来的jar包

3.1在IDEA2020 项目中中加入tomcat服务

  • 点击项目菜单栏中的Edit/Add Configurations,在Templates中选择Tomcat Sever下的 Local,并在deployment中添加Artifacts

3.2创建javaweb项目

  • 创建一个空项目,新建一个java module:test,右键test,选择add framework support,添加web application

  • web项目目录结构和运行

3.3 热部署

Jsoup解析器

1.快速入门

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
public class demo1 {
public static void main(String[] args) {
//获取Document对象,根据xml文档获取
//1.获取student.xml的path
String path = demo1.class.getClassLoader().getResource("student.xml").getPath();
//2.解析xml文档,加载文档进内存,获取dom树
try {
Document document = Jsoup.parse(new File(path),"utf-8");
//3.获取元素对象 name,返回值类型Elements继承了ArrayList,是一个集合
Elements elements = document.getElementsByTag("name");
System.out.println(elements.size());
Elements elementstu = document.getElementsByTag("student");
System.out.println(elementstu.size());
//获取第一个name的element对象
Element element = elements.get(0);
//获取数据
String name = element.text();
System.out.println(name);
} catch (IOException e) {
e.printStackTrace();
}
}
}

2.对象

  1. Jsoup:工具类,可以解析html和xml文档,返回Document

    • parse(File in,String charsetName):解析xml或html文件
    • parse(String str):解析xml或html字符串
    • parse(URL url,int timeoutMillis):通过网络路径获取指定的xml或html文档
  2. Document:文档对象,代表文档中的dom树

    • getElementById(String id):根据id属性值获取唯一元素对象

    • getElementsByTag(String tagName):根据元素标签名称获取元素对象集合

    • getElementsByAttribute(String key):根据元素属性名称获取元素对象集合

    • getElementsByAttribute(String key,String value):根据属性名和属性值获取元素对象集合

  3. Elements:元素Element对象的集合

    • 获取子元素对象
  4. Element:元素对象

    • 获取属性值
      • String attr(String key)
    • 获取文本内容
      • String text():获取文本内容
      • html():获取标签体的所有内容,包括子标签
  5. Node:节点对象

    • 是Document和Element的父类

3.查询方式

  • selector:选择器

    • Elements select(String cssQuery)
    • Jsoup文档中参考selector类中定义的语法
    1
    Elements select = document.select("student[number='stu1'] > age");
  • XPath:

    • XML路径语言,确定XML文档中某部分位置的语言
    • 导入jar包
    • 根据document对象,创建JXDocument对象
    • 查询w3cshool参考手册,使用xpath的羽凡完成查询
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
public class demo3 {
public static void main(String[] args) throws IOException, XpathSyntaxErrorException {
String path = demo3.class.getClassLoader().getResource("student.xml").getPath();
Document document = Jsoup.parse(new File(path), "gbk");
//根据document对象,创建JXDocument
JXDocument jxDocument = new JXDocument(document);
//结合XPath语法查询
//查询所有的student标签
List<JXNode> jxNodes = jxDocument.selN("//student");

//查询student下所有的name标签
List<JXNode> nodes = jxDocument.selN("//student/name");

//查询student下有id属性的name标签
List<JXNode> jxNodes1 = jxDocument.selN("//student/name[@id]");

//查询student下有id属性的name标签id属性值为name1
List<JXNode> jxNodes2 = jxDocument.selN("//student/name[@id='name1']");

}
}

XML

1. 概述

  1. 概念:Extensive markup Language,可扩展标记语言
  2. 可扩展:标签可自定义
  3. 功能:存储数据,可做配置文件,可在网络中传输
  4. xml和html的区别
    • xml标签自定义,html标签预定义
    • xml语法严格
    • xml存储数据,html展示数据

2.语法

  • 基础语法

    • 文档的后缀名为 .xml
    • xml第一行必须定义为文档声明
    • xml文档中有且仅有一个根标签
    • 属性值必须使用引号引起来
    • 标签必须正确关闭
    • 标签名称区分大小写
    1
    2
    3
    4
    5
    6
    <?xml version='1.0'?>
    <users>
    <user id="user1">
    <name>hxx</name>
    </user>
    </users>
  • 组成部分

    • 文档声明

      • 格式:<?xml 属性列表 ?>
      • 属性列表
        • version:版本号,必须写
        • encoding:编码方式。告知解析引擎当前文档使用的字符集,默认ISO-8859-1
        • standalone:是否独立。取值yes no,表示是否依赖与其他文件
    • 指令:<?xml-stylesheet type="text/css" href="../CSS/a/css"?>

    • 标签

      • 名称可以包含字母数字和其他的字符
      • 名称不能以数字或者标签符号开始
      • 名称不能以字母xml、XML等等开始
      • 不能包含空格
    • 属性

    • 文本内容

      • CDATA区:在该区域中的数据会被原样展示

        格式:<![CDATA[文本内容]>

3.约束

  • 规定xml文档的书写规则

  • 分类

    • DTD

      • 外部DTD:将约束文件定义在外部的dtd文件中

        • 引入本地DTD文件:<!DOCTYPE 根标签名 SYSTEM "dtd文件位置">
        • 引入网络中DTD文件:<!DOCTYPE 根标签名 PUBLIC "dtd文件名字" "dtd文件位置的url">
      • 内部DTD: <!DOCTYPE 根标签[内容]>

      • student.dtd

      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      <!ELEMENT students (student*) >
      <!--*号代表出现0次或多次,+号代表至少出现1次
      根标签students,子标签student-->
      <!ELEMENT student (name,age,sex) >
      <!--#PCDATA代表字符串-->
      <!ELEMENT name (#PCDATA) >
      <!ELEMENT age (#PCDATA) >
      <!ELEMENT sex (#PCDATA) >
      <!--student标签有ID属性,且必须有-->
      <!ATTLIST student number ID #REQUIRED>
      • xml文件
      1
      2
      3
      4
      5
      6
      7
      8
      9
      <?xml version='1.0' encoding='gbk'?>
      <!DOCTYPE students SYSTEM "student.dtd">
      <students>
      <student number="stu1">
      <name>hxx</name>
      <age>22</age>
      <sex></sex>
      </student>
      </students>
    • schema:复杂的约束技术,文件后缀名 .xsd

      • 引入约束文件

        根元素

        引入xsi前缀:xmlns:xsi = “”

        引入xsd文件命名空间,xsi:schemaLocattion=””

        为每一个xsd约束声明一个前缀,作为标识:xmlns=””

4.解析

  • 操作xml文档,将文档中的数据读取到内存中
  • 解析方式:
    • DOM:将标记语言一次性加载进内存,在内存中形成一颗dom树
      • 优点:操作方便,可以对文档进行CRUD所有操作
      • 缺点:占内存
    • SAX:逐行读取,基于事件驱动
      • 优点:占内存小
      • 缺点:只能读取,不能增删改
  • 常见解析器
    • JAXP:sun公司提供的解析器,支持dom和sax两种思想
    • DOM4J
    • Jsoup:java的HTML解析器
    • PULL:Android操作系统内置的解析器,sax方式

BootStrap

1. BootStrap概念

  • 一个前端开发的框架,基于HTML、CSS、JavaScript。
  • 定义了很多的CSS样式和js插件
  • 响应式布局:Bootstrap 的响应式 CSS 能够自适应于台式机、平板电脑和手机。

2.快速入门

3.响应式布局

  • 实现:依赖于栅格系统,每一行平均分成12个各自,可以指定元素占几个

  • 步骤

    1. 定义容器

      容器分类:

      • container
      • container-fluid:100%宽度
    2. 定义行。样式:row

    3. 定义元素。样式:col-设备代号-格子数目

      超小屏幕 手机 (<768px) 小屏幕 平板 (≥768px) 中等屏幕 桌面显示器 (≥992px) 大屏幕 大桌面显示器 (≥1200px)
      .col-xs- .col-sm- .col-md- .col-lg-
  • 注意点

    • 一行中如果格子数目超过12,则超出部分自动换行、
    • 栅格类属性可以向上兼容。栅格类适用与屏幕宽度大于或等于分界点大小的设备
    • 如果真实设备宽度小于设备栅格类属性的设备代码的最小值,会一个元素占满一整行
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
<!DOCTYPE html>
<html lang="zh-CN">
<head>
<meta charset="utf-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1">
<!-- 上述3个meta标签*必须*放在最前面,任何其他内容都*必须*跟随其后! -->
<title>Bootstrap HelloWorld</title>

<!-- Bootstrap -->
<link href="css/bootstrap.min.css" rel="stylesheet">


<!-- jQuery (Bootstrap 的所有 JavaScript 插件都依赖 jQuery,所以必须放在前边) -->
<script src="js/jquery-3.5.1.min.js"></script>
<!-- 加载 Bootstrap 的所有 JavaScript 插件。你也可以根据需要只加载单个插件。 -->
<script src="js/bootstrap.min.js"></script>
<style>
.inner{
border:1px solid red;
}

</style>
</head>
<body>
<!--1.定义容器-->
<div class="container">
<!--2.定义行-->
<div class="row">
<div class="col-md-4 inner">栅格</div>
<div class="col-md-4 inner">栅格</div>
<div class="col-md-4 inner">栅格</div>
</div>

</div>

</body>
</html>

4.css样式和js插件

  1. css样式

    • 按钮:class=”btn btn-default”
    • 图片:class=”img-responsive” 在任意设备中图片宽度都是100%
    • 表格
    • 表单
  2. 组件

    导航条

  3. 插件

BOM

1. 概念

  • Browser Object Model 浏览器对象模型,将浏览器的各个组成部分封装成对象。

2.组成

  • Window:窗口对象

    1. 创建

    2. 方法

      • 与弹出框有关的方法:
        alert() 显示带有一段消息和一个确认按钮的警告框。
        confirm() 显示带有一段消息以及确认按钮和取消按钮的对话框。

        • 如果用户点击确定按钮,则方法返回true
        • 如果用户点击取消按钮,则方法返回false

        prompt() 显示可提示用户输入的对话框。

        • 返回值:获取用户输入的值
      • 与打开关闭有关的方法:
        close() 关闭浏览器窗口。谁调用我 ,我关谁
        open() 打开一个新的浏览器窗口,返回新的Window对象

      • 与定时器有关的方式
        setTimeout() 在指定的毫秒数后调用函数或计算表达式。

        * 参数:
            1. js代码或者方法对象
            2. 毫秒值
        • 返回值:唯一标识,用于取消定时器

        clearTimeout() 取消由 setTimeout() 方法设置的 timeout。

        setInterval() 按照指定的周期(以毫秒计)来调用函数或计算表达式。
        clearInterval() 取消由 setInterval() 设置的 timeout。

    3. 属性:

      1. 获取其他BOM对象:
        history
        location
        Navigator
        Screen:
      2. 获取DOM对象
        document
    4. 特点

      • Window对象不需要创建可以直接使用 window使用。 window.方法名();
      • window引用可以省略。 方法名();
  • Navigator:浏览器对象

  • Screen:显示器屏幕对象

  • History:历史记录对象

    1. 创建(获取):

      1. window.history
      2. history
    2. 方法:

      • back() 加载 history 列表中的前一个 URL。
      • forward() 加载 history 列表中的下一个 URL。
      • go(参数) 加载 history 列表中的某个具体页面。
        • 参数:
          • 正数:前进几个历史记录
          • 负数:后退几个历史记录
    3. 属性:

      • length 返回当前窗口历史列表中的 URL 数量。
  • Location:地址栏对象

    1. 创建(获取):

      • window.location

      • location

    2. 方法:

      • reload() 重新加载当前文档。刷新
    3. 属性

      • href 设置或返回完整的 URL。

事件

1. 事件简单学习

  • 功能:某些组件被执行了某些操作后,触发某些代码的执行。
    • 事件源:组件。如按钮,文本输入框等
    • 监听器:代码
    • 注册监听:将事件,事件源,监听器结合在一起。当事件源上发生了某个事件则触发执行某个监听器代码。
  • 如何绑定事件
    1. 直接在html标签上,指定事件的属性(操作),属性值就是js代码
      • 事件:onclick单击事件
    2. 通过JS获取元素对象,指定事件属性,设置一个函数
1
2
3
4
5
6
7
8
9
10
<img src="../img/off.gif" alt="开灯" id="light1" onclick="alert('我被1点了')">
<img src="../img/off.gif" alt="开灯" id="light2" onclick="fun()">
<img src="../img/off.gif" alt="开灯" id="light3">
<script>
function fun(){
alert('我被点了')
}
var light3 = document.getElementById("light3");
light3.onclick = fun;
</script>

2.常见事件

  1. 点击事件:

    • onclick:单击事件

    • ondblclick:双击事件

  2. 焦点事件

  • onblur:失去焦点

    一般用于表单校验

  • onfocus:元素获得焦点。

    1
    2
    3
    4
    5
    6
    7
    <script>
    window.onload = function () {
    document.getElementById("username").onblur=function () {
    alert("失去焦点");
    }
    }
    </script>
  1. 加载事件:
  • onload:一张页面或一幅图像完成加载。
  1. 鼠标事件:
  • onmousedown 鼠标按钮被按下。
    • 定义方法时,定义一个形参,接收event对象
    • event对象的button属性可以获取鼠标按钮键被点击
  • onmouseup 鼠标按键被松开。
  • onmousemove 鼠标被移动。
  • onmouseover 鼠标移到某元素之上。
  • onmouseout 鼠标从某元素移开。
  1. 键盘事件:

    • onkeydown 某个键盘按键被按下。

      • event对象的keyCode属性为接受的键盘的字符,可接受判断是否为回车进行表单提交
    • onkeyup 某个键盘按键被松开。

    • onkeypress 某个键盘按键被按下并松开。

  2. 选择和改变

  3. onchange 域的内容被改变。

    • 下拉列表中应用,比如省市区三级选择
  4. onselect 文本被选中。

  5. 表单事件:

  6. onsubmit 确认按钮被点击。

    • 可以组织表单提交,方法返回false时阻止提交
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    <form action="#" id="form"onclick="return check()">
    <input type="text" id="username"placeholder="请输入用户名">
    <input type="submit"value="提交">
    </form>
    <script>
    function check(){
    return false;
    }
    document.getElementById("form").onsubmit = function () {
    return false;
    }
    </script>
  7. onreset 重置按钮被点击。