【Java系列笔记012】JavaWeb(三)第七、八、九章

第七章:Ajax和JSON

第一节:实现Ajax方式

1.1 Ajax概念

Ajax:ASynchronous JavaScript And XML:异步的JavaScript和XML,是一种在无需重新加载整个页面的情况下,能够更新部分网页的技术。通过在后台与服务器进行少量数据交换,Ajax可以使网页实现异步更新,这意味着可以在不重新加载整个网页的情况下,对网页的某部分进行更新。传统的网页如果需要更新内容,必须重新加载整个页面

作用:提升用户的体验

**异步和同步:**建立在客户端和服务器端相互通信的基础上

**同步:**客户端必须等待服务器端的响应,在等待的期间客户端不能做其他操作

**异步:**客户端不需要等待服务器端的响应,在等待的期间客户端可以做其他操作

在这里插入图片描述

1.2 实现方式
  1. 原生的JS实现方式(了解)
//定义方法
        function fun(){
            //发送异步请求
            //1.创建核心对象
            var xmlhttp;
            //兼容性
            if (window.XMLHttpRequest){
                //IE7+,Firefox,Chrome,Safari
                xmlhttp=new XMLHttpRequest();
            }
            else {
                //IE6,IE5
                xmlhttp=new ActiveXObject("Microsoft.XMLHTTP")
            }
            //2.建立连接
            /*
            参数:1.请求方式:get、post
            get方式,请求参数在url中拼接,send方法为空参
            post方式,请求参数在send方法中定义
            2.请求的url路径
            3.同步或异步请求(true:异步   false:同步)
            * */
            xmlhttp.open("GET","test1.txt",true)
            //3.发送请求
            xmlhttp.send()
            //4.接收并处理来自服务器的响应结果
            //获取方式:xmlhttp.responseText
            //什么时候获取?当服务器响应成功后再获取

            //当xmlhttp对象的就绪状态改变时触发事件onreadystatechange
            xmlhttp.onreadystatechange=function (){
                //判断readystate就绪状态是否为4,判断status响应状态码是否为200
                if (xmlhttp.readyState==4&&xmlhttp.status==200){
                    //获取服务器的响应结果
                    var responseText=xmlhttp.responseText;
                    alert(responseText)
                }
            }

  1. Jquery实现方式

    1. $.ajax()

      语法:$.ajax(url,[settings]) 一般使用$.ajax({})

      $.ajax({
          url:"ajaxServlet",//请求路径
          type:"post",//请求方式
          //第一种data:"username=jack&&age=23"//请求参数
          data:{"username":"jack","age":"23"},//推荐这种格式
          success:function (data){
              alert(data)
          },//响应成功后的回调函数
          error:function(){
              alert("出错了。。。")
          },//表示如果请求出现错误,会执行的函数
          dataType:"text"//设置接收到的响应数据的格式
      })
      
    2. $.get()

      语法:$.get(url,[data],[callback],[type])

      参数:

      • url:请求路径
      • data:请求参数信息
      • callback:回调函数
      • type:响应结果的类型
      $.get("ajaxServlet",{username: "rose"},function (data){
          alert(data)
      },"text")
      
    3. $.post()

      $.post("ajaxServlet",{username: "rose"},function (data){
          alert(data)
      },"text")
      

第二节:JSON基础语法

2.1 概念

JSONJavaScript Object Notation JavaScript对象表示法

JSON 现在多用于存储和交换文本信息的语法,进行数据的传输。类似 XML。

JSON 比 XML 更小、更快,更易解析。

2.2 语法
  1. 基本规则

    数据在名称/值对中:Json数据是由键值对构成的

    • 键用引号引起来,单双都行,也可以不使用引号
    • 值的取值类型:
      • 数字(整数或浮点数)
      • 字符串(在双引号中)
      • 逻辑值(true或false)
      • 数组(在方括号中)
      • 对象(在花括号中) {"address",{"province":"陕西",...}}
      • null

    **数据由逗号分隔:**多个键值对由逗号分隔

    花括号保存对象:使用{}定义json格式

    方括号保存数组:[]

    //1.定义基本格式
    var Person={"name":"张三",age:20,"gender":true}
    alert(Person)
    //2.嵌套格式 {}-->[]
    var persons={
        "person":[
            {name:"张三",age:23,gender:true},
            {name:"李四",age:24,gender:true},
            {name:"王五",age:25,gender:false}
        ]
    };
    //3. 嵌套格式 []-->{}
    var ps=[
        {name:"张三",age:23,gender:true},
        {name:"李四",age:24,gender:true},
        {name:"王五",age:25,gender:false}
    ]
    
  2. 获取数据

    1. json对象.键名
    2. json对象[“键名”]
    3. 数组对象[索引]
    //获取name的值
    var name=Person.name;
    var name2=Person["name"];
    var name3=persons.person[2].name;
    
  3. 遍历

    1. 集合遍历
    var persons={
        "person":[
            {name:"张三",age:23,gender:true},
            {name:"李四",age:24,gender:true},
            {name:"王五",age:25,gender:false}
        ]
    };
    //遍历
    //获取persons对象中所有的键和值
    for (var i = 0; i < persons.length; i++) {
        var p=persons[i];
        for (var pKey in p) {
            alert(pKey+":"+p[pKey])
        }
    }
    
    1. 对象遍历
    var ps=[
        {name:"张三",age:23,gender:true},
        {name:"李四",age:24,gender:true},
        {name:"王五",age:25,gender:false}
    ]
    for (var psKey in ps) {
        ps[psKey]
    }
    
2.3 Json数据和Java对象的相互转换

Json解析器:

  • 常见的解析器:Jsonlib,Gson,fastjson,jackson
  1. Json转为Java对象

    1. 导入jackson的相关jar包

    2. 创建Jackson核心对象 ObjectMapper

    3. 调用ObjectMapper的相关方法进行转换

      1. readValue(json字符串数据,Class)
      //1.初始化json字符串
      String json="{\"gender\":\"男\",\"name\":\"张三\",\"age\":\"23\"}";
      //2.创建ObjectMapper对象
      ObjectMapper mapper=new ObjectMapper();
      Person person=mapper.readValue(json,Person.class);
      System.out.println(person);
      
  2. Java对象转为Json

    1. 使用步骤

      1. 导入jackson的相关jar包

      2. 创建Jackson核心对象 ObjectMapper

      3. 调用ObjectMapper的相关方法进行转换

        1. 转换方法:

          writeValue(参数1,参数2):

          • 参数1:File:将obj对象转换为JSON字符串,并保存到指定文件中
          • Writer:将obj对象转换为JSON字符串,并将JSON数据填充到字符输出流中
          • OutputStream:将obj对象转换为JSON字符串,并将JSON数据填充到字节输出流中
          • writeValueAsString(obj):将对象转为json字符串
        2. 注解:

          1. @JsonIgnore:排除属性

          2. @JsonFormat:属性值的格式化

            @JsonFormat(pattern="yyyy-MM-dd")

          3. 复杂的Java对象转换

            1. **List:**数组
            2. **Map:**对象格式一致
      //1.创建Person对象
      Person person=new Person("张三",23,"男");
      //2.创建Jackson的核心对象 ObjectMapper
      ObjectMapper mapper=new ObjectMapper();
      //3.调用方法转换
      /**
       * 转换方法:
       * writeValue(参数1,参数2):
       * 参数1:File:将obj对象转换为JSON字符串,并保存到指定文件中
       *       Writer:将obj对象转换为JSON字符串,并将JSON数据填充到字符输出流中
       *       OutputStream:将obj对象转换为JSON字符串,并将JSON数据填充到字节输出流中
       * writeValueAsString(obj):将对象转为json字符串
       */
      String json=mapper.writeValueAsString(person);
      System.out.println(json);
      //writeValueAsString(obj) 将数据写到D://a.txt中
      mapper.writeValue(new File("d://a.txt"),person);
      //writeValueAsString(obj) 将数据关联到Write中
      mapper.writeValue(new FileWriter("d://b.txt"),person);
      
      //@JsonIgnore
      @JsonFormat(pattern = "yyyy-MM-dd")
      private Date birthday;
      

案例:

校验用户名是否存在

  1. 服务器响应的数据,在客户端使用时,要想当作json数据格式使用
    1. $.get(type):将最后一个参数type指定为"json"
    2. 在服务器端设置MIME类型:response.setContentType("application/json;charset=utf-8");

第八章:Redis

第一节: Redis环境搭建

1.1 概念

Redis:是一种高性能的NOSQL系列的非关系型数据库,用作缓存

关系型数据库:

  1. 数据之间有关联关系
  2. 数据存储在硬盘的文件上

非关系型数据库:

  1. 数据之间没有关系
  2. 数据存储在内存中

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

1.2 下载安装
  1. 官网:http://redis.io

  2. 中文网:http://www.redis.net.cn/

  3. 解压直接可以使用

    redis.windows.conf:配置文件

    redis-cli.exe:redis的客户端

    redis-server.exe:redis的服务器端

1.3 命令操作
  1. redis的数据结构

    redis存储的是:key,value格式的数据,其中key都是字符串,value有5种不同的数据结构

    value的数据结构:

    1. 字符串类型:string
    2. 哈希类型:hash:map格式
    3. 列表类型 :list:linkedlist格式
    4. 集合类型:set:hashset格式
    5. 有序集合类型:sortedset

在这里插入图片描述

  1. 字符串类型 string

    1. 存储:set key value
    2. 获取:get key
    3. 删除:del key
  2. 哈希类型 hash

    1. 存储:hset field value

      field:字段

    2. 获取:hget key field:获取指定的field对应的值

      hgetall key:获取所有的field和value

    3. 删除:hdel key field

  3. 列表类型 List:可以添加一个元素到列表头部(左边)或者尾边(右边)

    1. 添加:

      1. lpush key value:将元素加入列表左边
      2. rpush key value:将元素加入列表右边
    2. 获取:

      lrange key start end:范围获取

      lrange key 0 -1:获取全部

    3. 删除:

      1. lpop key:删除列表最左边的元素,并将元素返回
      2. rpop key:删除列表最右边的元素,并将元素返回
  4. 集合类型 set:不允许重复

    1. 存储:sadd key value
    2. 获取:smembers key:获取set集合中所有元素
    3. 删除:srem key value:删除set集合中的某个元素
  5. 有序集合 sortedset:不允许重复且元素有序

    1. 存储:zadd key score value
    2. 获取:zrange key start end [withscores]
    3. 删除:zrem key value
  6. 通用命令

    1. keys *:查询所有的键
    2. type key:获取键对应的value类型
    3. del key:删除指定的key、value键值对

第二节:redis持久化

redis是一个内存数据库,当redis服务器重启,或者电脑重启,数据会丢失,我们可以将redis内存中的数据持久化保存到硬盘的文件中

2.1 redis持久化机制
  1. **RDB:**默认方式,不需要进行配置,默认使用这种机制

    在一定的时间间隔中,检测key的变化情况,然后持久化数据

    使用步骤:

    1. 编辑redis.windows.conf文件

      #after 900 sec (15min) if at least 1 key changed
      save 900 1
      #after 300 sec (5min) if at least 10 keys changed
      save 300 10
      #after 60 sec (1min) if at least 10000 keys changed
      save 60 10000
        
      
    2. 重新启动redis服务器并指定配置文件名称

      redis-server.exe redis.windows.conf

  2. **AOF:**日志记录的方式,可以记录每一条命令的操作,可以每一次命令操作后持久化数据

    1. 编辑redis.windows.conf文件

      appendonly no(关闭AOF)---->appendonly yes(开启AOF)

    #appendfsync always //每一次操作都进行持久化
    #appendfsync everysec//每隔一秒进行一次持久化(m)
    #appendfsync no//
    

第三节:Jedis代码操作

3.1 Jedis快速入门

**Jedis:**一款Java操作数据库的工具,类似JDBC

使用步骤:

  1. 下载Jedis的jar包

  2. 使用

    //1.获取连接
    Jedis jedis=new Jedis("localhost",6379);//如果使用空参构造,默认值"localhost",6379
    //2. 操作
    jedis.set("username","zhangsan");
    //获取
    String u
    //3.关闭连接
    jedis.close();
    
3.2 Jedis操作
  1. 字符串类型 String

    set

    get

  2. 哈希类型 hash:map格式

    hset

    hget

    hgetAll:获得所有键值对,返回一个map集合

  3. 列表类型 list:linkedlist格式。支持重复元素

    lpush/rpush

    lpop/rpop

    lrange start end:范围获取

  4. 集合类型 set:不允许重复元素

    sadd

    smembers:获取所有元素

  5. 有序集合类型 sortedset:不允许重复元素,且元素有顺序

    zadd

    zrange

3.3 连接池

jedis连接池:JedisPool

使用:

  1. 创建JedisPool连接池对象
  2. 调用方法getResource()方法获取jedis对象
//创建一个配置对象
JedisPoolConfig config=new JedisPoolConfig();
config.setMaxTotal(50);//最大允许连接数
config.setMaxIdle(10);//最大的空闲连接
//创建连接池对象
JedisPool jedisPool=new JedisPool(config,"localhost",6379);
//2.获取连接
Jedis jedis=jedisPool.getResource();
//3.使用
jedis.set("hehe","haha");
//4.关闭(归还到连接池中)
jedis.close();

Jedis连接工具类

public class JedisPoolUtils {
    /*
    * JedisPool工具类
    *   加载配置文件,配置连接池的参数
    *   提供获取链接的方法
    * */

    private static JedisPool jedisPool;

    static {
        //读取配置文件
        InputStream is=JedisPoolUtils.class.getClassLoader().getResourceAsStream("jedis.properties");
        //创建Properties对象
        Properties pro=new Properties();
        //关联文件
        try {
            pro.load(is);
        } catch (IOException e) {
            e.printStackTrace();
        }
        //获取数据,设置到Jedis
        JedisPoolConfig config=new JedisPoolConfig();
        config.setMaxTotal(Integer.parseInt(pro.getProperty("maxTotal")));
        config.setMaxIdle(Integer.parseInt(pro.getProperty("maxIdle")));

        //初始化JedisPool
        jedisPool=new JedisPool(config,pro.getProperty("host"), Integer.parseInt(pro.getProperty("port")));


    }
    //获取连接的方法
    public static Jedis getJedis(){
        return jedisPool.getResource();
    }
}


public class JedisPoolTest {
    @Test
    public void test1(){
        //1.通过连接工具类获取
        Jedis jedis=JedisPoolUtils.getJedis();
        //2.使用
        jedis.set("hehe","haha");
        //3.归还
        System.out.println(jedis.get("hehe"));
        jedis.close();
    }
}
3.4 案例

案例需求:

  1. 提供index.html页面,页面中有一个省份 下拉列表
  2. 当 页面加载完毕后,发送ajax请求,加载所有省份

注意:使用redis缓存一些不经常变化的数据

​ 数据库中的数据一旦发生改变,则需要更新缓存

​ 数据库的表执行 增删改等相关操作,需要将redis缓存数据情况,再次存入

​ 在service对应的增删改方法中,将redis数据删除

第九章:Maven介绍

第一节:Maven基本概念

1.1 概述

**Maven:**是一个项目管理工具,它包含了一个项目对象模型(POM:Project Object Model),一组标准集合,一个项目生命周期(Project Lifecycle),一个依赖管理系统(Dependency Management System),和用来运行定义在生命周期阶段(phase)中插件(plugin)目标(goal)的逻辑

1.2 Maven能解决什么问题
  1. 我们需要引用各种 jar 包,尤其是比较大的工程,引用的 jar 包往往有几十个乃至上百个, 每用到一种 jar 包,都需要手动引入工程目录,而且经常遇到各种让人抓狂的 jar 包冲突,版本冲突。
  2. 我们辛辛苦苦写好了 Java 文件,可是只懂 0 和 1 的白痴电脑却完全读不懂,需要将它编译成二进制字节码。好歹现在这项工作可以由各种集成开发工具帮我们完成,Eclipse、IDEA 等都可以将代码即时编译。当然,如果你嫌生命漫长,何不铺张,也可以用记事本来敲代码,然后用 javac 命令一个个地去编译,逗电脑玩。
  3. 世界上没有不存在 bug的代码,计算机喜欢 bug就和人们总是喜欢美女帅哥一样。为了追求美为了减少 bug,因此写完了代码,我们还要写一些单元测试,然后一个个的运行来检验代码质量。
  4. 再优雅的代码也是要出来卖的。我们后面还需要把代码与各种配置文件、资源整合到一起,定型打包,如果是 web项目,还需要将之发布到服务器,供人蹂躏
1.3 Maven依赖管理的概念

**依赖管理:**maven工程对jar包的管理过程 代码可重用

在这里插入图片描述

1.4 Maven仓库种类和彼此关系

仓库分为3类:本地仓库、远程仓库【私服】、中央仓库

在这里插入图片描述

第二节:maven标准目录结构和常用命令

2.1 maven标准目录结构

src/main/java目录 核心代码部分

src/main/resources目录 配置文件部分

src/test/java目录 测试代码部分

src/test/resources目录 测试配置文件

src/main/webapp目录 页面资源,js,css,图片等

2.2 maven常用命令
  1. maven clean:对项目进行清理,删除target目录下编译的内容
  2. maven compile:编译项目源代码
  3. maven test:对项目进行运行测试
  4. maven package:打包文件并存放到项目的target目录下,打包好的文件通常都是编译后的class文件
  5. maven install:在本地仓库生成仓库的安装包,可供其他项目引用,同时打包后的文件放到项目的target目录下
  6. maven deploy:发布
常用命令使用场景举例:
  1. mvn clean package依次执行了clean、resources、compile、testResources、testCompile、test、jar(打包)等7个阶段,package命令完成了项目编译、单元测试、打包功能,但没有把打好的可执行jar包(war包或其它形式的包)布署到本地maven仓库和远程maven私服仓库

  2. mvn clean install依次执行了clean、resources、compile、testResources、testCompile、test、jar(打包)、install等8个阶段,install命令完成了项目编译、单元测试、打包功能,同时把打好的可执行jar包(war包或其它形式的包)布署到本地maven仓库,但没有布署到远程maven私服仓库

  3. mvn clean deploy依次执行了clean、resources、compile、testResources、testCompile、test、jar(打包)、install、deploy等9个阶段,deploy命令完成了项目编译、单元测试、打包功能,同时把打好的可执行jar包(war包或其它形式的包)布署到本地maven仓库和远程maven私服仓库

常见问题:
1. mvn clean install 和 mvn install 的区别
  1. 根据maven在执行一个生命周期命令时,理论上讲,不做mvn install 得到的jar包应该是最新的,除非使用其他方式修改jar包的内容,但没有修改源代码

  2. 平时可以使用mvn install ,不使用clean会节省时间,但是最保险的方式还是mvn clean install,这样可以生成最新的jar包或者其他包

2.maven两种跳过单元测试方法的区别
  1. mvn package -Dmaven.test.skip=true

    不但跳过了单元测试的运行,同时也跳过了测试代码的编译

  2. mvn package -DskipTests

    跳过单元测试,但是会继续编译。如果没时间修改单元测试的bug,或者单元测试编译错误,则使用第一种,不要使用第二种

第三节:maven生命周期和概念模型图

3.1 maven生命周期

在这里插入图片描述

执行后面的一定会包含前面的

3.2 maven概念模型图

在这里插入图片描述

第四节: maven高级应用

4.1 maven基础知识回顾

maven:是一个项目管理工具

主要功能:

  1. **依赖管理:**maven对项目中jar包的管理过程。传统工程我们直接把jar包放在项目中,maven工程真正的jar包放置在仓库中,项目中只用放jar包的坐标

    **仓库的种类:**本地仓库、远程仓库(私服)、中央仓库

    **仓库之间的关系:**当我们启动一个maven工程的时候,maven工程会通过pom文件中jar包的坐标去本地仓库找对应jar包,默认情况下,如果本地仓库没有对应jar包,maven工程会自动去中央仓库下载jar包到本地仓库。在公司中,如果本地没有对应jar包,会从私服先下载jar包。如果私服没有jar包,可以从中央仓库下载,也可以从本地上传

  2. **一键构建:**maven自身集成了tomcat插件,可以对项目进行编译,测试,打包,安装,发布等操作

    **maven常用命令:**clean,compile,test,package,install,deploy

    **maven三套生命周期:**清理生命周期、默认生命周期、站点生命周期

4.2 maven导入jar包时冲突的解决

maven工程要导入jar包的坐标,就必须要考虑解决jar包冲突

解决jar包冲突的方式:

  1. **第一声明优先原则:**哪个jar包的坐标在靠上的位置,这个jar包就是先声明的。先声明的jar包坐标下的依赖包,可以优先进入项目中

  2. **路径近者优先原则:**直接依赖路径比传递依赖路径近,那么最终项目进入的jar包会是路径近的直接依赖

    **直接依赖:**项目中直接导入的jar包,就是该项目的直接依赖包

    **传递依赖:**项目中没有直接导入的jar包可以通过项目直接依赖jar包传递到项目中

  3. **直接排除法【推荐使用】:**当我们要排除某个jar包下的依赖包,在配置<exclusion>标签的时候,内部可以不写版本号,因为此时依赖包使用的版本号默认和本jar包一样

4.3 pom文件内标签的讲解
<dependencyManagement>

**作用:**锁定jar包版本

maven工程可以是分父子依赖关系的。凡是依赖别的项目后,拿到的别的项目的依赖包,都属于传递依赖。

比如:当前A项目,被B项目依赖,那么我们A项目中所有的jar包都会传递到B项目中,B项目开发者,如果再在B项目中导入一套ssm框架的jar包,对于B项目是直接依赖,那么直接依赖的jar包就会把我们A项目传递过去的jar包覆盖掉。

为了防止以上的情况出现,我们可以把A项目中主要jar包的坐标锁住,那么其它依赖该项目的项目中,即便是有同名jar包直接依赖,也无法覆盖

4.4 maven工程拆分与聚合的思想

在这里插入图片描述

4.5 工程和模块的关系以及继承和依赖的概念
工程和模块的区别

工程不等于完整的项目,模块也不等于完整的项目,一个完整的项目看的是代码,代码完整,就可以说是这是一个完整的项目,和此项目是工程或模块没有关系

工程天生只能使用自己内部资源,工程是独立的,后天可以和其他工程和模块建立关联关系

模块天生不是独立的,模块天生是属于父工程的,模块一旦创建,所有父工程的资源都可以使用

父子工程之间关系

子模块天生继承父工程,可以使用父工程所有资源

子模块之间天生是没有任何关系的

父子工程之间不用建立关系,继承关系是先天的,不需要手动建立

平级之间的引用叫做依赖,依赖不是先天的,依赖是需要后天建立的

在这里插入图片描述

  • 18
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值