javaweb学习以及相关框架使用
JavaWeb技术栈
B/S架构: Browser/Server,浏览器/服务器架构模式,它的特点是,客户端只需要浏览器,应用程序的逻辑和数据都存储在服务器端。浏览器只需要请求服务器,获取Web资源,服务器把Web资源发送给浏览器即可。
好处:易于维护升级,服务器端升级后,客户端无需任何部署就可以使用到新的版本。
静态资源:HTML、CSS、JavaScript、图片等。负责页面展现。
动态资源:Servlet、JSP等。负责逻辑处理。
数据库:负责存储数据。
HTTP协议:定义通信规则。
Web服务器:负责解析HTTP协议,解析请求数据,并发送响应数据。
HTTPHTTP:超文本传输协议,规定了浏览器和服务器之间数据传输的规则。
HTTP协议特点
基于TCP协议:面向连接,安全。
基于请求-响应模型的:一次请求对应一次响应。
HTTP协议是无状态的协议:对于事务处理没有记忆能力。每次请求-响应都是独立的。缺点:多次请求间不能共享数据。优点:速度快。
HTTP-请求数据格式请求数据分为3部分:
请求行:请求数据的第一行。其中GET表示请求方式 ,/ 表示请求资源路径,HTTP/1 ...
一个SpringBoot的项目
整体的一个项目介绍框架功能介绍项目仓库地址
项目运行地址
这个项目是基于SpringBoot+Vue3框架来完成的。这是一个蛇与蛇对战的游戏,实现了人人对战,人机对战,机机对战的功能。
实现流程:
创建菜单与游戏界面。
登录注册等逻辑的实现。
通过微服务实现匹配系统(匹配池、以及实时对战)。
微服务Bot代码的执行。
排行榜的实现。
游戏规则介绍双方游戏开始时下方会有一个标记,表示你的位置在左下角还是右上角。当两方都有操作的的时候蛇才会动。
死亡条件:
5秒内未执行操作。
撞上墙或撞上自己身体或撞上对方身体。
整体架构图
匹配系统流程图
MyBatis
MyBatisMyBatis概念
MyBatis是一款优秀的持久层框架,用于简化JDBC开发
MyBatis本是 Apache的一个开源项目iBatis, 2010年这个项目由apache softwarefoundation迁移到了google code,并且改名为MyBatis。2013年11月迁移到Github
官网:https://mybatis.org/mybatis-3/zh/index.html
持久层
负责将数据到保存到数据库的那一层代码
avaEE三层架构:表现层、业务层、持久层
框架
框架就是一个半成品软件,是一套可重用的、通用的、软件基础代码模型
在框架的基础之上构建软件编写更加高效、规范、通用、可扩展
为什么简化简化jDBC:免除JDBC代码以及设置参数和获取结果集的工作。
JDBC存在的缺点:
硬编码
注册驱动,获取连接
SQL语句
操作繁琐
手动设置参数
手动封装结果集
Mapper代理开发
定义与SQL映射文件同名的Mapper接口,并且将Mapper接口和SQL映射文件放置在同一目录下
设置SQL映射文件的namespace属性为Map ...
Maven基础
Maven基础
Maven是专门用于管理和构建Java项目的工具,它的主要功能有:
提供了一套标准化的项目结构
提供了一套标准化的构建流程(编译,测试,打包,发布…..)
提供了一套依赖管理机制
标准化的项目结构
标准构建流程
编译=》测试=》打包=》发布
依赖管理机制
管理你项目所依赖的第三方资源(jar包、插件…)
仓库分类
本地仓库:自己计算机上的一个目录
中央仓库:由Maven团队维护的全球唯一的仓库
地址: https://repo1.maven.org/maven2/
远程仓库(私服):一般由公司团队搭建的私有仓库
引入依赖当项目中使用坐标引入对应依赖jar包后,首先会查找本地仓库中是否有对应的jar包:如果有,则在项目直接引用;如果没有,则去中央仓库中下载对应的jar包到本地仓库。
Maven生命周期Maven构建项目生命周期描述的是一次构建过程经历经历了多少个事件Maven对项目构建的生命周期划分为3套
clean:清理工作
default:核心工作,例如编译,测试,打包,安装等
site:产生报告,发布站点等
同一生命周期内,执行后边的命令,前边 ...
JDBC基础
JDBC
创建工程,导入驱动jar包:
mysql-connector-java-5.1.48.jar
注册驱动
Class.forName("com.mysql.jdbc.Driver");
获取连接Connection conn = DriverManager.getConnection(url, username, password);
定义SQL语句String sql ="update...";
获取执行SQL对象Statement stmt = conn.createStatement();
执行SQLstmt.executeUpdate(sql);
处理返回结果
释放资源
123456789101112131415161718192021222324252627282930313233343536package com.jpc;import java.sql.Connection;import java.sql.DriverManager;import java.sql.Statement;public clas ...
mysql的配置和基础语法
MySQL配置mysqlhttps://www.acwing.com/file_system/file/content/whole/index/content/6237942/
mysql服务的关闭与启动(默认开机自动启动,如果想手动操作,可以参考如下命令)
关闭:net stop mysql80
启动:net start mysql80
mysql的常用操作
连接用户名为root,密码为520jpc…的数据库服务:mysql -uroot -p520jpc…
show databases;:列出所有数据库
create database kob;:创建数据库
drop database kob;:删除数据库
use kob;:使用数据库kob
show tables;:列出当前数据库的所有表
create table user(id int, username varchar(100)):创建名称为user的表,表中包含id和username两个属性。
drop table user;:删除表
insert into user values(1, ‘yxc’);:在表中插入数据
s ...
最近公共祖先
最近公共祖先求最近公共祖先的方法
向上标记法O(n)
倍增
fa[i, j]表示从i开始,向上走2^j步所能走到的节点。0 <= j <= logn
depth[i] 表示深度
哨兵:如果从i开始向上跳2^j步跳过根节点,fa[i, j] = 0, depth[0] = 0;
步骤:
先让两个点跳到同一层
让两个点同时往上跳,一直跳到他们的最近公共祖先的下一层。
预处理O(nlogn)
查询O(logn)
Tarjan——离线求LCA O(n + m)
深度优先遍历的时候将所有点分成三大类:
已经遍历过,且回溯的点
正在搜索分支的点
还未搜索到的点
祖孙询问(基础)题目描述给定一棵包含 n 个节点的有根无向树,节点编号互不相同,但不一定是 1∼n。
有 m 个询问,每个询问给出了一对节点的编号 x 和 y,询问 x 与 y 的祖孙关系。
输入格式输入第一行包括一个整数 表示节点个数;
接下来 n 行每行一对整数 a 和 b,表示 a 和 b 之间有一条无向边。如果 b 是 −1,那么 a 就是树的根;
第 n+2 行是一个整数 m 表示询问个数;
接下来 ...
算法模板
高精度加法12345678910111213141516171819// C = A + B, A >= 0, B >= 0vector<int> add(vector<int> &A, vector<int> &B){ if (A.size() < B.size()) return add(B, A); vector<int> C; int t = 0; for (int i = 0; i < A.size(); i ++ ) { t += A[i]; if (i < B.size()) t += B[i]; C.push_back(t % 10); t /= 10; } if (t) C.push_back(t); return C;}
高精度减法1234567891011121314151617// C = A - B, 满足A > ...
JavaScript基础语法
基本输入输出
输入
从HTML与用户的交互中输入信息,例如通过input、textarea等标签获取用户的键盘输入,通过click、hover等事件获取用户的鼠标输入。通过Ajax与WebSocket从服务器端获取输入。
输出
调试用console.log,会将信息输出到浏览器控制台。改变当前页面的HTML与CSS。通过Ajax与WebSocket将结果返回到服务器。
输入a, b,输出a + b
123456789101112let fs = require('fs');let buf = '';process.stdin.on('readable', function(){ let chunk = process.stdin.read(); if(chunk) buf += chunk.toString();});process.stdin.on('end', function(){ let [a, b] = buf.split(' ...
进程通信
进程通信通过共享内存实现两个进程通信
发送方:
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566#include <sys/types.h>#include <sys/ipc.h>#include <sys/shm.h>#include <fcntl.h>#include <stdlib.h>#include <stdio.h>#include <string.h> struct shared_msg { int update;//更新数据标志,1:更新,0:未更新 char text[BUFSIZ];//记录写入和读取的文本 };void main(){ printf("程序开始\n"); key_t key;//共 ...



