java基础复习

java程序的架构

  1. java在生成字节码之外,还生成了JVM(java virtual machine,java 虚拟机),通过JVM支持了字节码的解释运行

    在这里插入图片描述

所以说java语言的进阶分为两层:java语言、jvm

在这里插入图片描述

java的命名规则ascll码不能有空格
Public class ClassName{
    public static void main(String[] args){
        System.out.println("Hello World");//1
    }
}
  • public class :固定格式
  • ClassName: 类的名称
  • main:方法最重要,java程序从main开始执行
  • 1 语句
  1. 包路径采用“.”分隔

  2. 包路径不是绝对路径的文件路径,它只是相对java工程目录的路径

  3. 一个文件只有一个package语句,并在文件的第一行
变量
  • 变量是解决内容复用的
  • 变量是名称的
  • 声明变量(类似于String a)
  • 赋值 (a=“阿娆”)或者(String a = “阿娆”)
  • 数据类型 主要是 字符串 数字 布尔等 运算符±*/等
  • Math.random 随机数(浮点)几位数通过*100000之后再 1. %得出整数的随机数 2.强制int转换
int code = (int) ((Math.random()+1) * 100000);
public static void random(int length){//void 无返回值
    int code = (int) ((Math.random()+1) * length);
    System.out.println(code);
  }//
//还可以错参数
  • 自定义方法:解决代码复用问题,隐藏细节,程序更清晰 ,降低复杂度
public class Custom {
  public static void main(String[] args){
      System.out.println("测试");
      // 这里执行一下 newLine 这个自定义方法的调用
      newLine();
      System.out.println("结束");
  }
  public static void newLine(){
    System.out.println("");
  }
}
  • 逻辑语句
    • if
    • if else if else
    • if {if}
    • return
    • 递归
    • for
  • void 无返回值 int /bool…有返回值
// 验证码方法void
public static void code(int len)

// 随机数方法double
public static double random()
    
public static int code(int len){
    // 得到随机数结果
    double val = Math.random();
    // 随机数结果*9+1 然后再乘以位数得到验证码
    int result = (int)((val*9+1)*len);
    return result;
  }
  • 字符串常用

    • 拼接 substring
    • 查找 indexOf
    • 开始/结束判断 startsWith/endsWith
    • 替换 replaceAll’
    • 分割 split
    • 大小写转换 toUpperCase/toLowerCase
    • 比较 equals
    • 数字和字符串转换 integer parseint
    • Sring.valueOf()
  • 包(package)的导入 import 包名+类名

    • import java.time.LocalDate;
      
Java网络编程
  • 协议
    • http
    • https

在这里插入图片描述

    • URL 统一资源定位符

在这里插入图片描述

    • 协议类型于域名之间://分割
    • 路径(path)以/开头,中间每层的分隔符/
    • 路径(path)相当于一层层的文件夹,但是要与windows的文件夹分隔符\区分
    • 参数
      • 路径与参数之间用?分割,
      • 多个参数之间用&分割
      • 参数用“参数名=参数值(key=value)”的表示方法
  • get 请求

    • 安装依赖库

      <!-- https://mvnrepository.com/artifact/com.squareup.okhttp3/okhttp -->
      <dependency>
       <groupId>com.squareup.okhttp3</groupId>
       <artifactId>okhttp</artifactId>
       <version>4.1.0</version>
      </dependency>
      
    1. 实例化OkkHttpClient. 使用OkHttpClient okHttpClient = new OkHttpClient(); 代码。
    2. 执行调用。
      1. 在执行调用之前,需要实例化一个 Request对象,作用是定义请求的各种参数 Request request = new Request.Builder().url(url).build();
      2. 构建调用对象 Call call = okHttpClient.newCall(request);
      3. 最后执行调用,如果调用失败可能抛异常,所以必须抓取异常 call.execute()执行调用
    3. call.execute()返回的其实是一个执行的结果对象,调用对象的方法即可获取返回的字符串内容:call.execute().body().string();

不要忘了在pom.xml里添加依赖,以及import语句引入使用类

API

应用程序接口,api一般是指一些预先定义的函数,目的是可以为开发人员快速访问某一程序,无需访问的源码,或内部工作机制的细节

  • Okhttp3的一些方法

    • post():放在表单中提交

      Builder builder = new FormBody.Builder();
      // 设置数据,第一个参数是数据名,第二个参数是数据值
      builder.add("", "");
      FormBody formBody = builder.build();
      
      Request request = new Request.Builder().url(url).post(formBody).build();
      
    • get():调用api

    • JSON方式提交数据步骤

      • 将数据转换成JSON格式的字符串,调用
      • 创建RequestBody实例,注意需要指定提交的类型是application/json;chaarset=utf-8(api规定的编码格式)
      • 构建request实例对象时,调用.post(requestBody)表示使用JSON的方式提交数据
request response对象

使用一条语句执行调用请求,并取得返回结果字符串

call.execute().body().string()

获取响应状态码

call.execute().code()

请求图片、excel等非文本文件时,不能使用 response.body().string()

response.body().bytes();

JSON 很多api返回的文件内容是JSON格式的。JSON是一段文本,是java的字符串,是难以进行解析具体内容的。必须转换成Java的对象

JSON.parseObject()
headers

HTTP header是HTTP协议的一项重要内容

Request request = new Request.Builder()
    .url(url)
    .addHeader("Referer", "https://ham.youkeda.com/course/j14/0")
    .build();

Host表示当前请求的域名

Request request = new Request.Builder()
    .url(url)
    .addHeader("Host", "www.douban.com")
    .build();
在console中下载文件、图片
  • 写入文本文件

    import java.io.File;
    import java.io.FileWriter;
    
    // 文件对象
    File file = new File("foo.txt");
    
    // 写入内容
    FileWriter fileWritter = new FileWriter(file.getName());
    fileWritter.write(content);
    
    // 关闭
    fileWritter.close();
    
  • 写入二进制文件

    import java.io.File;
    import java.io.FileOutputStream;
    
    // 文件对象
    File file = new File("china-city-list.xlsx");
    
    // 写文件
    FileOutputStream fos = new FileOutputStream(file);
    fos.write(data);
    
    // 必须刷新并关闭
    fos.flush();
    fos.close();
    
  • 下载图片

    与上面一样

  • 解析excel

    • 加依赖库

      <dependency>
        <groupId>com.alibaba</groupId>
        <artifactId>easyexcel</artifactId>
        <version>3.1.1</version>
      </dependency>
      
    • 调用库
    import com.alibaba.excel.EasyExcel;
    import java.util.Map;
    import java.util.List;
    
    // 读取第一个sheet
    List<Map<Integer, String>> sheetDatas = EasyExcel.read("xzq_201907.xlsx").sheet(0).doReadSync();
    // List 中每个元素表示一行
    for (Map<Integer, String> rowData : sheetDatas) {
      // Map 中用序号指代每一列
      for (Integer index : rowData.keySet()) {
        // 列值
        String columnValue = rowData.get(index);
      }
    }
    

print不换行 println 换行

cookie 和 session

数据结构与算法入门

emmmm 怎么说呢,

web前端基础

HTML元素的结构

HTML标签

  1. 由尖括号包围关键词
  2. 多成对出现
  3. 等是单独呈现的
  • 嵌套

在这里插入图片描述

  1. <! DOCTYPE HTML> 作用:告知浏览器该页面文件的文档类型,该声明必须在HTML文档的第一行,对大小写不敏感, 没有结束标签

  2. ..... 告知浏览器其自身是一个html文档,与

标签限定文档的开始和结束,头部 主体 lang属性(语言属性):en表英文

  1. 属性标签
  2. 文档的头部
  3. 文档主体
  4. 注释<!-- —>
  • 表单标签
    • action:一个处理此表单信息的程序所在的URL,所述表格信息将在表单提交时被发送到定义的地址
    • method:它的值可以是GET/POST,用来规定如何发送表单信息
  • 占位文本
<input type="text" placeholder="昵称" />
<input type="text" placeholder="昵称" name="nick" value="小明" readonly />

在这里插入图片描述

  • 多行文本输入框

    <textarea
      name="sign"
      rows="5"
      cols="30"
      placeholder="请输入个性签名"
    ></textarea>
    //密码的
    <input type="password" name="password" placeholder="密码" />
    
  • 单选框和复选框

    <label> <input type="radio" name="gender" value="male" /></label>
    <label> <input type="radio" name="gender" value="female" /></label>
    
    <input id="male" type="radio" name="gender" value="male" />
    <label for="male"></label>
    <input id="female" type="radio" name="gender" value="female" />
    <label for="female"></label>
    
    //复选
    <input type="checkbox" />
    
  • 选择菜单option(菜单) multiple(可滚动)

<select name="career" multiple>
  <option value="default">请选择职业</option>
  <option value="staff">公司职员</option>
  <option value="freelancer">自由职业者</option>
  <option value="student">学生</option>
  <option value="other">其他</option>
</select>
  • 按钮 button
<button>注册</button>
引入方式
  1. 行内样式 一行一个
  2. 内部样式抽离步骤
    1. 将每一个标签的CSS样式抽取出来
    2. 在head标签里声明一个标签
    3. 将样式放入style标签里
    4. 将相同标签的样式卸载相同的大括号里
  3. 外部样式
  4. 嵌套 将一套嵌套到一个整体中
  5. 复用 :mixin /include
    • 无参数混合
//css
.square {
  width: 100px;
  height: 100px;
}
//html
<div class="user-avatar square">...</div>
<div class="admin-avatar square">...</div>
//Sass
@mixin square {
  width: 100px;
  height: 100px;
}

// 应用:
.user-avatar {
  @include square;
}
.admin-avatar {
  @include square;
}

混合的目的:不用改动html代码(在元素中添加类名)

使用方法:“@mixin”:定义可复用的样式“@include”:应用可复用的样式

    • 有参数混合
//通过修改size来修改square的大小,该参数$size:value   来默认square的值
@mixin square($size) {
  width: $size;
  height: $size;
}

// 应用
.avatar {
  @include square(100px);
}

javascript

是一种专与网页交互设计的语言,主要由三部分组成:

  1. 核心(ECMAScript)

    由 语法,类型,语句,关键字,保留字,操作符,对象

  2. 文档对象模型(DOM)获取html标签,并给标签添加或者删除样式,并添加时间

    DOM遍历和范围:可以找到页面中的所有标签

    DOM时间:添加事件

    DOM样式:元素的样式

  3. 浏览器对象模型(BOM)

    弹出,移动,放缩,关闭浏览器等功能

  4. 位置,在html内部

    使用script标签嵌入JavaScript

// script标签嵌入JavaScript代码
<script>
    // JavaScript代码
    let name = "kimi";
    function(){
        console.log("我的名字叫:"+name);
    }
</script>

多字符拼接用“+ ”

  • 变量

    • 隐式转换
      1. 字符+数字 数字转换成字符串
      2. 字符做除了+的运算, 字符串转换成数字
    • 强制转换
      1. parseInt
      2. parseFloat 小数字符串,转化为小数
  • 对象:键值对

在这里插入图片描述

    • 属性读取
console.log(person.name);
console.log(person['name']);
//增加属性
person.gender="male";
//删除属性
delete person.name;
    • 属性是否存在 :in
  • Object JSON Map的区别

    • JSON是一种轻量级的文本数据交换格式,用JavaScript的语法书写,但独立于这种语言,可以认为这是编程语言用于传递数据而约定的数据格式

      // 一个 JSON 字符串
      const jsonStr =
        '{"sites":[{"name":"Runoob", "url":"www.runoob.com"},{"name":"Google", "url":"www.google.com"},{"name":"Taobao", "url":"www.taobao.com"}]}';
      
      // 转成 JavaScript 对象
      const obj = JSON.parse(jsonStr);
      
    • Map和Object 相似,都可以保存键值对,但
      1. Object的键通常是字符串,但一个Map的键可以是任意值
      2. Map中的键值是有序的,而添加到对象中的键则不是
      3. Map的键值对个数可以直接获取,Object则要借助Object.keys()
      4. Map可以直接对进行迭代,Object则要借助Object.keys
      5. Map不存在键名和原型键名冲突问题,可以直接覆盖,Object不行
  • Math、Storage

Math.abs() // 绝对值
Math.ceil() // 向上取整
Math.floor() // 向下取整
Math.round() // 四舍五入取整
Math.max() // 最大值
Math.min() // 最小值
Math.pow() // 指数运算
Math.sqrt() // 平方根
Math.log() // 自然对数
Math.exp() // e的指数
Math.random() // 随机数
window.localStorage.setItem('myLocalStorage', 'storage Value');

window.localStorage.setItem(‘key’, ‘value’) 方法接受两个参数:

  1. key:键名;
  2. value:键值

两个参数都是字符串,不是字符串的参数会被转成字符串后再存入浏览器。

    • 清除缓存 clear
    • 读取数据getitem
  • String

    • 字符串长度 length

    • 查找字符 indexOf()

    • 去掉两端空格 trim()

    • 截取字符串 substring/substr

    • 分割字符串 :split

在这里插入图片描述

  • Array

在这里插入图片描述

  • BOM(浏览器对象模型)(Browser Object MOdel)

    • 有一系列相关对象构成,每个对象都提供了很多方法和属性
    • 对象
      1. window(窗口):是整个网页的框架,每个网页都是装在window里面
      2. navigator(浏览器):navigator里面存储浏览器相关信息
      3. history(历史):存储网页栈的
      4. screen(显示屏幕):硬件信息
      5. location(地址)当前访问的页面信息
  • DOM(文档对象模型)(Document Object Model)

    • 可以将Web页面与脚本或编程语言连接起来
    • 特性:
      1. 树根document,整个页面文档
      2. 每个HTML标签称为DOM节点,
      3. 每个HTML标签包裹的子标签,在树上体现为分支,儿子节点
      4. 以及树相关的知识点(数据结构)
  • 页面分析步骤

    1. 把涉及页面的静态页面写出
    2. 利用Javascript控制区域的显示和隐藏,达到动态效果
    3. 根据写好的静态页面模板和数据,动态创建DOM节点
  • dom事件

    • focus 表单组件获取焦点事件
    • burl 表单组件 失去焦点事件
    • click点击事件
    • dblclick 双击事件
    • mouse’down 按下任意鼠标按钮
    • mouseenter 指针移到有事件监听的元素内
    • mouseleave:指针移出元素范围外(不冒泡)。
    • mousemove: 指针在元素内移动时持续触发。
    • mouseover: 指针移到有事件监听的元素或者它的子元素内。
    • mouseout: 指针移出元素,或者移到它的子元素上。
    • mouseup: 在元素上释放任意鼠标按键。
    • keydown:键盘按下事件
    • keyup:键盘释放事件
    • scroll:文档滚动事件
    • resize:窗口放缩事件
  • 冒泡事件

    1. 点击事件触发监听
    2. 冒泡依次找到父节点,触发父节点的监听事件
    3. 依次冒泡到html结束
  • 捕获

    1. 父节点往下移动到点击的元素
  • 委托 类似于冒泡事件

Spring Web

maven

在这里插入图片描述

  • POM
    • 定义项目的类型、名字’
    • 管理依赖关系
    • 定制插件
      在这里插入图片描述
  1. Maven 坐标

    <groupId>com.youkeda.course</groupId>
    <artifactId>app</artifactId>
    <packaging>jar</packaging>
    <version>1.0-SNAPSHOT</version>
    
  2. Maven 工程属性

    <properties>
        <java.version>1.8</java.version>
        <maven.compiler.source>${java.version}</maven.compiler.source>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <maven.compiler.target>${java.version}</maven.compiler.target>
    </properties>
    
  3. Maven 依赖

  4. Maven 插件

  • 依赖管理

    <dependencies>
        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>fastjson</artifactId>
            <version>1.2.62</version>
        </dependency>
        <dependency>
            <groupId>com.squareup.okhttp3</groupId>
            <artifactId>okhttp</artifactId>
            <version>4.2.2</version>
        </dependency>
    </dependencies>
    
  • 插件体系

    <build>
        <plugins>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-compiler-plugin</artifactId>
                <version>3.8.1</version>
            </plugin>
        </plugins>
    </build>
    

Spring强调面向接口编程

在这里插入图片描述

调用MessageService 实例的getMessage()方法

在Spring中,想调用MessageService 可以直接从上下文获取,不需要关心它的实现类

如何实例化实现类,从而达到耦合

java 注释(Annotation)

本质上来说Annotation (注解)是Java推出的-种注释机制,和普通的注释有个显著的特Annotation是可以在编译、运行阶段读取的,注释很明显不可以。能够在编译、运行阶段读取信息,这就有很多的扩展空间,而环会污染源代码。可以借助它来实现一些增强功能,在Spring当中就重度使用了Annotation,通过运行阶段动态的获取Annotation从而完成很多自定义的行为,所以如果不了解Annotation,那学习Spring就没有办法进行下去了。从另外一个角度来看,Annotation 也是-个Java类,只是这个类太特殊了点。
在这里插入图片描述

  1. target :只有一个数组属性,用于设定该注解的目标范围,比如说可以作用于类或者方法等。因为是数组,所以可以同时设定多个范围具体可以作用的类型配置在java. lang. annotation. ElementType

  2. Retebtion :用于声明注解的生命周期,即有效性。1.SOURCE:也就是说是纯注释作用2.CL ASS:也就是在编译阶段是有效的3.RUNTIME:在运行时有效

  3. Documented :将注解中的元素包含到JavaDoc文档中

  4. @interface 就是声明当前java类型是Annotation ,固定语法

  5. Annotation的属性有点像类的属性一样,它约定了属性的类型(这个类型是基础类型: String、 boolean、 int、 long), 和属性名称(默认名称是value,在引用的时候可以省略),default 代表的是默认值。

spring bean

IoC (Inversion of Control 控制反转)容器时Spring框架最最核心的组件,没有IoC容器就没有Spring框架

通过依赖注入(Dependency injection)来实现IoC,获取Bean的实例直接从IoC容器中获取,不需要关心实现类
在这里插入图片描述

//启动IoC容器
ApplicationContext context = 
    new AnnotationConfigApplicationContext("fm.douban");

Spring 官方声明为Spring Bean 的注解有如下

  • org.springframework.stereotype.Service 扩展自Component 代表Service Bean
  • org.springframework.stereotype.Component 是通用的Bean 注解
  • org.springframework.stereotype.Controller Web Bean
  • org.springframework.stereotype.Repository 持久化相关Bean

依赖注入

  1. 完成容器的启动

  2. 完成依赖注入行为

  3. 作用,让Spring 系统自动管理各种实例

在这里插入图片描述

Spring Resource

把本地文件、classpath文件,远程文件都封装成Resource 对象统一加载

Spring Boot

核心还是spring,web服务器做了什么

在这里插入图片描述

在Spring Boot方案里,一个网页请求到了服务器后,首先进入的是JavaWeb服务器,再进入SpringBoot应用,最后匹配到某一个Spring Controller,然后路由到具体摸一个bean的方法,执行完后返回结果输出到客户端

  • http网络中对重要的协议
    • get
    • post

在这里插入图片描述

  • thymeleaf 是一个模板框架吗,支持多种格式内容的动态晕染,和html相融合-

    • 初始化 添加Maven依赖

    • <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-thymeleaf</artifactId>
      </dependency>
      
    • th代表thymeleaf语法

    • th:each 循环语句

    • <ul th:each="song,it: ${songs}">
        <li>
          <span th:text="${it.count}"></span>
          <span th:text="${song.name}"></span>
        </li>
      </ul>
      
    • th:if 条件语句

    • //${xxx}是固定语法
      <span th:text="${msg}">Hello</span>
      
  • Spring Validation

    • JSR java Specification Requests 380:java规范提案。指JCP java community process 提出新增一个标准化技术规范的正式请求。

      <dependency>
        <groupId>jakarta.validation</groupId>
        <artifactId>jakarta.validation-api</artifactId>
        <version>2.0.1</version>
      </dependency>
      <dependency>
          <groupId>org.springframework.boot</groupId>
          <artifactId>spring-boot-starter-validation</artifactId>
      </dependency>
      
    • 创建一个表单页 user/addUser.html模板文件

  • thymeleaf layout

    • th:include=“::content”是选择器

    • th:replace=“layout”页面会替换成layout

    • th:fragment=“content”

      <div th:fragment="content">
      </div>
      
  • Spring Boot ComponentScan

  • 使用日志系统,两大步骤

    • 配置 修改Spring Boot 系统的标准配置文件: application.properties(在项目的 src/main/resources/ 目录下),增加日志级别配置:logging.level.root=info

    • 编码

      import org.slf4j.Logger;
      import org.slf4j.LoggerFactory;
      import org.springframework.web.bind.annotation.RestController;
      import javax.annotation.PostConstruct;
      
      @RestController
      public class SongListControl {
          private static final Logger LOG = LoggerFactory.getLogger(SongListControl.class);
      
          @PostConstruct
          public void init(){
              LOG.info("SongListControl 启动啦");
          }
      }
      
Spring Session
  • Cookie类的构造函数,第一个参数是cookie名称,第二个参数是coolie值。其他的属性,需要根据实际情况和具体的业务需求决定。

  • 但是重要信息放入cookie,会带来安全隐患,不超过4kb

  • Session机制可以解决安全问题,放在服务端,没有限制,

  • 依赖

    <!-- spring session 支持 -->
    <dependency>
        <groupId>org.springframework.session</groupId>
        <artifactId>spring-session-core</artifactId>
    </dependency>
    
Spring Request 拦截器(HandlerInterceptor)
  1. 创建拦截器HandlerInterceptor 接口。可以在三个点进行拦截:
    1. Controller方法执行之前。这是最常用的拦截点。例如是否登录的验证就要在 preHandle() 方法中处理。
    2. Controller方法执行之后。例如记录日志、统计方法执行时间等,就要在 postHandle() 方法中处理。
    3. 整个请求完成后。不常用的拦截点。例如统计整个请求的执行时间的时候用,在 afterCompletion 方法中处理。
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;

public class InterceptorDemo implements HandlerInterceptor {

  // Controller方法执行之前
  @Override
  public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {

    // 只有返回true才会继续向下执行,返回false取消当前请求
    return true;
  }

  //Controller方法执行之后
  @Override
  public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler,
      ModelAndView modelAndView) throws Exception {

  }

  // 整个请求完成后(包括Thymeleaf渲染完毕)
  @Override
  public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {

  }
}
preHandle()` 方法的参数中有 `HttpServletRequest` 和 `HttpServletResponse`,可以像 `control` 中一样使用 `Session
  1. 实现 WebMvcConfigurer
Spring Data CRUD,类似于数据库
  1. 新增数据 插入mongoTemplate.insert()

  2. 查询数据 findById() mongoTemplate.findById(songId, Song.class)

  3. 修改数据

    // 修改 id=1 的数据
    Query query = new Query(Criteria.where("id").is("1"));
    
    // 把歌名修改为 “new name”
    Update updateData = new Update();
    updateData.set("name", "new name");
    
    // 执行修改,修改返回结果的是一个对象
    UpdateResult result = mongoTemplate.updateFirst(query, updateData, Song.class);
    // 修改的记录数大于 0 ,表示修改成功
    System.out.println("修改的数据记录数量:" + result.getModifiedCount());
    
  4. 删除数据

Song song = new Song();
song.setId(songId);

// 执行删除
DeleteResult result = mongoTemplate.remove(song);
// 删除的记录数大于 0 ,表示删除成功
System.out.println("删除的数据记录数量:" + result.getDeletedCount());

java程序的架构

  1. java在生成字节码之外,还生成了JVM(java virtual machine,java 虚拟机),通过JVM支持了字节码的解释运行

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-iKurYleH-1673275878158)(D:\1ar\youkedai\图片合集\图片1.png)]

所以说java语言的进阶分为两层:java语言、jvm

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-fshD6EKs-1673275878159)(D:\1ar\youkedai\图片合集\图片2.png)]

java的命名规则ascll码不能有空格
Public class ClassName{
    public static void main(String[] args){
        System.out.println("Hello World");//1
    }
}
  • public class :固定格式
  • ClassName: 类的名称
  • main:方法最重要,java程序从main开始执行
  • 1 语句
  1. 包路径采用“.”分隔

  2. 包路径不是绝对路径的文件路径,它只是相对java工程目录的路径

  3. 一个文件只有一个package语句,并在文件的第一行
变量
  • 变量是解决内容复用的
  • 变量是名称的
  • 声明变量(类似于String a)
  • 赋值 (a=“阿娆”)或者(String a = “阿娆”)
  • 数据类型 主要是 字符串 数字 布尔等 运算符±*/等
  • Math.random 随机数(浮点)几位数通过*100000之后再 1. %得出整数的随机数 2.强制int转换
int code = (int) ((Math.random()+1) * 100000);
public static void random(int length){//void 无返回值
    int code = (int) ((Math.random()+1) * length);
    System.out.println(code);
  }//
//还可以错参数
  • 自定义方法:解决代码复用问题,隐藏细节,程序更清晰 ,降低复杂度
public class Custom {
  public static void main(String[] args){
      System.out.println("测试");
      // 这里执行一下 newLine 这个自定义方法的调用
      newLine();
      System.out.println("结束");
  }
  public static void newLine(){
    System.out.println("");
  }
}
  • 逻辑语句
    • if
    • if else if else
    • if {if}
    • return
    • 递归
    • for
  • void 无返回值 int /bool…有返回值
// 验证码方法void
public static void code(int len)

// 随机数方法double
public static double random()
    
public static int code(int len){
    // 得到随机数结果
    double val = Math.random();
    // 随机数结果*9+1 然后再乘以位数得到验证码
    int result = (int)((val*9+1)*len);
    return result;
  }
  • 字符串常用

    • 拼接 substring
    • 查找 indexOf
    • 开始/结束判断 startsWith/endsWith
    • 替换 replaceAll’
    • 分割 split
    • 大小写转换 toUpperCase/toLowerCase
    • 比较 equals
    • 数字和字符串转换 integer parseint
    • Sring.valueOf()
  • 包(package)的导入 import 包名+类名

    • import java.time.LocalDate;
      
Java网络编程
  • 协议
    • http
    • https

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-oH7C3IfT-1673275878160)(D:\1ar\youkedai\图片合集\图片4.png)]

    • URL 统一资源定位符

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-BoigzT6j-1673275878160)(D:\1ar\youkedai\图片合集\图片5.png)]

    • 协议类型于域名之间://分割
    • 路径(path)以/开头,中间每层的分隔符/
    • 路径(path)相当于一层层的文件夹,但是要与windows的文件夹分隔符\区分
    • 参数
      • 路径与参数之间用?分割,
      • 多个参数之间用&分割
      • 参数用“参数名=参数值(key=value)”的表示方法
  • get 请求

    • 安装依赖库

      <!-- https://mvnrepository.com/artifact/com.squareup.okhttp3/okhttp -->
      <dependency>
       <groupId>com.squareup.okhttp3</groupId>
       <artifactId>okhttp</artifactId>
       <version>4.1.0</version>
      </dependency>
      
    1. 实例化OkkHttpClient. 使用OkHttpClient okHttpClient = new OkHttpClient(); 代码。
    2. 执行调用。
      1. 在执行调用之前,需要实例化一个 Request对象,作用是定义请求的各种参数 Request request = new Request.Builder().url(url).build();
      2. 构建调用对象 Call call = okHttpClient.newCall(request);
      3. 最后执行调用,如果调用失败可能抛异常,所以必须抓取异常 call.execute()执行调用
    3. call.execute()返回的其实是一个执行的结果对象,调用对象的方法即可获取返回的字符串内容:call.execute().body().string();

不要忘了在pom.xml里添加依赖,以及import语句引入使用类

API

应用程序接口,api一般是指一些预先定义的函数,目的是可以为开发人员快速访问某一程序,无需访问的源码,或内部工作机制的细节

  • Okhttp3的一些方法

    • post():放在表单中提交

      Builder builder = new FormBody.Builder();
      // 设置数据,第一个参数是数据名,第二个参数是数据值
      builder.add("", "");
      FormBody formBody = builder.build();
      
      Request request = new Request.Builder().url(url).post(formBody).build();
      
    • get():调用api

    • JSON方式提交数据步骤

      • 将数据转换成JSON格式的字符串,调用
      • 创建RequestBody实例,注意需要指定提交的类型是application/json;chaarset=utf-8(api规定的编码格式)
      • 构建request实例对象时,调用.post(requestBody)表示使用JSON的方式提交数据
request response对象

使用一条语句执行调用请求,并取得返回结果字符串

call.execute().body().string()

获取响应状态码

call.execute().code()

请求图片、excel等非文本文件时,不能使用 response.body().string()

response.body().bytes();

JSON 很多api返回的文件内容是JSON格式的。JSON是一段文本,是java的字符串,是难以进行解析具体内容的。必须转换成Java的对象

JSON.parseObject()
headers

HTTP header是HTTP协议的一项重要内容

Request request = new Request.Builder()
    .url(url)
    .addHeader("Referer", "https://ham.youkeda.com/course/j14/0")
    .build();

Host表示当前请求的域名

Request request = new Request.Builder()
    .url(url)
    .addHeader("Host", "www.douban.com")
    .build();
在console中下载文件、图片
  • 写入文本文件

    import java.io.File;
    import java.io.FileWriter;
    
    // 文件对象
    File file = new File("foo.txt");
    
    // 写入内容
    FileWriter fileWritter = new FileWriter(file.getName());
    fileWritter.write(content);
    
    // 关闭
    fileWritter.close();
    
  • 写入二进制文件

    import java.io.File;
    import java.io.FileOutputStream;
    
    // 文件对象
    File file = new File("china-city-list.xlsx");
    
    // 写文件
    FileOutputStream fos = new FileOutputStream(file);
    fos.write(data);
    
    // 必须刷新并关闭
    fos.flush();
    fos.close();
    
  • 下载图片

    与上面一样

  • 解析excel

    • 加依赖库

      <dependency>
        <groupId>com.alibaba</groupId>
        <artifactId>easyexcel</artifactId>
        <version>3.1.1</version>
      </dependency>
      
    • 调用库
    import com.alibaba.excel.EasyExcel;
    import java.util.Map;
    import java.util.List;
    
    // 读取第一个sheet
    List<Map<Integer, String>> sheetDatas = EasyExcel.read("xzq_201907.xlsx").sheet(0).doReadSync();
    // List 中每个元素表示一行
    for (Map<Integer, String> rowData : sheetDatas) {
      // Map 中用序号指代每一列
      for (Integer index : rowData.keySet()) {
        // 列值
        String columnValue = rowData.get(index);
      }
    }
    

print不换行 println 换行

cookie 和 session

数据结构与算法入门

emmmm 怎么说呢,

web前端基础

HTML元素的结构

HTML标签

  1. 由尖括号包围关键词
  2. 多成对出现
  3. 等是单独呈现的
  • 嵌套

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-SRqlKYpm-1673275878161)(D:\1ar\youkedai\图片合集\图片6.png)]

  1. <! DOCTYPE HTML> 作用:告知浏览器该页面文件的文档类型,该声明必须在HTML文档的第一行,对大小写不敏感, 没有结束标签

  2. ..... 告知浏览器其自身是一个html文档,与

标签限定文档的开始和结束,头部 主体 lang属性(语言属性):en表英文

  1. 属性标签
  2. 文档的头部
  3. 文档主体
  4. 注释<!-- —>
  • 表单标签
    • action:一个处理此表单信息的程序所在的URL,所述表格信息将在表单提交时被发送到定义的地址
    • method:它的值可以是GET/POST,用来规定如何发送表单信息
  • 占位文本
<input type="text" placeholder="昵称" />
<input type="text" placeholder="昵称" name="nick" value="小明" readonly />

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-qBxAqhLd-1673275878161)(D:\1ar\youkedai\图片合集\图片7.png)]

  • 多行文本输入框

    <textarea
      name="sign"
      rows="5"
      cols="30"
      placeholder="请输入个性签名"
    ></textarea>
    //密码的
    <input type="password" name="password" placeholder="密码" />
    
  • 单选框和复选框

    <label> <input type="radio" name="gender" value="male" /></label>
    <label> <input type="radio" name="gender" value="female" /></label>
    
    <input id="male" type="radio" name="gender" value="male" />
    <label for="male"></label>
    <input id="female" type="radio" name="gender" value="female" />
    <label for="female"></label>
    
    //复选
    <input type="checkbox" />
    
  • 选择菜单option(菜单) multiple(可滚动)

<select name="career" multiple>
  <option value="default">请选择职业</option>
  <option value="staff">公司职员</option>
  <option value="freelancer">自由职业者</option>
  <option value="student">学生</option>
  <option value="other">其他</option>
</select>
  • 按钮 button
<button>注册</button>
引入方式
  1. 行内样式 一行一个
  2. 内部样式抽离步骤
    1. 将每一个标签的CSS样式抽取出来
    2. 在head标签里声明一个标签
    3. 将样式放入style标签里
    4. 将相同标签的样式卸载相同的大括号里
  3. 外部样式
  4. 嵌套 将一套嵌套到一个整体中
  5. 复用 :mixin /include
    • 无参数混合
//css
.square {
  width: 100px;
  height: 100px;
}
//html
<div class="user-avatar square">...</div>
<div class="admin-avatar square">...</div>
//Sass
@mixin square {
  width: 100px;
  height: 100px;
}

// 应用:
.user-avatar {
  @include square;
}
.admin-avatar {
  @include square;
}

混合的目的:不用改动html代码(在元素中添加类名)

使用方法:“@mixin”:定义可复用的样式“@include”:应用可复用的样式

    • 有参数混合
//通过修改size来修改square的大小,该参数$size:value   来默认square的值
@mixin square($size) {
  width: $size;
  height: $size;
}

// 应用
.avatar {
  @include square(100px);
}

javascript

是一种专与网页交互设计的语言,主要由三部分组成:

  1. 核心(ECMAScript)

    由 语法,类型,语句,关键字,保留字,操作符,对象

  2. 文档对象模型(DOM)获取html标签,并给标签添加或者删除样式,并添加时间

    DOM遍历和范围:可以找到页面中的所有标签

    DOM时间:添加事件

    DOM样式:元素的样式

  3. 浏览器对象模型(BOM)

    弹出,移动,放缩,关闭浏览器等功能

  4. 位置,在html内部

    使用script标签嵌入JavaScript

// script标签嵌入JavaScript代码
<script>
    // JavaScript代码
    let name = "kimi";
    function(){
        console.log("我的名字叫:"+name);
    }
</script>

多字符拼接用“+ ”

  • 变量

    • 隐式转换
      1. 字符+数字 数字转换成字符串
      2. 字符做除了+的运算, 字符串转换成数字
    • 强制转换
      1. parseInt
      2. parseFloat 小数字符串,转化为小数
  • 对象:键值对

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-cBTduopn-1673275878162)(D:\1ar\youkedai\图片合集\图片11.png)]

    • 属性读取
console.log(person.name);
console.log(person['name']);
//增加属性
person.gender="male";
//删除属性
delete person.name;
    • 属性是否存在 :in
  • Object JSON Map的区别

    • JSON是一种轻量级的文本数据交换格式,用JavaScript的语法书写,但独立于这种语言,可以认为这是编程语言用于传递数据而约定的数据格式

      // 一个 JSON 字符串
      const jsonStr =
        '{"sites":[{"name":"Runoob", "url":"www.runoob.com"},{"name":"Google", "url":"www.google.com"},{"name":"Taobao", "url":"www.taobao.com"}]}';
      
      // 转成 JavaScript 对象
      const obj = JSON.parse(jsonStr);
      
    • Map和Object 相似,都可以保存键值对,但
      1. Object的键通常是字符串,但一个Map的键可以是任意值
      2. Map中的键值是有序的,而添加到对象中的键则不是
      3. Map的键值对个数可以直接获取,Object则要借助Object.keys()
      4. Map可以直接对进行迭代,Object则要借助Object.keys
      5. Map不存在键名和原型键名冲突问题,可以直接覆盖,Object不行
  • Math、Storage

Math.abs() // 绝对值
Math.ceil() // 向上取整
Math.floor() // 向下取整
Math.round() // 四舍五入取整
Math.max() // 最大值
Math.min() // 最小值
Math.pow() // 指数运算
Math.sqrt() // 平方根
Math.log() // 自然对数
Math.exp() // e的指数
Math.random() // 随机数
window.localStorage.setItem('myLocalStorage', 'storage Value');

window.localStorage.setItem(‘key’, ‘value’) 方法接受两个参数:

  1. key:键名;
  2. value:键值

两个参数都是字符串,不是字符串的参数会被转成字符串后再存入浏览器。

    • 清除缓存 clear
    • 读取数据getitem
  • String

    • 字符串长度 length

    • 查找字符 indexOf()

    • 去掉两端空格 trim()

    • 截取字符串 substring/substr

    • 分割字符串 :split

      [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-tA2MLCJH-1673275878169)(D:\1ar\youkedai\图片合集\图片12.png)]

  • Array

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-bozsTE56-1673275878170)(D:\1ar\youkedai\图片合集\图片13.png)]

  • BOM(浏览器对象模型)(Browser Object MOdel)

    • 有一系列相关对象构成,每个对象都提供了很多方法和属性
    • 对象
      1. window(窗口):是整个网页的框架,每个网页都是装在window里面
      2. navigator(浏览器):navigator里面存储浏览器相关信息
      3. history(历史):存储网页栈的
      4. screen(显示屏幕):硬件信息
      5. location(地址)当前访问的页面信息
  • DOM(文档对象模型)(Document Object Model)

    • 可以将Web页面与脚本或编程语言连接起来
    • 特性:
      1. 树根document,整个页面文档
      2. 每个HTML标签称为DOM节点,
      3. 每个HTML标签包裹的子标签,在树上体现为分支,儿子节点
      4. 以及树相关的知识点(数据结构)
  • 页面分析步骤

    1. 把涉及页面的静态页面写出
    2. 利用Javascript控制区域的显示和隐藏,达到动态效果
    3. 根据写好的静态页面模板和数据,动态创建DOM节点
  • dom事件

    • focus 表单组件获取焦点事件
    • burl 表单组件 失去焦点事件
    • click点击事件
    • dblclick 双击事件
    • mouse’down 按下任意鼠标按钮
    • mouseenter 指针移到有事件监听的元素内
    • mouseleave:指针移出元素范围外(不冒泡)。
    • mousemove: 指针在元素内移动时持续触发。
    • mouseover: 指针移到有事件监听的元素或者它的子元素内。
    • mouseout: 指针移出元素,或者移到它的子元素上。
    • mouseup: 在元素上释放任意鼠标按键。
    • keydown:键盘按下事件
    • keyup:键盘释放事件
    • scroll:文档滚动事件
    • resize:窗口放缩事件
  • 冒泡事件

    1. 点击事件触发监听
    2. 冒泡依次找到父节点,触发父节点的监听事件
    3. 依次冒泡到html结束
  • 捕获

    1. 父节点往下移动到点击的元素
  • 委托 类似于冒泡事件

Spring Web

maven

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-RTrarrUE-1673275878171)(D:\1ar\youkedai\图片合集\Maven核心概念.png)]

  • POM
    • 定义项目的类型、名字’
    • 管理依赖关系
    • 定制插件

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-e8Gl9E8D-1673275878171)(D:\1ar\youkedai\图片合集\图片14.png)]

  1. Maven 坐标

    <groupId>com.youkeda.course</groupId>
    <artifactId>app</artifactId>
    <packaging>jar</packaging>
    <version>1.0-SNAPSHOT</version>
    
  2. Maven 工程属性

    <properties>
        <java.version>1.8</java.version>
        <maven.compiler.source>${java.version}</maven.compiler.source>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <maven.compiler.target>${java.version}</maven.compiler.target>
    </properties>
    
  3. Maven 依赖

  4. Maven 插件

  • 依赖管理

    <dependencies>
        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>fastjson</artifactId>
            <version>1.2.62</version>
        </dependency>
        <dependency>
            <groupId>com.squareup.okhttp3</groupId>
            <artifactId>okhttp</artifactId>
            <version>4.2.2</version>
        </dependency>
    </dependencies>
    
  • 插件体系

    <build>
        <plugins>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-compiler-plugin</artifactId>
                <version>3.8.1</version>
            </plugin>
        </plugins>
    </build>
    

Spring强调面向接口编程

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-t8dVxTOc-1673275878172)(D:\1ar\youkedai\图片合集\图片15.png)]

调用MessageService 实例的getMessage()方法

在Spring中,想调用MessageService 可以直接从上下文获取,不需要关心它的实现类

如何实例化实现类,从而达到耦合

java 注释(Annotation)

本质上来说Annotation (注解)是Java推出的-种注释机制,和普通的注释有个显著的特Annotation是可以在编译、运行阶段读取的,注释很明显不可以。能够在编译、运行阶段读取信息,这就有很多的扩展空间,而环会污染源代码。可以借助它来实现一些增强功能,在Spring当中就重度使用了Annotation,通过运行阶段动态的获取Annotation从而完成很多自定义的行为,所以如果不了解Annotation,那学习Spring就没有办法进行下去了。从另外一个角度来看,Annotation 也是-个Java类,只是这个类太特殊了点。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-8khcjGJT-1673275878172)(D:\1ar\youkedai\图片合集\图片16.png)]

  1. target :只有一个数组属性,用于设定该注解的目标范围,比如说可以作用于类或者方法等。因为是数组,所以可以同时设定多个范围具体可以作用的类型配置在java. lang. annotation. ElementType

  2. Retebtion :用于声明注解的生命周期,即有效性。1.SOURCE:也就是说是纯注释作用2.CL ASS:也就是在编译阶段是有效的3.RUNTIME:在运行时有效

  3. Documented :将注解中的元素包含到JavaDoc文档中

  4. @interface 就是声明当前java类型是Annotation ,固定语法

  5. Annotation的属性有点像类的属性一样,它约定了属性的类型(这个类型是基础类型: String、 boolean、 int、 long), 和属性名称(默认名称是value,在引用的时候可以省略),default 代表的是默认值。

spring bean

IoC (Inversion of Control 控制反转)容器时Spring框架最最核心的组件,没有IoC容器就没有Spring框架

通过依赖注入(Dependency injection)来实现IoC,获取Bean的实例直接从IoC容器中获取,不需要关心实现类

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-6OlEVhH1-1673275878172)(D:\1ar\youkedai\图片合集\图片17.png)]

//启动IoC容器
ApplicationContext context = 
    new AnnotationConfigApplicationContext("fm.douban");

Spring 官方声明为Spring Bean 的注解有如下

  • org.springframework.stereotype.Service 扩展自Component 代表Service Bean
  • org.springframework.stereotype.Component 是通用的Bean 注解
  • org.springframework.stereotype.Controller Web Bean
  • org.springframework.stereotype.Repository 持久化相关Bean

依赖注入

  1. 完成容器的启动

  2. 完成依赖注入行为

  3. 作用,让Spring 系统自动管理各种实例

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-CPCj8Ugb-1673275878173)(D:\1ar\youkedai\图片合集\图片18.png)]

Spring Resource

把本地文件、classpath文件,远程文件都封装成Resource 对象统一加载

Spring Boot

核心还是spring,web服务器做了什么

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-iY6VUdRd-1673275878173)(D:\1ar\youkedai\图片合集\图片19.png)]

在Spring Boot方案里,一个网页请求到了服务器后,首先进入的是JavaWeb服务器,再进入SpringBoot应用,最后匹配到某一个Spring Controller,然后路由到具体摸一个bean的方法,执行完后返回结果输出到客户端

  • http网络中对重要的协议
    • get
    • post

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-2NadV7dT-1673275878174)(D:\1ar\youkedai\图片合集\图片20.png)]

  • thymeleaf 是一个模板框架吗,支持多种格式内容的动态晕染,和html相融合-

    • 初始化 添加Maven依赖

    • <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-thymeleaf</artifactId>
      </dependency>
      
    • th代表thymeleaf语法

    • th:each 循环语句

    • <ul th:each="song,it: ${songs}">
        <li>
          <span th:text="${it.count}"></span>
          <span th:text="${song.name}"></span>
        </li>
      </ul>
      
    • th:if 条件语句

    • //${xxx}是固定语法
      <span th:text="${msg}">Hello</span>
      
  • Spring Validation

    • JSR java Specification Requests 380:java规范提案。指JCP java community process 提出新增一个标准化技术规范的正式请求。

      <dependency>
        <groupId>jakarta.validation</groupId>
        <artifactId>jakarta.validation-api</artifactId>
        <version>2.0.1</version>
      </dependency>
      <dependency>
          <groupId>org.springframework.boot</groupId>
          <artifactId>spring-boot-starter-validation</artifactId>
      </dependency>
      
    • 创建一个表单页 user/addUser.html模板文件

  • thymeleaf layout

    • th:include=“::content”是选择器

    • th:replace=“layout”页面会替换成layout

    • th:fragment=“content”

      <div th:fragment="content">
      </div>
      
  • Spring Boot ComponentScan

  • 使用日志系统,两大步骤

    • 配置 修改Spring Boot 系统的标准配置文件: application.properties(在项目的 src/main/resources/ 目录下),增加日志级别配置:logging.level.root=info

    • 编码

      import org.slf4j.Logger;
      import org.slf4j.LoggerFactory;
      import org.springframework.web.bind.annotation.RestController;
      import javax.annotation.PostConstruct;
      
      @RestController
      public class SongListControl {
          private static final Logger LOG = LoggerFactory.getLogger(SongListControl.class);
      
          @PostConstruct
          public void init(){
              LOG.info("SongListControl 启动啦");
          }
      }
      
Spring Session
  • Cookie类的构造函数,第一个参数是cookie名称,第二个参数是coolie值。其他的属性,需要根据实际情况和具体的业务需求决定。

  • 但是重要信息放入cookie,会带来安全隐患,不超过4kb

  • Session机制可以解决安全问题,放在服务端,没有限制,

  • 依赖

    <!-- spring session 支持 -->
    <dependency>
        <groupId>org.springframework.session</groupId>
        <artifactId>spring-session-core</artifactId>
    </dependency>
    
Spring Request 拦截器(HandlerInterceptor)
  1. 创建拦截器HandlerInterceptor 接口。可以在三个点进行拦截:
    1. Controller方法执行之前。这是最常用的拦截点。例如是否登录的验证就要在 preHandle() 方法中处理。
    2. Controller方法执行之后。例如记录日志、统计方法执行时间等,就要在 postHandle() 方法中处理。
    3. 整个请求完成后。不常用的拦截点。例如统计整个请求的执行时间的时候用,在 afterCompletion 方法中处理。
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;

public class InterceptorDemo implements HandlerInterceptor {

  // Controller方法执行之前
  @Override
  public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {

    // 只有返回true才会继续向下执行,返回false取消当前请求
    return true;
  }

  //Controller方法执行之后
  @Override
  public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler,
      ModelAndView modelAndView) throws Exception {

  }

  // 整个请求完成后(包括Thymeleaf渲染完毕)
  @Override
  public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {

  }
}
preHandle()` 方法的参数中有 `HttpServletRequest` 和 `HttpServletResponse`,可以像 `control` 中一样使用 `Session
  1. 实现 WebMvcConfigurer
Spring Data CRUD,类似于数据库
  1. 新增数据 插入mongoTemplate.insert()

  2. 查询数据 findById() mongoTemplate.findById(songId, Song.class)

  3. 修改数据

    // 修改 id=1 的数据
    Query query = new Query(Criteria.where("id").is("1"));
    
    // 把歌名修改为 “new name”
    Update updateData = new Update();
    updateData.set("name", "new name");
    
    // 执行修改,修改返回结果的是一个对象
    UpdateResult result = mongoTemplate.updateFirst(query, updateData, Song.class);
    // 修改的记录数大于 0 ,表示修改成功
    System.out.println("修改的数据记录数量:" + result.getModifiedCount());
    
  4. 删除数据

Song song = new Song();
song.setId(songId);

// 执行删除
DeleteResult result = mongoTemplate.remove(song);
// 删除的记录数大于 0 ,表示删除成功
System.out.println("删除的数据记录数量:" + result.getDeletedCount());

前端的

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

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值