Web开发基础知识

前端

HTML,CSS

JavaScript

基础语法
  • 定义变量

    • let

  • 处理字符串

    • 在 字符串 中找 字符

    • let x = "ZoranSunburst";
      x[0];
      // x[0]=Z
    • 在 字符串 中找 子字符串

      • 一些方法:

        • .length:获取字符串长度

        • .indexOf(“…”):获取子字符串的首个字符在字符串中的索引,不存在这个子字符串时,会返回-1

        • .slice()

          • .slice(x,y)

            • 获取从x索引开始到索引为y的字符结束的子字符串

          • .slice(x)

            • 获取从x索引开始到字符串结束的子字符串

        • .toLowerCase()

          • 把字符串中所有字符转换为小写字母

        • .toUpperCase()

          • 把字符串中所有字符转换成大写字母

        • .replace(“xxx”,”yyy”)

          • 将字符串中xxx,替换成yyy

后端

SpringBoot入门

简述

  • 世界上最流行的web框架技术

  • 快速搭建一个web项目

idea中简单配置

  1. 创建工程勾选spring initializr

    由于3.x的spring boot只支持Java17以上的版本,所以将Server URL改为阿里云,不使用官网

  2. 选择Java,Maven(Java版本根据需求选择)

    如果需要修改坐标也可以一并修改

  3. 在依赖页中勾选Web –> Spring Web(在使用Java8、Java11时,选择2.x版本的spring boot)

http协议

这一块儿需要p60-p63多听几次,多记一下

  • http请求

    • GET 、POST 请求的区别

      • GET 请求有大小限制,参数放在请求行中

      • POST 无大小限制,参数在请求体中

    • 请求行

      • 请求方式(GET/POST),资源路径,协议

      • get请求的请求参数放在这里

    • 请求头

      • 格式:key : value

    • 请求体

      • post请求特有,存放请求参数

  • http响应

    • 相应结构

      • 响应行

        • 协议,状态码,描述

      • 响应头

        • 第二行开始,格式:key:value

      • 响应体

        • 最后一部分,存放响应数据

    • http 协议状态代码

      • 最常用代码:

        • 200 –> OK –> 正常运行

        • 404 –> URL NO FOUND –> 找不到请求的地址

        • 503 –> 服务器出现了一些问题

    • http协议解析

      • 不懂

Tomcat

  • 是web应用服务器

  • 也被称之为Web容器,Servlet容器

使用tomcat
  • spring boot的起步依赖已经内嵌了tomcat服务器

    原理是maven 依赖传递

请求

  • 原始方法获取参数

    • Controller方法形参中声明HttpServletRequest对象

    • 调用对象的getParameter(参数名)

  • SpringBoot请求简单参数

    • servlet方式请求响应

    • spring boot方式请求

  • @RquestParam 注解

    • 方法形参名称与请求参数名称不匹配,通过该注解完成映射

    • 该注解的required属性默认是true,代表请求参数必须传递

  • 数组集合参数

    • 数组:请求参数名与形参中数组变量名一致

    • 集合:请求参数名与形参中集合变量名相同,通过@RquestParam 注解绑定参数关系

  • 日期参数

  • json参数

    • POST请求

    • 在请求体中

    • raw

    • 一般使用实体对象接受json,key键名要和形参属性名一致

  • 路径参数

    • 使用@PathVariable接收参数,请求路径格式:”/path/{…}/{…}/…”

    几种常见的HTTP请求的应用场景: Get:查看,具有幂等性,发起无论多少次get请求都不会改变服务器资源

    Post:创建,非幂等,通常用于创建新资源,如注册用户,发布帖子,请求订单

    Put:更新,具有幂等性,整体替换资源,而不是部分更新,请求正确执行的

    Delete:删除

响应 p73

  • Controller的作用就是发出请求,设置响应数据

设置响应

  • return 设置响应的内容

    • 可以返回字符串给浏览器

    • 可以返回对象给浏览器(返回的结果会是一个json格式的数据 )

  • 设置了注解为RespondBody的类的返回值都会是响应的数据

    • 元注解是修饰注解的注解

  • @

响应实例

  • Springboot项目的静态资源(html,css,js….)默认存放目录是:classpath:/static、classpath:/public、classpath:/resources

    • classpath指的是类路径

分层解耦

  • 三层架构

    • 单一职责原则

    • 什么是三层架构

      • 控制层(Controller)

        • 接收前端发送的请求,处理请求,响应数据

      • 业务逻辑层(Service)

        • 处理具体业务逻辑

      • 数据访问层(持久层)(Dao)

        • 负责数据访问操作,包括i增删改查

  • 分层解耦

  • IOC & DI入门

    • 控制反转(IOC):对象的创建控制权由程序自身转移到外部(容器)

    • 依赖注入(DI):容器为应用程序提供运行时,所依赖的资源,称之为依赖注入

    • Bean对象:IOC容器中创建,管理的对象,称之为bean

  • IOC详解

  • DI详解

听不懂听不进去哈哈哈完蛋了

Mybatis

  • 持久层开发(Dao)框架,用于简化JDBC的开发(减少代码编写)

  • Mybatis可以写sql

案例 -> 使用Mybatis查询所有用户数据

  • 步骤

    1. 创建springboot工程,数据库表uesr,实体类User

    2. 引入Mybatis依赖,配置Mybatis

    3. 编写sql(注解/XML)

      • 在使用注解方式时,使用@Mapper注解标注为持久层接口(数据访问层DAO的接口,也叫Mapper接口),定义方法后也要在注解上标明执行的sql类型(查询语句的注解为@Select,并在注解后的括号内写入SQL语句),SQL执行结果会自动封装到方法返回值

      • 只需要定义接口,不需要编写实现类,Mybatis会自动生成对应的实现类

  • 在连接Mybatis时,和jdbc的连接逻辑一致,需要配置:

    • 驱动

    • URL

    • 用户名

    • 密码

Lombok

简化实体类程序,省略编写getset方法,构造方法等方法,可以自动生成日志变量

最常用的注解是@Data(提供@Getter+@Setter+@ToString+@EqualsAndHashCode)

Mybatis基础操作(增删改查)

什么是pojo?po,vo是什么?

“Plain Old Java Object”“简单java对象”。POJO的内在含义是指那些没有从任何类继承、也没有实现任何接口,更没有被其它框架侵入的java对象。

PO是指持久对象(persistant object持久对象)。

VO是指值对象或者View对象(Value Object、View Object)。View Object。

  • 如果Mapper接口方法形参只有一个普通类型的参数,#{…}里面的属性名可以随便写,如#{id},#{value},但是建议无论如何都保持两者一致

  • Mapper注解会为Mapper接口创建代理对象,并将代理对象放入IOC容器

SQL预编译
  • 防止sql注入问题

  • 在定义SQL的时候使用 #{} 占位符就可以生成预编译SQL

    有两种参数占位符:#{}、${}

    #{}:

    1. 执行SQL时会把#{…}替换成?,生成预编译SQL,自动设置参数值

    2. 使用时机:参数传递,都使用#{…}

    ${}:

    1. 拼接SQL,直接将参数拼接在SQL语句中,存在SQL注入的问题

    2. 使用时机:如果对表名,列表进行动态设置时使用

    3. 相较于前者,它生成的不是预编译的SQL,性能会低,且存在SQL注入的风险

mybatis删除操作

  1. Mapper接口类中:

     //根据ID删除数据
     @Delete("DELETE FROM emp.emp WHERE id = #{id}")
        //public int delete(Integer id);
     //参数占位符:#{参数}
     public void delete(Integer id);
  2. Test 测试类中:

     @Autowired
     private EmpMapper empMapper;
     @Test
     public void testDelete() {
    ​
    //        int delete = empMapper.delete(16);
    //        System.out.println(delete);
         empMapper.delete(16);
     }

mybatis添加操作

  1. Mapper接口类

@Insert("INSERT INTO emp.emp(username, name, gender, image, job, entrydate, dept_id, create_time, update_time)" + "VALUES (#{username},#{name},#{gender},#{image},#{job},#{entrydate},#{deptId},#{createTime},#{updateTime})")
public void insert(Emp emp);
  1. Test类

@Test
public void testInsert(){
 //Construct Emp object
 Emp emp = new Emp();
 emp.setUsername("Taylor");
 emp.setName("斯威夫特");
 emp.setImage("1.jpg");
 emp.setGender((short)2);
 emp.setJob((short)1);
 emp.setEntrydate(LocalDate.of(2000,1,1));
 emp.setCreateTime(LocalDateTime.now());
 emp.setUpdateTime(LocalDateTime.now());
 emp.setDeptId(1);
​
 //Add new emp
 empMapper.insert(emp);
 //这个是调用empMapper接口类中的insert方法,向emp表插入了一个emp对象
}
  1. 主键返回

    • 在数据添加成功后,需要获取插入数据库数据的主键。如:添加套餐数据时,还需要维护套餐菜品关系表数据

@Options(useGeneratedKeys = true,keyProperty = "id")
@Insert("INSERT INTO emp.emp(username, name, gender, image, job, entrydate, dept_id, create_time, update_time)" + "VALUES (#{username},#{name},#{gender},#{image},#{job},#{entrydate},#{deptId},#{createTime},#{updateTime})")
public void insert(Emp emp);

就是在方法的上面加上一个Option注解,指定两个属性:useGeneratedKeys ,keyProperty

mybatis更新

  • 更新分为查询和更新两个部分

  • 代码大体上跟插入操作一致,只是在Mapper接口类中要用@Update注解

@Update("UPDATE emp.emp SET username = #{username}, name = #{name}, gender = #{gender}, image = #{image}, job = #{job}, entrydate = #{entrydate}, dept_id = #{deptId}, update_time = #{updateTime} WHERE id = 1;")
public void update(Emp emp);
​
// 测试类代码
​
​
 @Test
 public void testUpdate(){
     //Construct Emp object
     Emp emp = new Emp();
     emp.setId(13);
     emp.setUsername("OldTaylorSwift");
     emp.setName("旧泰勒斯威夫特");
     emp.setImage("1.jpg");
     emp.setGender((short)2);
     emp.setJob((short)1);
     emp.setEntrydate(LocalDate.of(2000,1,1));
     emp.setCreateTime(LocalDateTime.now());
     emp.setUpdateTime(LocalDateTime.now());
     emp.setDeptId(1);
​
     //Add new emp
     empMapper.update(emp);
 }
​

mybatis查询(根据ID查询)

  • 数据封装

    • 表中字段名和实体类的属性名一致时,可以自动进行封装

    • 不一致时无法封装

      • 解决不能自动封装的方法:

        1. 给字段起别名,让别名和实体类属性名一致

        2. 使用@Results,@Result注解手动映射封装(只用对字段名和实体类的属性名不一致的字段单独标注)

        3. 开启mybatis的驼峰命名自动映射开关(最好用这个方法)

        • 下划线命名会自动映射成驼峰命名

        • e.g. a_column –> aColumn

        • 在application.properties文件中输入camel,会自动联想这个开关

mybatis查询(条件查询)

  • 查询结果可能是多个对象,要用List集合进行对象的封装

  • 接口方法:

    @Select("SELECT * FROM emp.emp WHERE name LIKE '%${name}%' and gender = #{gender} and entrydate BETWEEN #{begin} AND #{end} ORDER BY update_time DESC ")
    public List list(@Param("name")String name, @Param("gender")Short gender, @Param("begin")LocalDate begin, @Param("end")LocalDate end);

XML映射文件

  • 作用是编写sql语句

  • 三点规范

    1. XML映射文件的名称与Mapper接口名称一致,并且将XML映射文件和Mapper接口放置在相同包下(同包同名)

    2. XML映射文件的namespace属性为Mapper接口全限定名一致

      • 这个接口全限定名的获取方法:关于web学习的一些过程记录插图

    3. XML映射文件中sql语句的id与Mapper接口中的方法名一致,并保持返回类型一致

      • 当有返回值时,比如SELECT语句,就要额外加上“resultType”属性值,输入返回值的类型(要全限定名,获取方式跟上图一样)关于web学习的一些过程记录插图(1)

  • 遇到的问题与解决:mybatis常见异常:Invalid bound statement (not found): com.ruoyi.news.mapper.RuoyiNewsMapper.selectRuoyiNe_invalid bound statement (not found): com.ruoyi.sys-CSDN博客

    总结:需要让xxxmapper.xml的层级结构和xxxmapper.class完全一致!否则在生成的target目录下就会发生错乱

动态SQL

  • 随着用户输入或者外部条件而变化的SQL叫动态SQL

  • 动态SQL的三个标签

      • 使用test属性进行条件判断

      • 条件成立时拼接sql,否则不拼接

      where 标签作用

      1. 动态生成where关键字

      2. 自动去除条件前多余的or或者and

      3. 当where标签内所有条件都不成立时,连where子句都不会生成!

    1. 未完待续 : )

concat 函数 –> MySQL中字符串拼接函数

本站无任何商业行为
个人在线分享 » 关于web学习的一些过程记录
E-->