if(ckecks[i].cheacked==true)
string+=checks[i].value+”,”;
}
隐藏表单域提交到后台
document.getElementById(“string”).value=string;
后端通过String的slit(regex)以regex表示的符号切割长字符串为字符串数组
长整数分位显示;long最长为19位
转为字符串以后,StringBuffer的reverse()先反序
POI组件将数据导出到Excel表
response.setContentType(“application/vnd.ms-excel”);
ServletOutputStream out=response.getOutputStream();
HSSFWorkbook wb=new HSSFWorkbook();//创建excel表格
HSSFSheet sheet=wb.createSheet(“数据”);//创建工作簿
sheet.setColumnWidth(4,5000);//设置列宽
HSSFRow titileRow=sheet.createRow(0);//标题行
HSSFCell titleCell=titleRow.createCell(0);//标题行的第一个单元格
titileCell.setCellValue(“用户名”);
…n个单元格
HSSFRow valueRow=sheet.createRow(1);//创建第二行
…对应n个单元格且设值
wb.write(out);out.flush();out.close();
过滤器:防盗链,日志记录,字符替换,异常捕获,用户及权限验证,字符编码,弹出对话框形式的公告信息,文件上传
项目安全性:
攻击性安全:input框JS验证,java代替重复校验,避免非法字符和空格和SQL注入;特殊模块如登录时生成验证码,支付时产生随机码,都有时间限制
访问安全:页面静态化,使用缓存,减小服务器压力
数据安全:数据库敏感数据加密后存储;数据库读写分离;备份
JDBC
Driver:加载数据库驱动 (jar包);Class.forName(“”)
DiverManager:管理JDBC驱动服务类,获得数据库连接 :DiverManager.getConnection(url,user,password)
Connection:数据库连接对象,创建Statement对象
Statement createStaetment();
PrepareStatement prepareStatement(sql);
CallableStatement prepareCall(sql);
Savepoint setSavepoint([name]);//创建保存点
void setTransactionIsolation(level);// 设置事务隔离级别
void rollback([savepoint]);//回滚(到保存点)
void setAutoCommit(boolean);//关闭自动提交,打开事务;因为Connection默认会自动提交,即关闭事务
void commit();//提交事务
Statement(执行SQL语句 ,涉及批量更新方法)-PreparedStatement(安全,防SQL注入 (如永真表达式),in参数,占位符,预编译SQL语句 即下面的方法不传入sql参数,新增void setXxx(parameterIndex,value))-CallableStatement(out参数,调用存储过程):
ResultSet excuteQuery(sql);操作结果集
操作指针指向数据:absolute(row)row行;beforeFirst()初始状态,首行之前;first()首;previous()上一行;next()下一行;last()尾行;afterLast()尾行之后
然后通过索引或列名(推荐)获得列数据:getXxx(index/string)
boolean excute(sql);
int excuteUpdate(sql);//受影响行数为0或没有结果,返回false
结果集从1开始;可回滚;
回收和关闭资源
SQLException:应用无法连接数据库;查询语法错误;查询目标表或列不存在;插入或更新的数据违反数据库约束
处理Blob(二进制长对象如图片,声音文件)类型数据:PrepareStatement的setBinaryStream(parameterIndex,inputStream)保存Blob数据到数据库;ResultSet的getBlob(columnIndex)取出得到Blob对象,对象的getBytes()获取数据,或getBinaryStream()获取数据的输入流
最佳实践:批量操作;使用PreparedStatement避免SQL异常;使用数据库连接池;通过列名获取结果集而不是下标;
模板:消除冗长的JDBC编码
JdbcTemplate(推荐):基于索引参数的查询;NamedParameterJdbcTemplate:值以命名参数形式绑定到SQL;SimpleJdbcTemplate(废弃):自动装箱、泛型和可变参数
构建以dataSource为参数且返回模板对象的模板bean
tx:annotation-driven:事务驱动(spring通过AOP实现事务的根本原因);配合AOP配置相关事务操作
实现DataSource的bean(使用配置中的参数)的Connection,Statament以及CURD,ResultSet @Repository(标注参与数据库操作的bean)的bean中引入模板类,在@Inject处自动注入;执行CURD方法(提供参数即可,模板类自动获取连接、创建语句和执行SQL)
MySql
数据库三范式
1NF
列的原子性(列不可再分)
2NF
先满足1NF,然后表必有主键,其他列必完全依赖主键
3NF
先满足2NF,然后非主键列直接依赖主键,消除传递依赖
事务propagation管理insert,update,delete,ACID特性
原子性
不可分割,即事务是应用的最小执行单位要么都执行,要么都不执行(回滚后数据状态与事务执行之前一致)
一致性
事务从一种一致的状态到另一种一致的状态
隔离性 :并发的各个事务的执行互不干扰;5个隔离性
默认default
读未提交read_uncommitted
事务1可以操作还未提交的事务2 ;隔离性最低(不能避免脏读等所有问题),并发性高
读已提交read_committed
事务1不可以操作未提交的事务2;防止脏读 (指修改但未提交的数据,之后事务2回滚了,事务1读到脏数据)
读可重复 repeatable_read(默认)
防止脏读、不可重复读 (指事务1读取数据后,事务2修改数据并提交,事务1再次读取而数据不一致)
串行化serializable
严格的事务隔离,事务串行执行;级别最高,避免脏读,不可重复读,幻/虚读 (指事务2增加了数据并提交,事务1会感觉貌似多了些数据)
持久性
提交后永久存储(数据库操作完成后都应该commit(),失败后rollback())
事务控制(begin/start transaction,commit,rollback…);自动提交或手动提交(begin-rollback-commit)
传播行为
PROPAGATION_REQUIRED(默认)
支持当前事务(如果没有则新建)
PROPAGATION_SUPPORTS
支持当前事务(如果没有则以非事务方式执行)
PROPAGATION_MANDATORY
支持当前事务(如果没有则抛出异常)
PROPAGATION_REQUIRES_NEW
总是开启新事务(如果存在则当前事务挂起)
PROPAGATION_NOT_SUPPORTED
总以非事务方式执行(如果存在挂起)
PROPAGATION_NEVER
以非事务方式执行(如果存在则抛出异常)
默认值为0-5;(java类TransactionDefinition新添了中自定义的初始值为6)PROPAGATION_NESTED—事务存在,则嵌套事务执行
只读:
事务超时:
mysql有存储引擎如MyISAM(默认),InnoDM,MEMOORY,MERGE,它们各有支持如存储限制、事务安全、锁机制、各种索引类型、数据缓存、数据压缩、内存使用、外键等
基本关系(表):实际表,对实际存储数据的逻辑表示
查询表:查询结果
视图表:由基本表或视图表导出的虚表
关系操作:查query,插insert,删delete,改update
完整性约束:实体完整性(主键不为空)+参照完整性(外键为空或另一个表的主键)+用户定义完整性(SQL约束列表)
标准语言SQL(structured query language):
select [*/all/distinct] 目标列表达式列表 from 表名/视图名列表/(selcte子句) [as..]
[ where 条件表达式 ](根据where条件从from指定集中选出元组并按照select的要求形成结果)
[ group by 列名 [having 条件表达式]](按列名的值分组,值等为一组;分组后having限制(聚集函数作用于每一组)满足条件的组才输出)
[ order by 列名 [asc/desc]]
条件表达式:=,>...,!=,between.and,in,like,is null,and,or以及not配合
like字符匹配,字符模糊%(任意长度字符)和_(任意单个字符)
函数
(聚集只能用于select后或having后面)数值函数
count(),sum(),avg(),max(),min()
abs(),cell(),floor(),mod()
rand()0-1随机数
round(n,count)四舍五入保留指定位数
truncate(n,count)截取为指定位数
字符串函数
concat(str1…strn),lower/upper(str)
left/right(str,count);//返回字符串左/右边的指定个字符
insert(str,fromIndex,count,newstr);//替换
lpad/rpad(str,count,fillstr);//从左/右填充指定个字符
ltrim/rtrim/trim(str);//去空格
repeat(str,count);//重复指定次
replace(str,oldChar,newChar);//替换所有oldChar
strcmp(str1,str1);//比较
substring(str,fromIndex,count);//截取
日期函数
curdate()/curtime()/now()://当前日期、时间、日期时间
year/monthname/week(date)://年、月、年的第几周
hour/minute(time)://时、分
date_format(date,fmt)
date_add(date,intervalExpressionType)
datediff(date1,date2);//天数差
流程函数
if(value,t,f);//如果value真,返回t,否则返回f
ifnull(value1,value2);//如果value1不null则返回,否则返回value2
case [expression] when [value1/expression] then [result1]…else [default] end;//如果[表达式结果等于]value1真,返回result1,否则default;可以多个when…then
其他函数
datebase()数据库名,version()版本,user()用户名,inet_ation(ip)ip地址的数字表示,inet_ntop(num)数字表示的IP地址,password(str)加密,MD5()
几种查询
连接查询
等值/非等值连接:选出满足条件的元组数据并拼接成在一起
from 表列表 where 表1.字段=(等连接词)表2;可自连接(别名区分)
外连接:选出左表/右表所有元组并拼接右表/左表满足条件的元组数据,不满足的元组显示数据为null
嵌套查询
在where或having中嵌套查询块(select..from..where)
嵌套条件:=(等比较运算符,要求内存查询返回的一定是单个值),in(结果集),any/some/all(多值),exists
集合查询
对查询结果的并union,交intersect,差except
基于派生表(中间表)的查询
子查询位于from后
数据操作manipulation:DML
增
inser into 表名 [列名列表] values(值列表)
删
delete from 表名 [where ...]
每次删一行数据;删除操作被作为事务保存在日志,日后可回滚;没有条件则删除表中所有数据,等同于truncate table 表名;//一次性永久性删除表中所有行而不记录单个行删除操作;不会激活触发器;速度快;不回滚
drop
删除数据和表格;隐式提交,不回滚;同truncate属于DDL语言;速度最快
改
update 表名 set 列名=值(列表) where ...
模式=表+视图+索引;
约束:primary key,unique,not null,foreign key..references..,;
建:
create schema 名...,数据库的命名空间
create table 名(列名 数据类型 列级完整性约束条件,...)
数据类型
数值
严格数值
integer/int(4字节),smallint(2),decimal/dec,numeric
近似数值
float(4),real,double(8)
不同长度
tinyint(1),mediumint(3),bigint(8)
位bit
区别SQL中int(数字),表示数字宽度,默认int(11)
日期时间
1000年以后:日期date(4),日期时间datetime(8)
1970年以后:当前系统日期时间且格式化timestamp(4),时间time(3)
1901以后:year(1)
字符串
char(0-255定长即删除尾部空格),varchar(0-65535变长即保存尾部空格),tinblob(0-255),mediumblob,blob(0-65535),longblob,text同理
二进制字符串binary(n定长),varcharninary(n变长)
enum,set
create view 名;当定义主键/唯一/外键约束时会自动创建对应索引
create [unique索引值对应唯一数据记录] [cluster聚簇索引] index 名 on tableName(列名[(字节数)])(列名列表且asc/desc)
索引 :为经常需要查询的列建立索引;单列索引和组合索引(一个索引包含多列);出现在where子句而不是select后的列适合建索引;列基数越大的适合(如性别列基数太小);列值为字符串的,使用短索引即前缀遍历;索引增加额外存储空间,降低写操作性能,修改表时更新或重构费时
索引类型:
顺序文件上的索引:针对记录值按升序或降序存储的记录创建的顺序索引文件
B+树索引:动态平衡
散列索引:查找快
位图索引
或者分为唯一索引 (列或列组合建立的索引,值不重复,可为空),非唯一索引,主键索引 (建立索引的列为主键,唯一),聚(集)簇索引 (表中数据物理顺序和索引的排列顺序一致,唯一)
优点:加速查询;缺点:增加开销(维护索引尤其在记录的CURD时)和增加空间(来存储索引信息 )
drop schema/index/view 名 [on tableName;mysql要求一个表中索引不能同名]
drop table 名 [restrict默认有限制即若有依赖对象则表不能删除/cascade无限制,即依赖对象全被删除]
限制表示表存在依赖对象如被其他表约束引用,存在索引、视图、触发器、存储过程、函数等
视图、存储过程、函数不被删除但失效
添加列:alter table student add [column] 新列名 数据类型;(数据默认空值填充)
修改数据类型:alter table student alter column Sage INT
添加约束:alter table student add unique(Sage)
改索引名:alter index 名 rename to 新名
触发器:特殊的定义在关系表上的一类由事件驱动的存储过程;保存在数据库服务器,自动激活调用;是更灵活,可实施更复杂的检查和操作,更精细和强大的数据控制能力的约束;预编译;
create trigger 名
befor/after 触发事件insert/update/delete on 表名
referencing new/old row as 变量名
for each row/statement //类型:行级触发和语句级触发
[when 触发条件] 触发动作insert/update/delete
数据库连接池:服务器启动---建立一定数量的池连接,并一直维持不少于此数目的池连接---客户端程序需要连接时,池驱动程序会返回一个未使用的池连接并将其表记为忙;如果当前没有空闲连接,池驱动程序就新建一定数量的连接,新建连接的数量有配置参数决定;当使用的池连接调用完成后,池驱动程序将此连接表记为空闲,其他调用就可以使用这个连接;
DBCP稳定,C3P0性能高
数据库设计步骤:需求分析,概念结构设计,逻辑结构设计,物理结构设计,数据库实施,数据库运行与维护
SQL优化:
少使用*而具体写出需要返回的字段即不要全表扫描,减少语句解析;
外键使用索引,避免在where子句中有索引的字段进行运算而导致索引失效;
在where及order by设计的列建立索引;
表中字段避免null而应设默认值;避免在where子句中对字段进行null值判断和表达式操作,这导致引擎放弃索引而全表扫描;
>=代替>(后者查询后比较,前者直接查询);
尽量多commit()即分段批量提交;
批量sql操作如删除id in(1,2,3)而不是三条删除语句;
存储过程减少数据库访问次数;特殊时候truncate替换delete;
in中的常量存储在一个数组且排好了序,in中包含的数值不应过多;对连续的数字,尽量用between;
当只需要一条数据时,使用limit 1;
排序的字段没用到索引,则少排序;
union all 代替union;
in适合外表大而内表小的情况(in先执行子查询,即以内表为驱动);exists反之(以外表为驱动表,先访问);推荐not exists而不是not in,not in可能存在逻辑问题;
left join以左表为驱动表,所以左表应小;同理right join;inner join会自动以数据少的表为驱动表,推荐;
分段查询:查询范围过大时,分段查询后,结果合并;
不推荐前置“%”的模糊查询,这导致索引失效而全表扫描;可使用全文索引;
联合索引遵循最左前缀法则:常用的查询字段放在最前;从左到右出现的子集索引可以如同联合索引,否则不行,如联合索引(1,2,3)可以等同(1,2)但(2,3)无法使用此索引;
常见数据错报错:
参数max_connections默认151;报错too many connections;
从库与主库数据冲突:
4.学生-课程数据库
学生表:Student(Sno,Sname,Ssex,Sage,Sdept系);
课程表:Course(Cno,Cname,Cpno,Ccredit学分);
成绩/学生选课表:SC(Sno,Cno,Grade);
建表:
CREATE TABLE Student (Sno char(9) PRIMARY KEY ,Sname varchar(20) union,Ssex char(2),Sage SMALLINT,Sdept char(20));
Create table Course(Cno char(4) PRIMARY KEY ,Cname char(40) not null,Cpno char(4),Ccredit smallint,FOREIGN KEY(Cno) references Course(Cno) );
Create table SC(Sno char(9),Cno char(4),Grade smallint,primary key(Sno,Cno),foreign key(Cno) references Course(Cno));
查询:
出生年份:
当前年份-Sage;
查询既不是CS系,MA系,IS系的学生:
select Sname form student where Sdept not in(“CS”,”MA”,”IS”);
查询选了3门以上课程的学生学号
select Sno from SC group by Sno having count(*)>3;
查询平均成绩>=90分的学生学号和平均成绩
select Sno,avg(Grade) from SC group by Sno having avg(Grade>=90);//只涉及SC表
查询选修课程2且该课程成绩大于90分的学生学号和姓名
select Student.Sno,Sname from Student,SC where Student.Sno=SC.Sno and SC.Cno=’2’ and SC.Grade>90;//涉及Student表和SC表,等值连接
查询选修课程语文的学生学号和姓名
select Sno,Sname from Student where Sno in(select Sno from SC where Cno in(select Cno from Course where Cname=’语文’));//课程名属于Course,学号和姓名属于Student,两表没有直接联系,需通过SC表连接;先查课程为语文的课程号Cno,再查选了Cno的学生号Sno,最后取出Sno和Sname;
它的等值连接查询(推荐):select Student.Sno,Sname from Student,SC,Course where Student.Sno=SC.Sno and SC.Cno=Course.Cno and Course.Cname=’语文’;
查询选了课程1号的学生姓名
select Sname from Student where exists (select * from SC where Sno=Student.Sno and Cno=’1’);
查询选了所有课程的学生姓名
select Sname from Student where not exists (select * from Course where not exists(select * from SC where Sno=Student.Sno and Cno=Course.Cno));
查询所有学生的学号,姓名,选课数,总成绩
select Student.Sno,Student.Sname,count(Cno),sum(Grade) from Student join SC on Student.Sno=SC.Sno group by Student.Sno,Sname;
查询所有课程成绩都<60分的学生学号和姓名
select Sno,Sname from Student where Sno not in(select Student.Sno from Student,SC where Student.Sno=SC.Sno and SC.Grade>60);
查询‘001’课程分数比‘002’课程高的学生学号
select a.Sno from (select sno, score from sc where cno=’001’ ) a,(select sno,score from sc where cno=’002’ ) b
where a.score>b.score and a.sno=b.sno;
查询姓李老师的人数
select count(distinct(tname)) from teacher where tname like ‘李%’;
用一个SQL语句查询N种数据:
select sum(case when table.salary>9999 and table.age>35 then 1 else 0 end) as “salary>9999 and age>35”,sum(case when table.salary……),… from table;
连接字符串(与null连接的都为null)
select concat(“str1”,”str2”,”str3”),concat(“str”,null)
查询工资,大于2000的显示”high”,否则显示”low”
select if(salary>2000,’high’,’low’) from …
select case when salary>2000 then ‘high’ else ‘low’ end from…
建索引
create index citys on city(cityName(10));
修改名为‘张’的薪水为5000,性别为‘男’
update tableName set salary=5000,sex=’男’ where name=’张’;
统计学生总分
select name,(chinese+math+english) as total from student;
工资多于张员工的员工信息
select * from employee where salary>(select salary form employee where name=’张’);
查询员工姓名及他的上司姓名
select 员工.name ,上司.name from employee 员工 left jion employee 上司 on 员工.上司编号id=上司.id;
查询雇佣时间小于其上司的员工姓名和上司姓名
select 员工.name,上司.name from employee 员工,employee上司 where 员工.上司id=上司.id and 员工.hireDate<上司.hireDate;
返回从事‘a’工作的员工姓名和所在部门
select 员工.name,dname from employee 员工,dept where 员工.job=’a’ and 员工.deptno=dept.deptno;
返回所有部门及部门最低工资
select deptno,min(salary) from employee group by deptno;
查询销售部的所有员工姓名
select ename from employee 员工,dept 部门 where 部门.dname=’销售部’ and 员工.deptno=(select deptno from dept where dname=’销售部’);
查询薪资水平多于平均薪资的员工
select * from employee where salary>(select avg(salary) from employee);//注意聚合函数(group function)不能放在where里即不能where salary>avg(salary)
查询与张从事相同工作的员工
selct * from employee where job=(select job from employee where ename=’张’) and ename!=’张’;//同一部门:where edeptno=(select edeptno from employee where ename=’张’) and ename!=’张’;
返回工资高于a部门所有员工的员工
select * from employee where salary> all(select salary from employee where edeptno=’a’);
借书系统
CARD 借书卡:CNO 卡号,NAME 姓名,CLASS 班级
BOOKS图书: BNO 书号,BNAME 书名,AUTHOR 作者,PRICE 单价,QUANTITY 库存册数
BORROW借书记录: CNO 借书卡号,BNO 书号,RDATE 还书日期
16.查询借书超过5本的读者的借书卡号和册数
select cno,count(*) from borrow group by cno having count(*)>5;
查询借了水浒的读者的姓名和班级
select * from card c where exists(select * from borrow bo,books b where bo.bno=b.bno and b.bname=’水浒’ and bo.cno=c.cno);
查询过期未还图书的借书卡号,书号及归还日期
select * from borrow where rdate
查询借了a但没有借b的读者的借书卡号并降序
select bo.cno from borrow bo,books b
where bo.bno=b.bno and b.bname=’a’
and not exists(select * from borrow bo2,books b2 where bo2.bno=b2.bno and b2.bname=’b’ and bo2.cno=bo.cno)
grop by bo.cno desc
将001班同学的归还日期延长一周
update borrow set rdate=dateAdd(day,7,borrow.rdate) from card,borrow where card.cno=borrow.cno and card.class=’001’;
20. 删除无人借阅的图书记录
delete from books where not exists(select * from borrow where bno=books.bno);
21.建立视图显示001班借书信息
create view v as
select * from borrow bo,card c,books b where bo.cno=c.cno and bo.bno=b.bno and c.class=’001’
分页查询select * from table limit (start-1)*limit,limit;
去重:Mysql不能删除查询出来的记录的,而是通过一张临时表且保留一条记录:
delete from table where id in (select id from (select id from table where expect in (select expect from table group by expect having count(expect)>1) and id not in(select min(id) from table group by expect having count(expect)>1)) as tmpresult)
你可能感兴趣的:(javaWeb之一些基础:JavaScript,jQuery,Ajax,JSP,Servlet,MySQL,)
Apache Tomcat默认文件漏洞
m0_67401606
java tomcat apache servlet 后端
ApacheTomcat默认文件漏洞一、概要漏洞描述:默认错误页面,默认索引页面,示例JSP和/或示例servlet安装在远程ApacheTomcat服务器上。应删除这些文件,因为它们可能有助于攻击者发现有关远程Tomcat安装或主机本身的信息。漏洞风险:中修复建议:删除默认索引页并删除示例JSP和servlet。按照Tomcat或OWASP说明更换或修改默认错误页面。二、解决办法1、直接删除do
【Apache Tomcat信息泄露漏洞】
猫饭_ACE
业务所需 tomcat apache java
一、漏洞详情ApacheTomcat是一个流行的开源Web服务器和Java代码的Servlet容器。9月28日,Apache发布安全公告,公开披露了Tomcat中的一个信息泄露漏洞(CVE-2021-43980)。由于某些Tomcat版本中的阻塞式读写的简化实现导致存在并发错误(极难触发),可能使客户端连接共享一个Http11Processor实例,导致响应或部分响应被错误的客户端接收,造成信息泄
Ubuntu下通过.sh文件同时启动多个程序系列3—gnome-terminal简单使用说明
JANGHIGH
Ubuntu ROS bash linux
gnome-terminal简单使用说明gnome-terminal使用基本用法启动后自动执行命令废弃命令提示:~~-x和-e解释~~如何使用.bashrc里的内容gnome-terminal使用基本用法1.gnome-terminal命令用于打开一个新的终端,直接在命令行$gnome-terminal就可以打开一个新的终端,有一些常用参数:2.打开后自动最大化$gnome-terminal--m
网络编程、URI和URL的区别、TCP/IP协议、IP和端口、URLConnection
述雾学java
Java核心基础 tcp/ip java java基础 网络编程
DAY12.1Java核心基础网络编程在互联网时代,网络在生活中处处可见,javaWeb占据了很大一部分那如何实现javaWeb编程呢?Web编程就是运行在同一个网络下面的终端,使得它们之间可以进行数据传输计算机网络基本知识计算机网络是通过硬件设施,传输媒介把不同物理地址上的计算机网络进行连接,形成一个资源共享和数据传输的网络系统两台终端进行连接需要遵守规定的网络协议语法:数据信息的结构语义:描述
【MySQL】插入查询结果,聚合函数
熙曦Sakura
MySQL mysql 数据库
6.5插入查询结果语法:INSERTINTOtable_name[(column[,column...])]SELECT...案例:删除表中的的重复记录,重复的数据只能有一份--创建原数据表CREATETABLEduplicate_table(idint,namevarchar(20));QueryOK,0rowsaffected(0.01sec)--插入测试数据INSERTINTOduplica
PyCharm v2024.3.5 强大的Python IDE工具 支持M、Intel芯片
2401_89264762
python ide pycharm
PyCharm是一种PythonIDE,带有一整套可以帮助用户在使用Python语言开发时提高其效率的工具,比如调试、语法高亮、Project管理、代码跳转、智能提示、自动完成、单元测试、版本控制。此外,该IDE提供了一些高级功能,以用于支持Django框架下的专业Web开发。应用介绍PyCharm是由JetBrains打造的一款PythonIDE,VS2010的重构插件Resharper就是出自
npm 命令使用文档
喆星时瑜
安装部署 前端 npm 前端 node.js
目录简介安装与配置基础命令依赖管理版本控制脚本管理包发布高级命令配置管理最佳实践常见问题1.简介npm(NodePackageManager)是Node.js的官方包管理工具,提供:130万+开源包的注册表访问依赖解析与版本管理项目脚本自动化私有包管理能力完整的包生命周期管理2.安装与配置2.1安装Node.js#通过官方安装包https://nodejs.org#验证安装node-vnpm-v2
oceanbase 是不是架构比较复杂 和mysql对比分析
hxsln11
金融 数据库 oceanbase 架构 mysql
我先来分析用户的需求。用户的问题是关于OceanBase和MySQL的架构复杂度对比,并希望了解两者在架构上的具体差异。这是一个技术性较强的问题,用户可能是数据库开发者、架构师或者对分布式数据库感兴趣的学习者。结合上下文,用户之前已经提到过OceanBase的学习曲线较陡峭,可能是因为其分布式架构的复杂性,所以这次的问题很可能是想进一步明确OceanBase和MySQL在架构上的具体差异,以及为什
免费界面库 python_一个非常简单好用的Python图形界面库(PysimpleGUI)
不妧
免费界面库 python
前一阵,我在为朋友编写一个源代码监控程序的时候,发现了一个Python领域非常简单好用的图形界面库。说起图形界面库,你可能会想到TkInter、PyQt、PyGUI等流行的图形界面库,我也曾经尝试使用,一个很直观的感受就是,这太难用了。就去网上搜搜,看看有没有一些demo,拿来改改,结果很少有,当时我就放弃了这些图形库的学习,转而使用了vue+flask的形式以浏览器网页作为程序界面,因为我会这个
Mariadb5.5.68升级10.5
熊博主
Linux云计算架构工程师 mysql mariadb 运维 linux 服务器
Mariadb5.5.68升级10.5#提前备份好数据库[root@master~]#mysqldump-uroot-p--all-databases>alldb.sqlEnterpassword:[root@master~]#llalldb.sql-rw-r--r--.1rootroot51523011月1818:59alldb.sql#移除原来的mariadb数据库[root@master~]
PySimpleGUI模块用法的示例(从入门到进阶)
赵阿萌
java 前端 服务器 linux javascript
入门版下面是几个全面展示PySimpleGUI模块用法的示例,并附有详细的代码注释,帮助你更好地掌握该模块的使用。示例1:简单的输入输出界面这是一个基础的GUI示例,展示了如何使用文本输入框、按钮和文本输出框。登录后复制importPySimpleGUIassg#定义布局layout=[[sg.Text("请输入您的名字:")],#标签组件[sg.InputText(key="-NAME-")],
java基础--序列化与反序列化的概念是什么?
阿硕的技术时间
【学习笔记】 java 开发语言
经典总结序列化就是把Java对象变成一串字节流,字节流就像是一种“通用语言”,可以在不同的计算机间传递。这样做的主要目的是保存对象的状态,以便以后可以恢复。反序列化则是把这些字节流重新变回Java对象,恢复对象的状态,方便程序继续使用它。详情内容1.什么是序列化?序列化是将Java对象转换为字节流的过程。字节流是一个平台无关的格式,可以在不同的计算机系统间传输。序列化的主要目的是将对象的状态保存下
普通人学习AI应该如何入手?2025年最新AI大模型学习路线+全套学习资料,适合新手小白!
小城哇哇
人工智能 学习 大数据 语言模型 AI大模型 agi ai
引言随着人工智能(AI)技术的飞速发展,越来越多的人开始意识到掌握这项技能的重要性。然而,对于许多没有编程背景或数学基础的人来说,进入AI领域似乎是一个遥不可及的梦想。但实际上,通过合理的规划和适当的学习资源,任何人都可以逐步掌握AI的核心知识,并应用到实际工作中去。本文将为普通读者提供一份详细的2025年最新AI大模型学习路线图,并附带一套完整的自学资料,帮助您从零基础起步,顺利开启AI学习之旅
【猫狗分类】Pytorch VGG16 实现猫狗分类1-数据清洗+制作标签文件
努力的小巴掌
pytorch分类项目 pytorch 分类 人工智能
Pytorch猫狗分类用Pytorch框架,实现分类问题,好像是学习了一些基础知识后的一个小项目阶段,通过这个分类问题,可以知道整个pytorch的工作流程是什么,会了一个分类,那就可以解决其他的分类问题,当然了,其实最重要的还是,了解她的核心是怎么工作的。那首先,我们的第一个项目,就做猫狗的分类。声明:整个数据和代码来自于b站,链接:使用pytorch框架手把手教你利用VGG16网络编写猫狗分类
Python点名器代码及打包教程
羽落惊鸿TQ
python 开发语言
接下来再写一个功能性齐全稍微复杂一点的Python点名器程序,在原简易版的基础上增加历史记录功能、支持多种名单格式(CSV/Excel)、增加点名统计功能,并详细说明了将该程序打包成exe可执行文件的方法,以下是源代码,仅供学习参考:importtkinterastkfromtkinterimportttk, messagebox, filedialogimportrandomimportcsvi
AI预测体彩排3新模型百十个定位预测+胆码预测+杀和尾+杀和值2025年3月21日第25弹
GIS小天
体彩排3 人工智能 机器学习 彩票 算法
前面由于工作原因停更了很长时间,停更期间很多彩友一直私信我何时恢复发布每日预测,目前手头上的项目已经基本收尾,接下来恢复发布。当然,也有很多朋友一直咨询3D超级助手开发的进度,在这里统一回复下。由于本人既精通编程+大数据分析,也热衷于彩票研究,所以很多彩友通过一些渠道找到了我。目前,加我的已有不少彩友,分成了3类人群:第一类:平时不懂数据分析,买彩全靠瞎猜乱蒙,这些朋友希望借助我的技术和方法来给他
mysql总结
tianyunlinger
大数据 mysql 数据库
MySQL基础1.数据库基本介绍数据库定义:用于存储数据的仓库,通过SQL语句操作。数据库作用:存储应用程序中的数据,便于管理和查询。数据库分类:关系型数据库(如MySQL、Oracle、DB2)和非关系型数据库(如Redis、HBase)。关系型数据库:通过E-R图描述数据之间的关系,支持复杂查询。2.MySQL在Linux中的安装安装前准备:配置防火墙、创建统一的管理目录(如/export/s
FPGA仿真过程中宏定义的修改
学习永无止境@
fpga开发
在仿真过程中,经常会有一些时间变量,比如1分钟,10分钟等,这种级别的仿真很费时间,因此,人们往往将时间参数修改,利用秒级别进行仿真,仿真完成后,再改回分钟级别。下面提供一种宏定义的方式,方便实际过程中和仿真过程中时间参数修改。`defineSIMULATION`ifdefSIMULATIONlocalparamTIMER_CNT_1S=30'd1_000-1'b1;//1s计数的最大值local
FPGA设计中衍生时钟的定义及约束
学习永无止境@
FPGA设计 fpga开发 fpga 时钟约束
衍生时钟的定义:衍生时钟主要是指由已有的主时钟进行分频、倍频或相移而产生出来的时钟信号,如由时钟管理单元(MMCM等)或一些设计逻辑所驱动产生的时钟信号。衍生时钟的定义取决于主时钟的特性,衍生时钟约束必须指定时钟源,这个时钟源可以是一个已经约束好的主时钟或者另一个衍生时钟,衍生时钟并不直接定义频率、占空比等参数,而是定义其与时钟源的相对关系,如分频系数、倍频系数、相移差值、占空比差值等。因此,在做
分享Python7个爬虫小案例(附源码)
人工智能-猫猫
爬虫 python 开发语言
在这篇文章中,我们将分享7个Python爬虫的小案例,帮助大家更好地学习和了解Python爬虫的基础知识。以下是每个案例的简介和源代码:1.爬取豆瓣电影Top250这个案例使用BeautifulSoup库爬取豆瓣电影Top250的电影名称、评分和评价人数等信息,并将这些信息保存到CSV文件中。importrequestsfrombs4importBeautifulSoupimportcsv#请求U
Zynq PL端IP核之AXI DMA
Mazy.v
fpga开发 嵌入式硬件 arm开发 单片机
1.AXIDMA简介Zynq提供了两种DMA,一种是PS中的DMA控制器,通过GP口与PL端连接,另一种是PL中的AXIDMAIP核(软核),通过HP口与PS端连接。Zynq有4个HP接口,每一个HP接口都包含控制和数据FIFO,这些FIFO为大数据量突发传输提供缓冲,让HP接口成为理想的高速数据传输接口。AXIDMAIP内核在AXI4内存映射和AXI4StreamIP接口之间提供高带宽直接储存访
9种JavaScript数组去重的高阶方法
2501_90226133
javascript java 算法
给定一个数组[1,2,2,4,null,null,‘3’,‘abc’,3,5,4,1,2,2,4,null,null,‘3’,‘abc’,3,5,4]去除重复项。letarr=[1,2,2,4,null,null,‘3’,‘abc’,3,5,4,1,2,2,4,null,null,‘3’,‘abc’,3,5,4]1、利用对象的key唯一众所周知,对象的key不可重复,否则后者将覆盖前者。利用该特性
Pyhton 基础
368.
python python 开发语言
初识PythonPython是一种解释型语言Python使用缩进对齐组织代码执行,所以没有缩进的代码,都会在载入时自动执行数据类型:整形int无限大浮点型float小数复数complex由实数和虚数组成Python中有6个标准的数据类型:Number(数字)String(字符串)List(列表)Tuple(元组)Sets(集合)Dictionart(字典)其中不可变得数据:Number(数字)St
神州数码基础命令
小淮@
网络 运维 数据库
组网小知识1.设备连接:不同种类型设备的连接用:直通线同种或是跨层设备的连接用:交叉线(路由与PC)2.注意设备的叠放次序3.IP地址要先理顺,以便加快速度。先完成基本配置,全网连通后,继续其它。交换机还原配置文件:特权模式下:setdefault/write/后重启reload被加入密码后,起动过程,ctrl+b/deletestartup-config/后重启reload操作系统nos.img
基于python+django+mysql的小区物业管理系统源码+运行步骤
冷琴1996
Python系统设计 python 开发语言
该系统是基于python+django开发的小区物业管理系统。适用场景:大学生、课程作业、毕业设计。学习过程中,如遇问题可以在github给作者留言。主要功能有:业主管理、报修管理、停车管理、资产管理、小区管理、用户管理、日志管理、系统信息。源码学习技术。演示地址http://wuye.gitapp.cn/admin后台管理帐号:用户名:admin123密码:admin123源码地址https:/
Ark-TS 语言:鸿蒙生态的高效开发利器,让我们用大白话说一说
harmonyos-next
Ark-TS(华为专门为鸿蒙系统——就是华为自己的手机、平板、智能设备操作系统——设计的编程语言,基于TypeScript,一种比普通JavaScript更严格、能减少错误的语言)是鸿蒙应用开发的主力工具。它就像给开发者配备了一套趁手的工具包,让写代码又快又稳。简单来说,Ark-TS有几个厉害的地方:静态类型检查(写代码时必须给变量指定类型,比如数字、文字,这样电脑能在运行前就发现类型错误,避免程
深入探索C++:从基础到高级
c++
深入探索C++:从基础到高级一、C++简介C++是一种通用的、静态类型的、大小写敏感的、自由格式的编程语言,支持过程化编程、面向对象编程和泛型编程。它最初由BjarneStroustrup在1980年代设计,目的是在C语言的基础上增加面向对象的功能。C++广泛应用于系统/应用程序软件、游戏开发、高性能服务器和客户端应用等领域。二、C++的核心特性(一)数据类型C++提供了丰富的数据类型,包括基本数
借Kinect 扫描 软件 reconstructMe skanect ksan3d
learn deep learning
三维重建
[基础技术]3D扫描教程http://bbs.kechuang.org/read/59979楼主#更多发布于:2013-08-2314:48入门级的3D扫描ReconstructMe硬件kinectXBox360不兼容kinectforwindows或者XtionProLive(XtionProLive开发版包装,有Microphone和RGBsensor)有电动转盘更好,win732位或者64位
6.Redis 缓存使用问题及解决方案
拾柒mm
缓存 redis mybatis
引言Redis作为一种高效的缓存解决方案,广泛应用于各类项目中。然而,使用缓存时也会面临一些问题,特别是数据一致性、缓存穿透、击穿、雪崩等问题。1.数据一致性数据一致性是指在使用缓存时,缓存中的数据与数据库中的数据保持一致。数据不一致可能导致用户获取到过时的信息,影响用户体验。1.1数据操作方案在进行数据增删改操作时,常见的方案有:先更新缓存,再更新数据库:优点:缓存命中率提高,用户可以快速获取到
单例模式实现
后端
一、是什么单例模式(SingletonPattern):创建型模式,提供了一种创建对象的最佳方式,这种模式涉及到一个单一的类,该类负责创建自己的对象,同时确保只有单个对象被创建在应用程序运行期间,单例模式只会在全局作用域下创建一次实例对象,让所有需要调用的地方都共享这一单例对象,如下图所示:二、实现在javascript中,实现一个单例模式可以用一个变量来标志当前的类已经创建过对象,如果下次获取当
安装数据库首次应用
Array_06
java oracle sql
可是为什么再一次失败之后就变成直接跳过那个要求
enter full pathname of java.exe的界面
这个java.exe是你的Oracle 11g安装目录中例如:【F:\app\chen\product\11.2.0\dbhome_1\jdk\jre\bin】下的java.exe 。不是你的电脑安装的java jdk下的java.exe!
注意第一次,使用SQL D
Weblogic Server Console密码修改和遗忘解决方法
bijian1013
Welogic
在工作中一同事将Weblogic的console的密码忘记了,通过网上查询资料解决,实践整理了一下。
一.修改Console密码
打开weblogic控制台,安全领域 --> myrealm -->&n
IllegalStateException: Cannot forward a response that is already committed
Cwind
java Servlets
对于初学者来说,一个常见的误解是:当调用 forward() 或者 sendRedirect() 时控制流将会自动跳出原函数。标题所示错误通常是基于此误解而引起的。 示例代码:
protected void doPost() {
if (someCondition) {
sendRedirect();
}
forward(); // Thi
基于流的装饰设计模式
木zi_鸣
设计模式
当想要对已有类的对象进行功能增强时,可以定义一个类,将已有对象传入,基于已有的功能,并提供加强功能。
自定义的类成为装饰类
模仿BufferedReader,对Reader进行包装,体现装饰设计模式
装饰类通常会通过构造方法接受被装饰的对象,并基于被装饰的对象功能,提供更强的功能。
装饰模式比继承灵活,避免继承臃肿,降低了类与类之间的关系
装饰类因为增强已有对象,具备的功能该
Linux中的uniq命令
被触发
linux
Linux命令uniq的作用是过滤重复部分显示文件内容,这个命令读取输入文件,并比较相邻的行。在正常情 况下,第二个及以后更多个重复行将被删去,行比较是根据所用字符集的排序序列进行的。该命令加工后的结果写到输出文件中。输入文件和输出文件必须不同。如 果输入文件用“- ”表示,则从标准输入读取。
AD:
uniq [选项] 文件
说明:这个命令读取输入文件,并比较相邻的行。在正常情况下,第二个
正则表达式Pattern
肆无忌惮_
Pattern
正则表达式是符合一定规则的表达式,用来专门操作字符串,对字符创进行匹配,切割,替换,获取。
例如,我们需要对QQ号码格式进行检验
规则是长度6~12位 不能0开头 只能是数字,我们可以一位一位进行比较,利用parseLong进行判断,或者是用正则表达式来匹配[1-9][0-9]{4,14} 或者 [1-9]\d{4,14}
&nbs
Oracle高级查询之OVER (PARTITION BY ..)
知了ing
oracle sql
一、rank()/dense_rank() over(partition by ...order by ...)
现在客户有这样一个需求,查询每个部门工资最高的雇员的信息,相信有一定oracle应用知识的同学都能写出下面的SQL语句:
select e.ename, e.job, e.sal, e.deptno
from scott.emp e,
(se
Python调试
矮蛋蛋
python pdb
原文地址:
http://blog.csdn.net/xuyuefei1988/article/details/19399137
1、下面网上收罗的资料初学者应该够用了,但对比IBM的Python 代码调试技巧:
IBM:包括 pdb 模块、利用 PyDev 和 Eclipse 集成进行调试、PyCharm 以及 Debug 日志进行调试:
http://www.ibm.com/d
webservice传递自定义对象时函数为空,以及boolean不对应的问题
alleni123
webservice
今天在客户端调用方法
NodeStatus status=iservice.getNodeStatus().
结果NodeStatus的属性都是null。
进行debug之后,发现服务器端返回的确实是有值的对象。
后来发现原来是因为在客户端,NodeStatus的setter全部被我删除了。
本来是因为逻辑上不需要在客户端使用setter, 结果改了之后竟然不能获取带属性值的
java如何干掉指针,又如何巧妙的通过引用来操作指针————>说的就是java指针
百合不是茶
C语言的强大在于可以直接操作指针的地址,通过改变指针的地址指向来达到更改地址的目的,又是由于c语言的指针过于强大,初学者很难掌握, java的出现解决了c,c++中指针的问题 java将指针封装在底层,开发人员是不能够去操作指针的地址,但是可以通过引用来间接的操作:
定义一个指针p来指向a的地址(&是地址符号):
Eclipse打不开,提示“An error has occurred.See the log file ***/.log”
bijian1013
eclipse
打开eclipse工作目录的\.metadata\.log文件,发现如下错误:
!ENTRY org.eclipse.osgi 4 0 2012-09-10 09:28:57.139
!MESSAGE Application error
!STACK 1
java.lang.NoClassDefFoundError: org/eclipse/core/resources/IContai
spring aop实例annotation方法实现
bijian1013
java spring AOP annotation
在spring aop实例中我们通过配置xml文件来实现AOP,这里学习使用annotation来实现,使用annotation其实就是指明具体的aspect,pointcut和advice。1.申明一个切面(用一个类来实现)在这个切面里,包括了advice和pointcut
AdviceMethods.jav
[Velocity一]Velocity语法基础入门
bit1129
velocity
用户和开发人员参考文档
http://velocity.apache.org/engine/releases/velocity-1.7/developer-guide.html
注释
1.行级注释##
2.多行注释#* *#
变量定义
使用$开头的字符串是变量定义,例如$var1, $var2,
赋值
使用#set为变量赋值,例
【Kafka十一】关于Kafka的副本管理
bit1129
kafka
1. 关于request.required.acks
request.required.acks控制者Producer写请求的什么时候可以确认写成功,默认是0,
0表示即不进行确认即返回。
1表示Leader写成功即返回,此时还没有进行写数据同步到其它Follower Partition中
-1表示根据指定的最少Partition确认后才返回,这个在
Th
lua统计nginx内部变量数据
ronin47
lua nginx 统计
server {
listen 80;
server_name photo.domain.com;
location /{set $str $uri;
content_by_lua '
local url = ngx.var.uri
local res = ngx.location.capture(
java-11.二叉树中节点的最大距离
bylijinnan
java
import java.util.ArrayList;
import java.util.List;
public class MaxLenInBinTree {
/*
a. 1
/ \
2 3
/ \ / \
4 5 6 7
max=4 pass "root"
Netty源码学习-ReadTimeoutHandler
bylijinnan
java netty
ReadTimeoutHandler的实现思路:
开启一个定时任务,如果在指定时间内没有接收到消息,则抛出ReadTimeoutException
这个异常的捕获,在开发中,交给跟在ReadTimeoutHandler后面的ChannelHandler,例如
private final ChannelHandler timeoutHandler =
new ReadTim
jquery验证上传文件样式及大小(好用)
cngolon
文件上传 jquery验证
<!DOCTYPE html>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<script src="jquery1.8/jquery-1.8.0.
浏览器兼容【转】
cuishikuan
css 浏览器 IE
浏览器兼容问题一:不同浏览器的标签默认的外补丁和内补丁不同
问题症状:随便写几个标签,不加样式控制的情况下,各自的margin 和padding差异较大。
碰到频率:100%
解决方案:CSS里 *{margin:0;padding:0;}
备注:这个是最常见的也是最易解决的一个浏览器兼容性问题,几乎所有的CSS文件开头都会用通配符*来设
Shell特殊变量:Shell $0, $#, $*, $@, $?, $$和命令行参数
daizj
shell $# $? 特殊变量
前面已经讲到,变量名只能包含数字、字母和下划线,因为某些包含其他字符的变量有特殊含义,这样的变量被称为特殊变量。例如,$ 表示当前Shell进程的ID,即pid,看下面的代码:
$echo $$
运行结果
29949
特殊变量列表 变量 含义 $0 当前脚本的文件名 $n 传递给脚本或函数的参数。n 是一个数字,表示第几个参数。例如,第一个
程序设计KISS 原则-------KEEP IT SIMPLE, STUPID!
dcj3sjt126com
unix
翻到一本书,讲到编程一般原则是kiss:Keep It Simple, Stupid.对这个原则深有体会,其实不仅编程如此,而且系统架构也是如此。
KEEP IT SIMPLE, STUPID! 编写只做一件事情,并且要做好的程序;编写可以在一起工作的程序,编写处理文本流的程序,因为这是通用的接口。这就是UNIX哲学.所有的哲学真 正的浓缩为一个铁一样的定律,高明的工程师的神圣的“KISS 原
android Activity间List传值
dcj3sjt126com
Activity
第一个Activity:
import java.util.ArrayList;import java.util.HashMap;import java.util.List;import java.util.Map;import android.app.Activity;import android.content.Intent;import android.os.Bundle;import a
tomcat 设置java虚拟机内存
eksliang
tomcat 内存设置
转载请出自出处:http://eksliang.iteye.com/blog/2117772
http://eksliang.iteye.com/
常见的内存溢出有以下两种:
java.lang.OutOfMemoryError: PermGen space
java.lang.OutOfMemoryError: Java heap space
------------
Android 数据库事务处理
gqdy365
android
使用SQLiteDatabase的beginTransaction()方法可以开启一个事务,程序执行到endTransaction() 方法时会检查事务的标志是否为成功,如果程序执行到endTransaction()之前调用了setTransactionSuccessful() 方法设置事务的标志为成功则提交事务,如果没有调用setTransactionSuccessful() 方法则回滚事务。事
Java 打开浏览器
hw1287789687
打开网址 open浏览器 open browser 打开url 打开浏览器
使用java 语言如何打开浏览器呢?
我们先研究下在cmd窗口中,如何打开网址
使用IE 打开
D:\software\bin>cmd /c start iexplore http://hw1287789687.iteye.com/blog/2153709
使用火狐打开
D:\software\bin>cmd /c start firefox http://hw1287789
ReplaceGoogleCDN:将 Google CDN 替换为国内的 Chrome 插件
justjavac
chrome Google google api chrome插件
Chrome Web Store 安装地址: https://chrome.google.com/webstore/detail/replace-google-cdn/kpampjmfiopfpkkepbllemkibefkiice
由于众所周知的原因,只需替换一个域名就可以继续使用Google提供的前端公共库了。 同样,通过script标记引用这些资源,让网站访问速度瞬间提速吧
进程VS.线程
m635674608
线程
资料来源:
http://www.liaoxuefeng.com/wiki/001374738125095c955c1e6d8bb493182103fac9270762a000/001397567993007df355a3394da48f0bf14960f0c78753f000 1、Apache最早就是采用多进程模式 2、IIS服务器默认采用多线程模式 3、多进程优缺点 优点:
多进程模式最大
Linux下安装MemCached
字符串
memcached
前提准备:1. MemCached目前最新版本为:1.4.22,可以从官网下载到。2. MemCached依赖libevent,因此在安装MemCached之前需要先安装libevent。2.1 运行下面命令,查看系统是否已安装libevent。[root@SecurityCheck ~]# rpm -qa|grep libevent libevent-headers-1.4.13-4.el6.n
java设计模式之--jdk动态代理(实现aop编程)
Supanccy2013
java DAO 设计模式 AOP
与静态代理类对照的是动态代理类,动态代理类的字节码在程序运行时由Java反射机制动态生成,无需程序员手工编写它的源代码。动态代理类不仅简化了编程工作,而且提高了软件系统的可扩展性,因为Java 反射机制可以生成任意类型的动态代理类。java.lang.reflect 包中的Proxy类和InvocationHandler 接口提供了生成动态代理类的能力。
&
Spring 4.2新特性-对java8默认方法(default method)定义Bean的支持
wiselyman
spring 4
2.1 默认方法(default method)
java8引入了一个default medthod;
用来扩展已有的接口,在对已有接口的使用不产生任何影响的情况下,添加扩展
使用default关键字
Spring 4.2支持加载在默认方法里声明的bean
2.2
将要被声明成bean的类
public class DemoService {