当前位置: 首页 > news >正文

织梦可以做哪些类型型网站做小程序怎么赚钱

织梦可以做哪些类型型网站,做小程序怎么赚钱,设计素材网站推荐pin,网站定制开发合同文章目录 学习路线MavenMaven 坐标依赖管理生命周期 1. Web入门HTTP协议Tomcat 2. 请求响应- 请求1. 简单参数2. 实体参数3. 数组集合参数4. 日期参数5.Json参数6.路径参数- 响应响应数据 3.分层解耦三层架构分层解耦IOC DI入门IOC详解DI详解 4. MySQL数据库设计1. MySQL… 文章目录 学习路线MavenMaven 坐标依赖管理生命周期 1. Web入门HTTP协议Tomcat 2. 请求响应- 请求1. 简单参数2. 实体参数3. 数组集合参数4. 日期参数5.Json参数6.路径参数- 响应响应数据 3.分层解耦三层架构分层解耦IOC DI入门IOC详解DI详解 4. MySQL数据库设计1. MySQL概述2. 数据库设计-DDL数据库操作1. 数据库操作-DML2. 数据库查询操作-DQL3. 多表设计4. 多表查询5. 事务数据库优化1. 索引 5. Mybatis5.1 Mybatis入门1. 快速入门2. JDBC介绍3. 数据库连接池4. lombok 5.2 Mybatis基础增删改查根据主键删除新增更新查询条件查询 5.3 XML映射文件5.4 Mybatis动态SQLifforeachsqlinclude 6. 案例6.1 环境搭建6.2 员工管理分页查询 6.3 文件上传本地存储云存储 6.4 配置文件参数配置化yml配置文件(推荐ConfigurationProperties 7. 登录校验7.1 登录标记会话技术 7.2 统一拦截过滤器Filter拦截器Intercepter 7.3 异常处理全局异常处理器 8. 事务管理AOP事务管理Spring事务管理事务进阶 AOP基础AOP概述实现AOP核心概念 AOP进阶1.通知类型2.通知顺序3.切入点表达式4.连接点 9. Springboot原理9.1 配置优先级9.2 Bean管理获取beanbean作用域第三方bean 9.3 SpringBoot原理起步依赖原理自动配置原理Web后端开发-总结 10. Maven高级10.1 分模块设计与开发10.2 继承与聚合继承聚合 10.3 私服介绍资源上传与下载 Written with StackEdit中文版. 学习路线 html、css、js -- Ajax、Axios --Vue、Element–前端工程化Vue脚手架 Maven–Springboot基础基于Springboot进行讲解Spring的IOC、DI等–Springboot SpringMVC基础–MySQL基于产品原型和需求分析设计数据库表–JDBC Mabatis–Web案例基于Springboot整合SSM根据页面原型、需求、接口文档编写接口–会话跟踪技术Cookie、Session令牌技术JWT–Filter Intercepter令牌的统一拦截校验–ADP–Springboot原理 Maven jdk 11 构建和管理java项目的工具 项目对象模型POM Maven 坐标 groupid:maven项目隶属组织名称通常是域名反写 artifactid version 依赖管理 依赖传递 直接依赖-间接依赖 A依赖BB依赖C那么A会依赖C排除依赖exclusionsexclusion主动断开依赖的资源被排除的资源无需指定版本依赖范围 依赖的jar包默认情况下可以在任何地方使用可以通过scope...scope 设置其作用范围 主程序范围有效main文件夹范围内测试程序范围有效test文件夹范围内是否参与打包运行package指令范围内 生命周期 maven的生命周期是为了对所有的maven项目构建过程进行抽象和统一 maven有三套独立的生命周期 clean清理工作default核心工作如编译、测试、打包、安装、部署等site生成报告、发布站点等 在同一套生命周期中阶段是有顺序的后面的阶段依赖于前面的阶段。运行后面的阶段时前面的阶段都会运行 1. Web入门 HTTP协议 超文本传输协议规定了浏览器和服务器之间数据传输的规则 请求协议 请求行请求方式、资源路径、协议 请求头 请求体POST请求存放请求参数 GET请求请求参数在请求行中没有请求体。GET请求大小有限制 POST请求请求参数在请求体中POST请求大小没有限制 响应协议 响应行 响应头 响应体 响应行 200 404 500 响应头 状态码大全 https://cloud.tencent.com/developer/section/1190137 协议解析 Tomcat web服务器对http协议进行封装 Tomcat 轻量级Web服务器支持Servlet/JSP少量JavaEE规范。也被称为web容器、servlet容器 起步依赖 包含了对应业务开发所需要的常见依赖内嵌Tomcat服务器 2. 请求响应 前端发出的请求都会先传给DispatcherServlet前端控制器DispatcherServlet再转给Controller程序。 TomCat会对前端的请求进行解析并将解析后的所有信息封装到HttpServletRequest对象中。根据HttpServletResponse对象设置要响应的数据。 请求HttpServletRequest获取请求数据响应HttpServletResponse设置相应数据BS架构Browser/Server浏览器/服务器架构模式。客户端只需要浏览器应用程序的逻辑和数据都存储在服务端CS架构Client/Server客户端/服务器架构模式 - 请求 1. 简单参数 原始方式 在原始的web程序中获取请求参数需要通过HttpServletRequest对象手动获取 繁琐、手动类型转换Springboot方式 简单参数参数名与形参变量名相同定义形参即可接收参数 在接受过程中会自动进行类型转换RequestParam注解 如果方法形参名称与请求参数名称不匹配可以使用RequestParam完成映射RequestParam中的required属性默认为true代表该请求参数必须传递。如果该参数是可选的可以将required设置为false。 public String simpleParam(RequestParam(name name,required false) String username, Integer age){ // 获取请求参数 System.out.println(username:age); return OK; }2. 实体参数 简单实体对象 请求参数名与形参对象属性名相同定义POJO接收即可复杂实体对象 请求参数名与形参对象属性名相同按照对象层次结构关系即可接收嵌套POJO属性参数RequestMapping(/complexPojo) public String complexPojo(User user){ System.out.println(user); return OK; }3. 数组集合参数 数组参数 请求参数名与形参数组名称相同且请求参数为多个定义数组类型形参即可接收参数RequestMapping(/arrayParam) public String arrayParam(String[] hobby){ System.out.println(Arrays.toString(hobby)); return OK; }集合参数 请求参数名与形参集合名称相同且请求参数为多个RequestParam绑定参数关系 默认封装到数组集合如果要用list就要加上注解RequestMapping(/listParam) public String listParam(RequestParam ListString hobby){ System.out.println(hobby); return OK; }4. 日期参数 使用DataTimeFormat注解完成日期参数格式转换存到LocalDateTime对象中RequestMapping(/dataParam) public String dataParam(DateTimeFormat(pattern yyyy-MM-dd HH:mm:ss) LocalDateTime updateTime){ System.out.println(updateTime); return OK; }5.Json参数 JSON数据键名与形参对象属性名相同定义POJO类型形参即可接收参数需要使用RequestBody标识 RequestMapping(/jsonParam) public String jsonParam(RequestBody User user){ System.out.println(user); return OK; }6.路径参数 通过请求URL直接传递参数使用{…}来标识该路径参数需要使用PathVariable获取路径参数RequestMapping(/path/{id}) public String pathParam(PathVariable Integer id){ System.out.println(id); return OK; }RequestMapping(/path/{id}/{name}) public String pathParam2(PathVariable Integer id,PathVariable String name){ System.out.println(id:name); return OK; }- 响应 响应数据 ResponseBody 类型方法注解、类注解 位置Controller方法上/类上 作用将方法返回值直接响应如果返回值类型是 实体对象/集合将会转换成JSON格式响应 说明RestControllerControllerResponseBody统一响应结果 Result对象 Result(code,msg,data) 3.分层解耦 三层架构 Controller控制层接受前端发送到请求对请求进行处理并响应数据Service业务逻辑层处理具体的业务逻辑Dao数据访问层Data Access Object持久层负责数据访问操作包括数据的增、删、改、查 分层解耦 内聚软件中各个功能模块内部的功能联系耦合软件中各个层/模块之间的依赖、关联程度软件设计原则高内聚低耦合 在容器里放耦合代码谁需要调用就来容器里面调用 控制反转Inversion of ControlIOC 对象的创建控制权由程序自身转移到外部容器依赖注入Dependency InjectionDI 容器为应用程序提供运行时所依赖的资源称之为依赖注入Bean对象IOC容器内创建、管理的对象称之为bean IOC DI入门 Service层及Dao层的实现类交给IOC容器管理 添加Component注解 Component 将当前类交给IOC容器管理成为容器中的bean为Controller及Service注入运行时依赖的对象添加Autowired注解 IOC详解 要把某个对象交给IOC容器管理需要在对应类上加上如下注解之一 ComponentControllerServiceRepository 声明bean的时候可以通过value属性指定bean的名字没有指定时默认类名是类名首字母小写声明控制器bean只能用Controller组件扫描Bean组件扫描 声明bean的四大注解需要被组件扫描注解ComponentScan扫描ComponentScan注解虽然没有显示配置但实际上已经包含在了启动类生命注解SpringBootApplication中默认扫描的范围是启动类所在包及其子包 DI详解 Autowired注解默认按照类型进行如果存在多个相同类型的bean就会报错解决方案 Primary 想让哪个生效就在哪个类前加该注解Qualifier 在Autowired前添加Qualifier(“类名首字母小写”)Resource 按照名称进行Resource(name“类名首字母小写”) Resource 与 Autowired 区别 Autowired 是spring框架提供的注解而Resource是JDK提供的注解Autowired 默认是按照类型注入而Resource默认按照名称注入 4. MySQL DBMS 数据库管理系统 数据库设计 1. MySQL概述 企业开发使用方式 net start mysql80mysql -u用户名 -p密码 [-h数据库服务器IP地址 -P端口号]数据模型 关系型数据库RDBMS建立在关系模型基础上由多张相互连接的二维表组成的数据库创建数据库 create database db01; 创建表结构 SQL简介 分类用途DDL数据定义语言操作表结构DML数据操作语言增删改DQL数据查询语言DCL数据控制语言创建用户、控制访问权限 2. 数据库设计-DDL 数据库 查询 查询所有数据库show databases; 查询当前数据库select database();使用 use 数据库名;创建 create database [if not exists] 数据库名;删除 drop database [if exists] 数据库名;上述语法中的database也可以替换成schema []代表可写可不写 数据类型 数值类型、字符串类型、日期时间类型 DDL 表创建、查询、修改、删除 创建 create table 表名(字段1 字段类型 [约束] [comment 字段1注释]......字段n 字段类型 [约束] [comment 字段n注释])[comment 表注释];约束是作用于表中字段上的规则用于限制存储在表中的数据。保证数据库中数据的正确性、有效性和完整性 create table tb_user( id int primary key comment ID 唯一标识, username varchar(20) not null unique comment 用户名, name varchar(10) not null comment 姓名, age int comment 年龄, gender char(1) default 女 comment 性别 )comment 用户表;查询 查询当前数据库所有表 show tables; 查询表结构 desc 表名; 查询建表语句 show create table 表名;修改 添加字段alter table 表名 add 字段名 类型(长度) [comment 注释] [约束]; 修改字段类型 alter table 表名 modify 字段名 新数据类型(长度) 修改字段名和字段类型 alter table 表名 change 旧字段名 类型(长度) [comment 注释] [约束]; 删除字段 alter table 表名 drop column 字段名; 修改表名 rename table 表名 to 新表名;删除drop table [if exits] 表名;datalog 图形化界面 intelliJ IDEA 嵌入 数据库操作 1. 数据库操作-DML Data Munipulation Language 添加数据INSERT 指定字段添加数据:insert into 表名 (字段名1,字名2) values(值1,值2); 全部字段添加数据:insert into 表名 values (值1,值2,….); 批量添加数据(指定字段):insert into 表名(字段名1,字段名2) values (值1,值2),(值1,值2); 批量添加数据(全部字段):insert into 表名 values(值1,值2,...),(值1,值2,...);修改数据UPDATE 修改数据:update 表名 set 字段名1值1,字段名2值2,…[where 条件];删除数据DELETEdelete form 表名 [where 条件]DELETE语句不能删除某一个字段的值(如果要操作可以使用UPDATE将该字段的值置为NULL 2. 数据库查询操作-DQL 关键字 SELECT 基本查询 查询多个字段select 字段1,字段2,字段3 from 表名;查询所有字段通配符select * from 表名; *号尽量不使用设置别名select 字段1 as 别名1,字段2 as 别名2 from 表名; as可省略去除重复记录select distinct 字段列表 from 表名; 条件查询 select 字段列表 from 表名 where 条件列表;聚合函数 将一列数据作为一个整体进行纵向计算 不能对null值进行计算 select 聚合函数(字段列表) from 表名;函数功能count统计数量max最大值min最小值sum求和avg平均值 count count()推荐、 count(常量)、 count(列名) COUNT(常量) 和 COUNT()表示的是直接查询符合条件的数据库表的行数 分组查询 select 分组字段[聚合函数] from 表名 [where 条件] group by 分组字段名 [having 分组后过滤条件];/*先查询入职时间在2015-01-01(包含)以前的员工,并对结果根据职位分组,获取员工数量大于等于2的职位*/ select job,count(*) from tb_emp where entrydate2015-01-01 group by job having count(*)2;where与having区别 执行时机不同where是分组之前进行过滤不满足where条件不参与分组;而having是分组之后对结果进行过滤。 判断条件不同where不能对聚合函数进行判断而having可以。注意事项 分组之后查询的字段一般为聚合函数和分组字段查询其他字段无任何意义 执行顺序where聚合函数having 排序查询 select 分组字段[聚合函数] from 表名 [where 条件] group by 分组字段名 order by 字段1 排序方式1,字段2 排序方式2 ...;排序方式ASC升序默认值DESC降序如果是多字段排序当第一个字段值相同时才会根据第二个字段进行排序。 分页查询 select 字段列表 from 表名 limit 起始索引,查询记录数;起始索引从0开始起始索引(查询页码-1)*每页显示记录数。分页查询是数据库的方言不同的数据库有不同的实现MySOL中是LIMIT。如果查询的是第一页数据起始索引可以省略直接简写为limit 10。 select if(gender1,女性员工,男性员工)性别,count(*) from tb_emp group by gender;3. 多表设计 一对多 一对多关系实现在数据库表中多的一方添加字段来关联一的一方的主键 外键约束 –创建表时指定 create table 表名(字段名 数据类型...[constraint][外键名称]foreign key(外键字段名)references 主表(字段名) );--建完表后添加外键 alter table 表名 add constraint 外键名称 foreign key(外键字段名)references 主表(字段名)缺点 影响增、删、改的效率(需要检查外键关系)仅用于单节点数据库不适用与分布式、集群场景。 容易引发数据库的死锁问题消耗性能。 一对一 案例用户 与 身份证信息 的关系关系一对一关系多用于单表拆分将一张表的基础字段放在一张表中其他字段放在另一张表中以提升操作效率实现在任意一方加入外键关联另外一方的主键并且设置外键为唯一的(UNIQUE) 多对多 实现建立第三张中间表中间表至少包含两个外键分别关联两方主键 4. 多表查询 笛卡尔积 select * from tb_emp,tb_dept; 消除无效的笛卡尔积 select * from tb_emp,tb_dept where tb_emp.dept_idtb_dept.id;连接查询 内连接查询A、B交集数据 隐式内连接:select字段列表 from 表1,表2where 条件...查询员工的姓名及所属的部门名称 select tb_emp.name,tb_dept.name from tb_emp,tb_dept where tb_emp.dept_idtb_dept.id; 起别名 select e.name,d.name from tb_emp e,tb_dept d where e.dept_idd.id;显式内连接:select字段列表 from 表1[inner]join 表2 on 连接条件...select tb_emp.name,tb_dept.name from tb_emp inner join tb_dept on tb_emp.dept_id tb_dept.id;外连接 左外连接以左表为基准完全包括左表的数据和交集数据 select 字段列表 from 表1 left [outer]join 表2 on 连接条件 …;右外连接以右表为基准完全包括右表的数据和交集数据 select 字段列表 from 表1 right [outer]join 表2 on 连接条件...; 子查询 介绍SQL语句中嵌套select语句称为嵌套查询又称子查询。 形式select *from tl where column1(select columnl from t2 ... ); 子查询外部的语句可以是insert/update/delete/select 的任何一个最常见的是 select。 标量子查询:子查询返回的结果为单个值 常用操作符 select * from tb_emp where dept_id (select id from tb_dept where name教研部) ;列子查询:子查询返回的结果为一列 常用操作符in、not in select * from tb_emp where dept_id in (select id from tb_dept where name 教研部 or name咨询部);行子查询:子查询返回的结果为一行 常用操作符 in not in select * from tb_emp where (entrydate,job) (select entrydate,job from tb_emp where name韦一笑);表子查询:子查询返回的结果为多行多列 常见操作符in select *,tb_dept.name from (select * from tb_emp where entrydate 2006-01-01) e ,tb_dept where tb_dept.id e.dept_id; 5. 事务 事务 是一组操作的集合它是一个不可分割的工作单位。事务会把所有的操作作为一个整体一起向系统提交或撤销操作请求即这些操作 要么同时成功要么同时失败。 事务控制 开启事务:start transaction;/begin;提交事务:commit;回滚事务:rollback; 四大特性ACID 数据库优化 1. 索引 索引(index)是帮助数据库 高效获取数据 的 数据结构 介绍 优缺点 优点降低查询排序成本 缺点降低增删改效率 结构 MySQL数据库支持的索引结构有很多如:Hash索引、BTree索引、Ful-Text索引等。我们平常所说的索引如果没有特别指明都是指默认的 BTree 结构组织的索引。 BTree(多路平衡搜索树) 每一个节点可以存储多个key(有n个key就有n个指针) 所有的数据都存储在叶子节点非叶子节点仅用于索引数据。 叶子节点形成了一颗双向链表便于数据的排序及区间范围查询。 语法 创建索引create [unique]index 索引名 on 表名(字段名,.);查看索引show index from 表名;删除索引drop index 索引名 on 表名;注意 主键字段在建表时会自动创建主键索引。 添加唯一约束时数据库实际上会添加唯一索引。 5. Mybatis 5.1 Mybatis入门 1. 快速入门 准备工作(创建springboot工程、数据库表user、实体类User) 引入Mybatis的相关依赖配置Mybatis(数据库连接信息) spring.datasource.driver-class-namecom.mysql.cj.jdbc.Driver spring.datasource.urljdbc:mysql://localhost:3306/mybatis spring.datasource.usernameroot spring.datasource.password1234编写SQL语句(注解/XML) 定义持久层接口加上Mapper注解定义接口 Mapper public interface UserMapper {Select(select * from user)public ListUser list(); }2. JDBC介绍 JDBC:(Java DataBase Connectivity)就是使用Java语言操作关系型数据库的一套API。 各个数据库厂商去实现这套接口提供数据库驱动jar包 我们可以使用这套接口(JDBC)编真正执行的代码是驱动jar包中的实现类 3. 数据库连接池 数据库连接池是个容器负责分配、管理数据库连接(Connection) 它允许应用程序重复使用一个现有的数据库连接而不是再重新建立一个 释放 空闲时间超过最大空闲时间 的连接来避免因为没有释放连接而引起的数据库连接遗漏 dependency groupIdcom.alibaba/groupId artifactIddruid-spring-boot-3-starter/artifactId version1.2.21/version /dependency4. lombok 5.2 Mybatis基础增删改查 根据主键删除 Delete(delete from emp where id#{id}) //占位符 public void delete(Integer id);日志输出#指定mybatis输出日志的位置,输出控制台 mybatis.configuration.log-implorg.apache.ibatis.logging.stdout.StdOutmpl预编译SQL 优势性能更高、更安全防止SQL注入 SQL注入 SQL注入是通过操作输入的数据来修改事先定义好的SQL语句以达到执行代码对服务器进行攻击的方法参数占位符 新增 // 新增员工 Insert(insert into 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);主键返回 Options(useGeneratedKeys true,keyProperty id)//获取返回属性并将属性封装到id属性更新 查询 实体类属性名 和 数据库表查询返回的字段名一致mybatis会自动封装 如果实体类属性名 和 数据库表查询返回的字段名不一致不能自动封装 解决方案 方案一给字段起别名让别名与实体类属性一致 Select(select id, username, password, name, gender, image, job, entrydate, dept_id deptId, create_time createTime, update_time updateTime from emp where id#{id}) public Emp getById(Integer id); 方案二通过Results,Result注解手动映射封装 Results({ Result(column dept_id,property deptId), Result(column create_time,property createTime), Result(column update_time,property updateTime), }) Select(select * from emp where id#{id}) public Emp getById(Integer id); 方案三开启mybatis驼峰命名自动映射开关 a_column------aColumn需要严格遵守命名规范 在application.properties中添加 #开启驼峰命名 mybatis.configuration.map-underscore-to-camel-casetrue条件查询 // concat 字符串拼接函数 Select(select * from emp where name like concat(%,#{name},%) and gender#{gender} and entrydate between #{beginDate} and #{endDate} order by update_time desc) public ListEmp list(String name, Short gender, LocalDate beginDate, LocalDate endDate);5.3 XML映射文件 XML映射文件的名称与Mapper接口名称一致并且将XML映射文件和Mapper接口放置在相同包下(同包同名)XML映射文件的namespace属性为Mapper接口全限定名一致。XML映射文件中sql语句的id与Mapper接口中的方法名一致并保持返回类型一致。 ?xml version1.0 encodingUTF-8 ? !DOCTYPE mapper PUBLIC -//mybatis.org//DTD Mapper 3.0//EN http://mybatis.org/dtd/mybatis-3-mapper.dtd mapper namespacecom.ljytest.mapper.EmpMapper !--resultType:-- select idlist resultTypecom.ljytest.pojo.Emp select * from emp where name like concat(%,#{name},%) and gender#{gender} and entrydate between #{beginDate} and #{endDate} order by update_time desc /select /mapper使用Mybatis注解主要完成一些简单的增删改查功能。如果需要实现复杂的SQL功能建议使用XML来配置映射语句 5.4 Mybatis动态SQL 随着用户的输入或外部条件的变化而变化的SQL语句我们称为动态SQL if 用于判断条件是否成立。使用test属性进行条件判断如果条件为true则拼接SQL where:where 元素只会在子元素有内容的情况下才插入where子句。而且会自动去除子句的开头的AND 或OR。 set:动态地在行首插入 SET关键字并会删掉额外的逗号。(用在update语句中) !--动态更新员工信息-- update idupdate2 update emp set if testusername!null username#{username},/if if testname!nullname#{name},/if if testgender!nullgender#{gender},/if if testimage!nullimage#{image},/if if testjob!nulljob#{job},/if if testentrydate!nullentrydate#{entrydate},/if if testdeptId!nulldept_id#{deptId},/if if testupdateTime!nullupdate_time#{updateTime}/if /set where id #{id} /update !--resultType:-- select idlist resultTypecom.ljytest.pojo.Emp select * from emp where if testname!null name like concat(%, #{name}, %) /if if testgender!null and gender #{gender} /if if testbeginDate ! null and endDate ! null and entrydate between #{beginDate} and #{endDate} /if /where order by update_time desc /selectforeach collection:遍历的集合item:遍历出来的元素separator:分隔符open:遍历开始前拼接的SQL片段close:遍历结束后拼接的SQL片段 !--批量删除-- delete iddeleteByIds delete from emp where id in foreach collectionids itemid separator, open( close) #{id} /foreach /deletesqlinclude sql:定义可重用的SQL片段 include:通过属性refid制定包含的sql片段 sql idcommonSelect select id, username, password, name, gender, image, job, entrydate, dept_id, create_time, update_time from emp /sqlinclude refidcommonSelect/include6. 案例 6.1 环境搭建 准备数据库表(dept、emp) 创建springboot工程引入对应的起步依赖(web、mybatis、mysql驱动、lombok)配置文件application.properties中引入mybatis的配置信息准备对应的实体类准备对应的Mapper、Service(接口、实现类)、Controller基础结构 开发规范-Restful REST(REpresentational State Transfer)表述性状态转换它是一种软件架构风格 开发规范-统一响应结果 前后端交互统一响应结果 Result 6.2 员工管理 分页查询 注解 RequestParam(defaultValue1) //设置请求参数默认值 Slf4j //定义日志记录对象分页插件PageHelper 引入依赖 !--PageHelper分页插件-- dependency groupIdcom.github.pagehelper/groupId artifactIdpagehelper-spring-boot-starter/artifactId version1.4.6/version /dependency使用 EmpServiceImplpublic PageBean page(Integer page, Integer pageSize) { // 1.设置分页参数 PageHelper.startPage(page,pageSize); // 2.执行查询 ListEmp empList empMapper.list(); PageEmp empPage (PageEmp) empList; // 3.封装PageBean对象 PageBean pageBean new PageBean(empPage.getTotal(),empPage.getResult()); return pageBean; }EmpMapperSelect(select * from emp) ListEmp list();6.3 文件上传 服务端接收文件 MultipartFile 本地存储 uuid 唯一标识 PostMapping(/upload) public Result upload(String username, Integer age, MultipartFile image) throws IOException { log.info( 文件上传{},{},{},username,age,image); // 获取原始文件名 String originalFilname image.getOriginalFilename(); // 构造唯一文件名不能重复-uuid(通用唯一识别码) int index originalFilname.lastIndexOf(.); String extname originalFilname.substring(index); String newFileName UUID.randomUUID().toString() extname; log.info(新的文件名{},newFileName); //将文件存储在服务器的磁盘目录下 image.transferTo(new File(F:\\LJY\\PostGraduate\\CodeLearing\\Java\\JavaWebTest\\images\\newFileName)); return Result.success(); }#配置单个文件最大上传大小 spring.servlet.multipart.max-file-size10MB #配置单个请求最大上传大小(一次请求可以上传多个文件) spring.servlet.multipart.max-request-size100MB常用方法 String getOriginalFilename(); //获取原始文件名 void transferTo(File dest);//将接收的文件转存到磁盘文件中 long getsize(); //获取文件的大小单位:字节 byte[] getBytes(); //获取文件内容的字节数组 Inputstream getinputstream();//获取收到的文件内容的输入流无法直接访问、磁盘空间限制、磁盘损坏 云存储 https://oss.console.aliyun.com/bucket/oss-cn-beijing/ljy-web-framework01/object 阿里云对象存储OSSObject Storage Service 第三方服务-通用思路 Bucket:存储空间是用户用于存储对象(0bject就是文件)的容器所有的对象都必须隶属于某个存储空间, SDK:Software Development Kit 的缩写软件开发工具包包括辅助软件开发的依赖(jar包)、代码示例等都可以叫做SDK。 !--阿里云OSS-- dependency groupIdcom.aliyun.oss/groupId artifactIdaliyun-sdk-oss/artifactId version3.15.1/version /dependency dependency groupIdjavax.xml.bind/groupId artifactIdjaxb-api/artifactId version2.3.1/version /dependency dependency groupIdjavax.activation/groupId artifactIdactivation/artifactId version1.1.1/version /dependency !-- no more than 2.3.3-- dependency groupIdorg.glassfish.jaxb/groupId artifactIdjaxb-runtime/artifactId version2.3.3/version /dependencyComponent public class AliOSSUtils { private String endpoint https://oss-cn-beijing.aliyuncs.com; // 从环境变量中获取访问凭证 private String accessKeyId LTAI5tJd5jSaFs5rEaprVPfL; private String accessKeySecret 6Xm6GYkmopkwCkyvk22X6qzOwZWJrv; // 填写Bucket名称 private String bucketName ljy-web-framework01; /** * 实现上传图片到OSS */ public String upload(MultipartFile file) throws IOException { // 获取上传的文件的输入流 InputStream inputStream file.getInputStream(); // 避免文件覆盖 String originalFilename file.getOriginalFilename(); String fileName UUID.randomUUID().toString() originalFilename.substring(originalFilename.lastIndexOf(.)); //上传文件到 OSS OSS ossClient new OSSClientBuilder().build(endpoint, accessKeyId, accessKeySecret); ossClient.putObject(bucketName, fileName, inputStream); //文件访问路径 String url endpoint.split(//)[0] // bucketName . endpoint.split(//)[1] / fileName; // 关闭ossClient ossClient.shutdown(); return url;// 把上传到oss的路径返回 } }6.4 配置文件 参数配置化 Value 注解通常用于外部配置的属性注入具体用法为: Value(${配置文件中的key}) application.properties#自定义的阿里云OSS配置信息 aliyun.oss.endpointhttps://oss-cn-beijing.aliyuncs.com #从环境变量中获取访问凭证 aliyun.oss.accessKeyIdLTAI5tJd5jSaFs5rEaprVPfL aliyun.oss.accessKeySecret6Xm6GYkmopkwCkyvk22X6qzOwZWJrv #填写Bucket名称 aliyun.oss.bucketNameljy-web-framework01AliOSSUtilsValue(${aliyun.oss.endpoint}) private String endpoint; // 从环境变量中获取访问凭证 Value(${aliyun.oss.accessKeyId}) private String accessKeyId; Value(${aliyun.oss.accessKeySecret}) private String accessKeySecret; // 填写Bucket名称 Value(${aliyun.oss.bucketName}) private String bucketName;yml配置文件(推荐 yml yaml ConfigurationProperties 添加配置文件后yml文件会有相对应的配置项的提示dependencygroupIdorg.springframework.boot/groupIdartifactIdspring-boot-configuration-processor/artifactId /dependencyAliOSSProperties.javaData Component ConfigurationProperties(prefix aliyun.oss) public class AliOSSProperties { private String endpoint; // 从环境变量中获取访问凭证 private String accessKeyId; private String accessKeySecret; // 填写Bucket名称 private String bucketName; }7. 登录校验 7.1 登录标记 用户登录成功之后每一次请求中都可以获取到该标记——会话技术 会话技术 会话用户打开浏览器访问web服务器资源会话建立知道有一方断开连接会话结束。一次会话中可以包含多次请求和响应 会话跟踪识别请求是否来自于同一个浏览器 会话跟踪方案 客户端会话跟踪技术Cookie服务端会话跟踪技术Session令牌技术 客户端会话跟踪技术Cookie 跨域区分三个维度协议、IP/域名、端口 dependency groupIdjavax.servlet/groupId artifactIdservlet-api/artifactId version2.5/version /dependency//设置Cookie GetMapping(/c1) public Result cookie1(HttpServletResponse response){ response.addCookie(new Cookie(login_username,itheima)); //设置Cookie/响应Cookie return Result.success(); } //获取Cookie GetMapping(/c2) public Result cookie2(HttpServletRequest request){ Cookie[] cookies request.getCookies(); for (Cookie cookie : cookies) { if(cookie.getName().equals(login_username)){ System.out.println(login_username: cookie.getValue()); //输出name为login_username的cookie } } return Result.success(); }服务端会话跟踪技术Session GetMapping(/s1) public Result session1(HttpSession session){ log.info(HttpSession-s1: {}, session.hashCode()); session.setAttribute(loginUser, tom); //往session中存储数据 return Result.success(); } GetMapping(/s2) public Result session2(HttpServletRequest request){ HttpSession session request.getSession(); log.info(HttpSession-s2: {}, session.hashCode()); Object loginUser session.getAttribute(loginUser); //从session中获取数据 log.info(loginUser: {}, loginUser); return Result.success(loginUser); }令牌技术 JWTJSON Web Token ①登录成功后生成令牌 ②后续每个请求都要携带JWT令牌系统在每次请求处理之前先校验令牌通过后再处理 dependency groupIdio.jsonwebtoken/groupId artifactIdjjwt/artifactId version0.9.1/version /dependency/** * 测试jwt令牌生成 */ Test public void testJwt(){ MapString, Object claims new HashMap(); claims.put(id,1); claims.put(name,tom); String jwt Jwts.builder() .signWith(SignatureAlgorithm.HS256, ljytest)//签名算法 .setClaims(claims)//设置自定义内容(载荷) .setExpiration(new Date(System.currentTimeMillis() 3600 * 1000))//设置有效期为1h .compact(); System.out.println(jwt); } /** * 解析令牌 */ Test public void testParseJwt(){ Claims claims Jwts.parser() .setSigningKey(ljytest)//指定签名令牌 .parseClaimsJws(eyJhbGciOiJIUzI1NiJ9.eyJuYW1lIjoidG9tIiwiaWQiOjEsImV4cCI6MTcyMTUzOTU0NH0.tjJtAFRl_-BQSM0a2siMpYwUjxjRsZCSOIwhKA-hzYk)//解析令牌 .getBody(); System.out.println(claims); }7.2 统一拦截 过滤器Filter 快速入门 定义实现Filter接口 配置WebFilter(urlPatterns/*) ServletComponentScan 详解 Filter拦截路径 过滤器链 Slf4j WebFilter(urlPatterns /*) public class LoginCheckFilter implements Filter { Override public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException { HttpServletRequest req (HttpServletRequest) servletRequest; HttpServletResponse resp (HttpServletResponse) servletResponse; // 1.获取请求url String url req.getRequestURI().toString(); log.info(请求的url,url); // 2.判断请求url中是否包含login如果包含说明是登录操作放行 if(url.contains(login)){ log.info(登录操作放行...); filterChain.doFilter(servletRequest,servletResponse); return; } // 3.获取请求头中的令牌token String jwt req.getHeader(token); // 4.判断令牌是否存在如果不存在返回错误结果未登录 if(!StringUtils.hasLength(jwt)){ log.info(请求头token为空返回未登录的信息); Result error Result.error(NOT_LOGIN); // 手动转换 对象——json ————————阿里巴巴fastJson String notLogin JSON.toJSONString(error); // 将字符串响应给浏览器 resp.getWriter().write(notLogin); return; } // 5.解析token如果解析失败返回错误结果未登录 try { JwtUtils.parseJWT(jwt); }catch (Exception e){ e.printStackTrace(); log.info(解析令牌失败返回未登录的信息); Result error Result.error(NOT_LOGIN); // 手动转换 对象——json ————————阿里巴巴fastJson String notLogin JSON.toJSONString(error); // 将字符串响应给浏览器 resp.getWriter().write(notLogin); return; } // 6.放行 log.info(令牌合法放行); filterChain.doFilter(servletRequest,servletResponse); } }拦截器Intercepter 快速入门 定义拦截器实现HandlerInterceptor接口并重写所有方法CtrlO注册拦截器 详解 登录校验 LoginCheckInterceptor Slf4j Component public class LoginCheckInterceptor implements HandlerInterceptor { Override//目标资源方法即controller运行前运行返回true放行返回false不放行 public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception { String jwt request.getHeader(token); if(!StringUtils.hasLength(jwt)){ log.info(请求头token为空返回未登录的信息); Result error Result.error(NOT_LOGIN); String notLogin JSON.toJSONString(error); response.getWriter().write(notLogin); return false; } try { JwtUtils.parseJWT(jwt); }catch (Exception e){ log.info(jwt解析失败返回未登录的信息); Result error Result.error(NOT_LOGIN); String notLogin JSON.toJSONString(error); response.getWriter().write(notLogin); return false; } log.info(令牌合法放行); return true; } Override//目标资源方法运行后运行 public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception { System.out.println(postHandle...); } Override//视图渲染完毕后运行最后运行 public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception { System.out.println(afterCompletion...); } }WebConfig Configuration //配置类 public class WebConfig implements WebMvcConfigurer { Autowired private LoginCheckInterceptor loginCheckInterceptor; Override public void addInterceptors(InterceptorRegistry registry) { registry.addInterceptor(loginCheckInterceptor).addPathPatterns(/**).excludePathPatterns(/login); } }7.3 异常处理 全局异常处理器 RestControllerAdvice ExceptionHandler RestControllerAdvice public class GlobalExceptionHandler { ExceptionHandler(Exception.class) //捕获所有的异常 public Result ex(Exception e){ e.printStackTrace(); return Result.error(对不起操作失败请联系管理员); } }8. 事务管理AOP 事务管理 Spring事务管理 #开启事务管理日志 logging: level: org.springframework.jdbc.support.jdbcTransactionManager: debug事务进阶 rollbackFor 默认情况下只有出现 RuntimeException 才回滚异常。rollbackFor属性用于控制出现何种异常类型回滚事务 Transactional(rollbackFor Exception.class)//设置所有异常都会进行事务回滚propagation 事务传播行为:指的就是当一个事务方法被另一个事务方法调用时这个事务方法应该如何进行事务控制。 Transactional(propagation Propagation.REQUIRES_NEW) Override public void insert(DeptLog deptLog) { deptLogMapper.insert(deptLog); }AOP基础 AOP概述 Aspect oriented ProaramnId(面向切面编程、面向方面编程)其实就是面向特定方法编程 实现 动态代理是面向切面编程最主流的实现。而SpringAOP是Spring框架的高级技术旨在管理bean对象的过程中主要通过底层的动态代理机制对特定的方法进行编程。 导入依赖在pom.xml中导入AOP的依赖dependency groupIdorg.springframework.boot/groupId artifactIdspring-boot-starter-aop/artifactId /dependency编写AOP程序针对于特定方法根据业务需要进行编程Slf4j Component Aspect public class TimeAspect { Around(execution(* com.ljytest.projectest.service.impl.*.*(..))) // 第一个*是方法的返回第二个*是类名第三个*是方法名 public Object recordTime(ProceedingJoinPoint proceedingJoinPoint) throws Throwable { // 记录开始时间 long begin System.currentTimeMillis(); // 调用原始方法 Object result proceedingJoinPoint.proceed(); // 记录结束时间计算方法执行耗时 long end System.currentTimeMillis(); log.info(proceedingJoinPoint.getSignature()方法执行耗时{}ms,end-begin); return result; } }AOP核心概念 AOP进阶 1.通知类型 PointCut 将公共的切点表达式抽取出来需要用到时引用该切点表达式即可Pointcut(execution(* com.ljytest.projectest.service.impl.DeptServiceImpl.*(..))) private void pt(){}2.通知顺序 3.切入点表达式 execution(…)根据方法的签名来匹配主要根据方法的返回值、包名、类名、方法名、方法参数等信息来匹配 execution(访问修饰符? 返回值 包名.类名.?方法名(方法参数) throws 异常?)其中带 ? 的表示可以省略的部分 访问修饰符可省略比如: public、protected 包名.类名 可省略 throws 异常可省略注意是方法上声明抛出的异常不是实际抛出的异常使用通配符描述切入点 annotation(…)根据注解匹配 com.ljytest.projectest.aop.MyLog Retention(RetentionPolicy.RUNTIME) //指定什么时候生效 Target(ElementType.METHOD)//作用在哪些地方 public interface MyLog { }DeptServiceImpl MyLog //自定义注解 public ListDept findAll(){ return deptMapper.findAll(); }Pointcut(annotation(MyLog)) private void pt1(){} Before(pt1()) public void before1(){ log.info(before1..); }4.连接点 在Spring中用JoinPoint抽象了连接点用它可以获得方法执行时的相关信息如目标类名、方法名、方法参数等。 对于 Around 通知获取连接点信息只能使用 ProceedingJoinPoint对于其他四种通知获取连接点信息只能使用 JoinPoint 它是 ProceedingJoinPoint 的父类型 9. Springboot原理 9.1 配置优先级 application.propertiesymlyaml SpringBoot 除了支持配置文件属性配置还支持Java系统属性和命令行参数的方式进行属性配置 优先级从低到高 9.2 Bean管理 获取bean 默认情况下Spring项目启动时会把bean都创建好放在IOC容器中如果想要主动获取这些bean可以通过如下方式 // 根据bean的名称获取 DeptController bean1 (DeptController) applicationContext.getBean(deptController); System.out.println(bean1); // 根据bean的类型获取 DeptController bean2 applicationContext.getBean(DeptController.class); System.out.println(bean2); // 根据bean的名称和类型获取 DeptController bean3 applicationContext.getBean(deptController, DeptController.class); System.out.println(bean3);bean作用域 Spring支持五种作用域后三种在web环境才生效 Scope(prototype)第三方bean 如果要管理的bean对象来自于第三方不是自定义的是无法用 Component 及衍生注解声明bean的就需要用到 Bean注解 Configuration //配置类 public class CommonConfig { //声明第三方bean Bean //将当前方法的返回值对象交给IOC容器管理, 成为IOC容器bean //通过Bean注解的name/value属性指定bean名称, 如果未指定, 默认是方法名 public SAXReader reader(DeptService deptService){ System.out.println(deptService); return new SAXReader(); } }9.3 SpringBoot原理 起步依赖 自动配置 起步依赖原理 依赖传递 自动配置原理 SpringBoot的自动配置就是当spring容器启动后一些配置类、bean对象就自动存入到了IOC容器中不需要我们手动去声明从而简化了开发省去了繁琐的配置操作。 第三方依赖自动配置 ImportSelector接口类 public class MyImportSelector implements ImportSelector { public String[] selectImports(AnnotationMetadata importingClassMetadata) { return new String[]{com.example.HeaderConfig}; } }源码跟踪 SpringBootApplication Conditional 自定义starter 在实际开发中经常会定义一些公共组件提供给各个项目团队使用。而在SpringBoot的项目中一般会将这些公共组件封装为SpringBoot 的 starter 规范 SpringBoot官方spring-boot-starter-XXX 其他技术提供XXX-spring-boot-starter Web后端开发-总结 10. Maven高级 10.1 分模块设计与开发 将项目按照功能拆分成若干个子模块方便项目的管理维护、扩展也方便模块间的相互调用资源共享 10.2 继承与聚合 继承 继承描述的是两个工程间的关系与java中的继承相似子工程可以继承父工程中的配置信息 parent … /parent继承关系实现 projectest-parent parent groupIdorg.springframework.boot/groupId artifactIdspring-boot-starter-parent/artifactId version3.3.1/version relativePath/ !-- lookup parent from repository -- /parentgroupIdorg.ljytest/groupId artifactIdprojectest-parent/artifactId version1.0-SNAPSHOT/version packagingpom/packaging其他 parent groupIdorg.ljytest/groupId artifactIdprojectest-parent/artifactId version1.0-SNAPSHOT/version relativePath../projectest-parent/pom.xml/relativePath /parent版本锁定 在maven中可以在父工程的pom文件中通过 dependencyManagement 来统一管理依赖版本。 子工程需要引入依赖无需指定 version 版本号父工程统一管理。变更依赖版本只需在父工程中统一变更。自定义属性/引用属性properties lombok.versionRELEASE/lombok.version jjwt.version0.9.1/jjwt.version /propertiesdependency groupIdorg.projectlombok/groupId artifactIdlombok/artifactId version${lombok.version}/version聚合 聚合将多个模块组织成一个整体同时进行项目的构建聚合工程一个不具有业务功能的“空”工程有且仅有一个pom文件作用快速构建项目无需根据依赖关系手动构建直接在聚合工程上构建即可maven中可以通过 modules 设置当前聚合工程所包含的子模块名称!-- 聚合其他模块-- modules module../projectest-pojo/module module../projectest-utils/module module../projectest-web-management/module /modules10.3 私服 介绍 私服是一种特殊的远程仓库它是架设在局域网内的仓库服务用来代理位于外部的中央仓库用于解决团队内部的资源共享与资源同步问题。 依赖查找顺序本地仓库–私服–中央仓库 资源上传与下载 1.设置私服的访问用户名/密码settings.xml中的servers中配置server idmaven-releases/id usernameadmin/username passwordadmin/password /server server idmaven-snapshots/id usernameadmin/username passwordadmin/password /server2.IDEA的maven工程的pom文件中配置上传发布地址distributionManagement repository idmaven-releases/id urlhttp://192.168.150.101:8081/repository/maven-releases//url /repository snapshotRepository idmaven-snapshots/id urlhttp://192.168.150.101:8081/repository/maven-snapshots//url /snapshotRepository /distributionManagement3.设置私服依赖下载的仓库组地址settings.xml中的mirrors、profiles中配置mirror idmaven-public/id mirrorOf*/mirrorOf urlhttp://192.168.150.101:8081/repository/maven-public//url /mirrorprofile idallow-snapshots/id activation activeByDefaulttrue/activeByDefault /activation repositories repository idmaven-public/id urlhttp://192.168.150.101:8081/repository/maven-public//url releases enabledtrue/enabled /releases snapshots enabledtrue/enabled /snapshots /repository /repositories /profilemybatis-plus 瑞吉外卖 springCloud微服务技术栈 学成在线
http://www.w-s-a.com/news/487620/

相关文章:

  • 网站建设项目费用报价ai软件下载
  • 面料 做网站重庆网站seo费用
  • 中国沈阳网站在哪里下载中国移动营销策略分析
  • 建设银行 钓鱼网站360免费建站教程
  • wordpress全站cdn网站运营年度推广方案
  • 成都网站开发培训机构网站开发 实习报告
  • 廊坊网站建设佛山厂商wordpress神主题
  • 成县建设局网站中国建筑有几个工程局
  • 网站打不开被拦截怎么办单页面网站制作
  • 关于协会网站建设的建议设计公司名字参考
  • 怎样申请做p2p融资网站页面设计时最好使用一种颜色
  • 一般做网站上传的图片大小网站软件设计
  • 用来网站备案注册什么公司好wordpress怎么搜索中文主题
  • 网站开发 打标签深圳软件公司排名
  • 邯郸的网站建设电子网站怎么做的
  • 中国企业信用网四川游戏seo整站优化
  • 下载站推广wordpress扩展字段
  • 网站建设这个工作怎么样免费电子版个人简历模板
  • 移动网站设计与制作网站开发接私活
  • 视频制作素材网站wordpress mysql 被删
  • 静态网站 模板公司一般都用什么邮箱
  • 做网站效果图是用ps还是ai泰安人才网最新招聘信息2022年
  • 免费建站网站一级大录像不卡在线看网页郑州网站关键
  • 做网站 然后百度推广哈尔滨建筑网
  • 章丘营销型网站建设网站测评必须做
  • 营销者网站怎么把网站黑了
  • 律师事务所手机网站校园网站设计
  • 网站案例展示分类网站响应速度优化
  • 风景网站的制作网站ip地址查询域名
  • 怎样看网站是谁做的马鞍山什么房产网站做的好