主要内容:基础加强部分:单元测试、注解、反射、内省;mysql;前端三件套和bootstrap;xml
定义测试类–> 定义测试方法–>给方法加@Test–> 导入junit依赖环境
红色–>失败; 绿色–>成功
一般用断言操作来处理结果
Assert.assertEquals(期望的结果,实际结果)
@Before
修饰的方法会在测试方法之前被自动执行@After
修饰的方法会在测试方法之后被自动执行框架设计的灵魂
框架:半成品软件。可以在框架的基础上进行软件开发,简化代码
将不变的封装起来,变化的留给使用者,如xml、yml等配置
反射: 将类的各个组成部分封装为其他对象,这就是反射机制
Class.forName("全类名")
: 将字节码文件加载进内存,返回class对象
类名.class
通过类名的属性class获取
结论:同一个字节码文件(*.class)在一次程序运行过程中,只会被加载一次
Field[] getFields()
:获取所有public修饰的成员变量Field getField(String name)
获取指定名称的 public修饰的成员变量Field[] getDeclaredFields()
获取所有的成员变量,不考虑修饰符Field getDeclaredField(String name)
Constructor>[] getConstructors()
Constructor getConstructor(类>... parameterTypes)
Constructor getDeclaredConstructor(类>... parameterTypes)
Constructor>[] getDeclaredConstructors()
Method[] getMethods()
Method getMethod(String name, 类>... parameterTypes)
Method[] getDeclaredMethods()
Method getDeclaredMethod(String name, 类>... parameterTypes)
String getName()
void set(Object obj, Object value)
get(Object obj)
setAccessible(true)
暴力反射T newInstance(Object... initargs)
Class
对象的newInstance
方法Object invoke(Object obj, Object... args)
String getName
内省(IntroSpector) 是java语言对Bean类属性、事件的一种默认处理方法。JavaBean是一种特殊的类,主要用于传递数据信息,这种类中的方法主要用于访问私有的字段,且方法名符合某种命名规则。如果在两个模块之间传递信息,可以将信息封装进JavaBean中,这种对象称为"值对象"(Value Object 或VO)。内省机制通过反射来实现的,BeanInfo用来暴露一个bean的属性、方法和事件。
前提:内省对javaBean类操作的一门技术,通过反射机制来完成。
实现步骤:
package cn.itheima.introspetor;
import java.beans.IntrospectionException;
import java.beans.Introspector;
import java.beans.PropertyDescriptor;
import java.lang.reflect.Method;
import java.util.HashMap;
import java.util.Map;
import java.util.Set;
public class MyBeanUtils {
//1.提供一个方法:map ,javaBean
// 2.原则:map的key 和 javaBean的属性名称一一比较,如果一致,调用写方法,设置值到bean
public static void pop(Map<String,String[]> map,Object obj) throws Exception {
//1.获取map的keys
Set<String> keys = map.keySet();
//2.获取bean的属性名称的结合
PropertyDescriptor[] ds = Introspector.getBeanInfo(obj.getClass()).getPropertyDescriptors();
//3.遍历key和属性名称一一比较
for (String key : keys) {
for (PropertyDescriptor d : ds) {
String field_name = d.getName();
if(field_name.equals(key)){
//说明key和属性名称一致,设置值(写方法)
Method writeMethod = d.getWriteMethod();
//设置值
writeMethod.invoke(obj,map.get(key)[0]);// new User().setxxx(value)
}
}
}
}
public static void main(String[] args) throws Exception {
//1.map模拟表单提交的数据
Map<String,String[]> map = new HashMap<String,String[]>();
map.put("id",new String[]{"001"});
map.put("username",new String[]{"jack"});
User user = new User();
pop(map,user);
System.out.println(user);
}
}
前提:map的key(表单提交的输入项:name=“username”)和javabean的属性名称一致。表中的字段名称和javabean的属性名称一致。
如 BeanUtils工具类:把map中的数据封装到javabean对象
JDBCTemplate模板类:把表中的记录封装到javabean对象
mybatis:操作数据库
说明程序的。给计算机看的 注解不是程序的一部分,可以理解为注解就是一个标签
定义:注解(Annotation),也叫元数据。一种代码级别的说明。它是JDK1.5及以后版本引入的一个特性,与类、接口、枚举是在同一个层次。它可以声明在包、类、字段、方法、局部变量、方法参数等的前面,用来对这些元素进行说明,注释。
JDK1.5之后的新特性;
说明程序的;
使用注解:@注解名称
①编写文档:通过代码里标识的注解生成文档【生成文档doc文档】
@author itcast 作者是itcast
@version 1.0 版本是1.0
@since 1.5 从1.5之后可以使用可以使用我这个类
②代码分析:通过代码里标识的注解对代码进行分析【使用反射】
③编译检查:通过代码里标识的注解让编译器能够实现基本的编译检查【Override】
@Override :检测被该注解标注的方法是否是继承自父类(接口)的
@Deprecated:该注解标注的内容,表示已过时
@SuppressWarnings:压制警告
一般传递参数all @SuppressWarnings(“all”)
元注解
public @interface 注解名称{
属性列表;
}
本质:注解本质上就是一个接口,该接口默认继承Annotation接口
public interface MyAnno extends java.lang.annotation.Annotation {}
接口中的抽象方法
要求:
用于描述注解的注解
@Target:描述注解能够作用的位置
@Retention:描述注解被保留的阶段
@Documented:描述注解是否被抽取到api文档中
@Inherited:描述注解是否被子类继承[inherteide]
获取注解中定义的属性值
获取注解定义的位置的对象 (Class,Method,Field)
获取指定的注解
getAnnotation(Class)
//其实就是在内存中生成了一个该注解接口的子类实现对象
public class ProImpl implements Pro{
public String className(){
return "cn.itcast.annotation.Demo1";
}
public String methodName(){
return "show";
}
}
调用注解中的抽象方法获取配置的属性值
不管是什么文件,必须放在src目录下面
因为类加载器和src的根目录是同级的,所以在根目录下的文件,直接写文件的名称就能找到
DataBase 简称:DB
用于存储和管理数据的仓库
数据库专业描述:RDBMS(关系型数据库管理系统),通俗的来说就是一个文件系统
mysql的服务启动和关闭
服务: service,没有界面的应用程序
方式:
几个概念
Structured Query Language
其实就是定义了操作所有关系型数据库的规则。每一种数据库操作的方式存在不一样的地方,称为“方言”。
SQL语句可以单行或多行书写,以分号结尾
可使用空格和缩进增强语句的可读性
mysql数据库的SQL语句不区分大小写,关键字建议大写
3种注释 * 单行注释:-- 注释内容 或 # 注释内容
* 多行注释: /* 注释 */
DDL(Data Definition Language) 对数据库和表的操作
用来定义数据库对象:数据库,表列等。关键字:create,drop,alter等
DCL(Data Control Language) 授权
DML(Data Manipulation Language) 增删改表中的数据
用来对数据库中表的数据进行增删改 关键字 insert delete update等
DQL(Data Query Language) 查询表中的数据
用来查询数据库中表的记录(数据) 关键字: select where等
重要的SQL:查询数据库所有的字符集(分析数据库插入中文乱码)
show variables like ‘%char%’;
dos 默认 windows的为gbk
如果乱码,临时设置 set names gbk;
操作数据库:CRUD
select database();
use 数据库名称
操作表
C(Create) 创建
create table 表名(
列名1 数据类型1;
列名2 数据类型2;
...
列名n 数据类型n
);
注意:最后一列,不需要加逗号
数据类型:
age int
score double(5,2)
name varchar(20)
复制表 create table stu like student
R(Retrieve) 查询
查询某个数据库中所有的表名称 show tables;
查询表结构 desc 表名;
表结构:字段名称(表的列名) 和 字段对象的类型
查看创建表的SQL语句 show create table xxx \G
其中\G
使得记录能够更好展示
U(Update) 修改
alter table 表名 rename to 新的表名;
alter table 表名 character set 字符集名
show create table stu2;
alter table 表名 change 字段名称 新的字段名称 字段的类型
alter table 表名 modify 字段名称 新的字段类型
alter table 表名 add 新的字段名称 字段类型
alter table 表名 drop 字段名称
change和modify都可以修改表的定义,不同是change后面写两次列名。但change可以改列名称,modify不能。
D(Delete) 删除
drop table if exists 表名
;insert into 表名(列1,列2,...列名n) values(值1,值2,..值n);
truncate table 表名;
– 删除表,然后创建一个一模一样的空表truncate和delete的区别?
从分类上来说:
delete 操作的表中的数据 属于DML(更新数据)
truncate 操作的表,属于DDL
从性能来说:
delete from user; 删除所有的数据(一条一条删,耗时长)
truncate:先删除表(表里的数据就不存在),会再次创建一个新的空表
select * from 表名;
select
字段列表
from
表名列表
where
条件列表
group by
分组字段
having
分组之后的条件
order by
排序
limit
分页限定
基础
select distinct deptno from emp;
语法: order by 子句
升序: ASC
降序: DESC
注意: 如果有多个排序条件,则当前边的条件值一样时,才会判断第二条件
将一列数据作为一个整体,进行纵向计算
注意: count()计算,排除null值,解决方案:1. 选择非空的列 2. ifnull()函数
语法: group by 分组字段 – 分组字段(数据要有共性的特点)
select 分组字段,聚合函数 -- 共性特点
from 表名
where 条件(分组前的条件,如果数据不符合条件,就不参与分组)
group by 分组字段
having 条件(分组后的条件,对分组后的结果进行条件判断)
order by 排序;
注意:
分组之后查询的字段:分组字段,聚合函数
where和having的区别?
limit 1,3
not null 某一列的值不能为null
创建表时添加约束
create table stu(
id int,
name varchar(20) not null
);
创建表之后添加约束
alter table stu modify name varchar(20) not null;
unique,同非空约束
创建表后删除
alter table stu drop index phone_number;
primary key
注意:
在创建表时,添加主键约束
create table stu(
id int primary key, -- 给id添加主键约束
name varchar(20)
);
自动增长
概念:如果某一列是数值类型,使用auto_increment 可以来完成自动增长
在创建表时,添加主键约束,并且完成自增长
create table stu(
id int primary key auto_increment,
name varchar(20)
);
注意:在一个表中,只允许主键自增长
不是自己随意定义的,而是与之关联表的主键
外键约束:让表与表产生关系,保证数据的正确性。
在创建表时,可以添加外键
create table 表名(
...
外键列,
constraint 外键名 foreign key (外键列) references 主表名(关联列名)
);
删除外键
alter table employee drop foreign key emp_dep_fk;
添加外键
alter table employee add constraint 外键名 foreign key (外键列) references 主表名(关联列名);
级联操作 谨慎使用
alter table employee add constraint 外键名 foreign key (外键列) references 主表名(关联列名) on update cascade on delete cascade;
实际,用powerDesigner设计表,不用这些SQL语法
可以为null(这条数据没有意义)
外键的值可以重复
外键的值不是随意定义的,必须引用另一张表的主键值
结论: 设计外键时,外键是普通的字段,另一张表的字段必须是主键
E-R模型
经过研究和对使用中问题的总结,对于设计数据库提出了一些规范,这些规范被称为范式
说明:后一个范式,都是在前一个范式的基础上建立的
2. 数据库设计的范式
* 概念:设计数据库时,需要遵循的一些规范。要遵循后边的范式要求,必须先遵循前边的所有范式要求
设计关系数据库时,遵从不同的规范要求,设计出合理的关系型数据库,这些不同的规范要求被称为不同的范式,各种范式呈递次规范,越高的范式数据库冗余越小。
目前关系数据库有六种范式:第一范式(1NF)、第二范式(2NF)、第三范式(3NF)、巴斯-科德范式(BCNF)、第四范式(4NF)和第五范式(5NF,又称完美范式)。
* 分类:
1. 第一范式(1NF):每一列都是不可分割的原子数据项
2. 第二范式(2NF):在1NF的基础上,非码属性必须完全依赖于码(在1NF基础上消除非主属性对主码的部分函数依赖)
* 几个概念:
1. 函数依赖:A-->B,如果通过A属性(属性组)的值,可以确定唯一B属性的值。则称B依赖于A(sfz)
例如:学号-->姓名。 (学号,课程名称) --> 分数
2. 完全函数依赖:A-->B, 如果A是一个属性组,则B属性值得确定需要依赖于A属性组中所有的属性值。(zb)
例如:(学号,课程名称) --> 分数
3. 部分函数依赖:A-->B, 如果A是一个属性组,则B属性值得确定只需要依赖于A属性组中某一些值即可。
例如:(学号,课程名称) -- > 姓名
4. 传递函数依赖:A-->B, B -- >C . 如果通过A属性(属性组)的值,可以确定唯一B属性的值,在通过B属性(属性组)的值可以确定唯一C属性的值,则称 C 传递函数依赖于A
例如:学号-->系名,系名-->系主任
5. 码:如果在一张表中,一个属性或属性组,被其他所有属性所完全依赖,则称这个属性(属性组)为该表的码
例如:该表中码为:(学号,课程名称)
* 主属性:码属性组中的所有属性
* 非主属性:除过码属性组的属性
3. 第三范式(3NF):在2NF基础上,任何非主属性不依赖于其它非主属性(在2NF基础上消除传递依赖)
主要是DBA管理系统中的对象权限
-- 创建用户nacos,有对nacos_config数据库下的表的select/insert权限
grant select,insert on nacos_config.* to 'nacos'@'localhost' identified by '123';
-- 收回nacos用户的insert权限
revoke insert on nacos_config.* from 'nacos'@'localhost';
命令行
备份:
mysqldump -u用户名 -p明码 > 保存的路径
还原
mysql进入之后,在创建好的数据库中 source 保存的路径
图形化界面操作 SQLYog
笛卡尔积:有两个集合A,B,取这两个集合的所有组成情况
要完成多表查询,需要消除无用的数据
查询语法
select
列名列表
from
表名列表
where ...
内连接查询 只包括交集
隐式内连接
SELECT
t1.`name`, -- 员工表的姓名
t1.`gender`, -- 员工表的性别
t2.`name` -- 部门表的名称
FROM
emp t1,dept t2
WHERE
t1.`dept_id`=t2.`id`;
显式内连接
select 字段列表 from 表名1 inner join 表名2 on 条件
内连接查询:
外链接查询
左外连接 一般用左外,包括左外和交集
select 字段列表 from 表1 left join 表2 on 条件
左外连接查询的是左表所有数据以及其交集部分
右外连接
select 字段列表 from 表1 right join 表2 on 条件
子查询
概念:查询中嵌套查询,称嵌套查询为子查询,在4.1zhi
-- 查询工资最高的员工信息
SELECT MAX(salary) FROM emp;
-- 查询员工信息,工资等于9000
SELECT * FROM emp WHERE emp.`salary`=9000;
-- 合并为一条
SELECT * FROM emp WHERE emp.`salary`=(SELECT MAX(salary) FROM emp);
子查询的不同情况
子查询的结果是单行单列的值
子查询可以作为条件,放在where后边,使用运算符去判断
-- 查询员工工资小于平均工资的人
SELECT * FROM emp WHERE emp.`salary`< (SELECT AVG(salary) FROM emp);
子查询的结果是多行单列的数组
-- 查询所有财务部和市场部员工的信息
SELECT id FROM dept WHERE NAME = '财务部' OR NAME='市场部';
SELECT * FROM emp WHERE dept_id = 3 OR dept_id=2;
-- 子查询
SELECT * FROM emp WHERE dept_id IN (SELECT id FROM dept WHERE NAME = '财务部' OR NAME='市场部');
子查询的结果是多行多列的子表
子查询可以作为一张虚拟表参与查询,放在from后边
-- 查询员工的入职日期是2011-11-11日之后的员工信息和部门信息
-- 子查询
SELECT * FROM dept t1,(SELECT * FROM emp WHERE emp.`join_date` >'2011-11-11') t2
WHERE t1.id = t2.dept_id;
-- 普通内连接
SELECT * FROM emp t1,dept t2 WHERE t1.`dept_id`=t2.`id` AND t1.`join_date`>'2011-11-11';
select @@autocommit; --1代表自动提交 0代表手动提交
在企业开发中,框架里面配置事务来解决相关的数据库问题,spring框架在项目中配置事务。
脏读:小牛的支付宝 24小时还是2个小时,会产生脏读
技术难点
java database connectivity,java数据库连接,java语言操作数据库
JDBC本质:其实是官方(sun公司)定义的一套操作所有关系型数据库的规则,即接口。各个数据库厂商去实现这套接口,提供数据库驱动jar包,我们可以使用这套接口编程,真正执行的代码是驱动jar包中的实现类
由sun公司工程师指定的一套操作数据库的规范(接口),让不同的数据库厂商来实现这一组规范(接口),从而开发人员只需要熟悉jdbc规范即可,也就是数开发人员只需要知道jdbc就可以操作不同的数据库(不用管不同数据库的底层实现)。
步骤:
导入驱动jar包
1. 赋值mysql的jar包到项目的libs目录下
2. 右键--> add as library 加载到项目中
2. 注册驱动
3. 获取数据库连接对象 connection
4. 定义SQL
5. 获取执行SQL语句的对象 statement
6. 执行SQL,接收返回结果
7. 处理结果
8. 释放资源
代码实现
// 1. 导入驱动jar包
// 2. 注册驱动
Class.forName("com.mysql.jdbc.Driver");
// 3. 获取数据库连接对象
Connection conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/db3", "root", "root");
// 4. 定义SQL语句
String sql = "update account set balance = 500 where id=1";
// 5. 获取执行SQL的对象 statement
Statement stmt = conn.createStatement();
// 6. 执行SQL
int count = stmt.executeUpdate(sql);
// 7. 处理结果
System.out.println(count);
// 8. 释放资源
stmt.close();
conn.close();
功能:
注册驱动: 告诉程序该使用哪一个数据库驱动jar
static void registerDriver(Driver driver):
注册与给定的驱动程序DriverManager
写代码使用:Class.forName("com.mysql.jdbc.Driver")
通过查看源码发现,在com.mysql.jdbc.Driver
类中存在静态代码块
static {
try {
java.sql.DriverManager.registerDriver(new Driver());
}catch (SQLException var1){
throw new RuntimeException("Can't register driver!");
}
}
注意:mysql5之后的驱动jar包可以省略注册驱动的步骤
获取数据库连接
static Connection getConnection(String url,String user,String password)
jdbc:mysql://ip地址(域名):端口号/数据库名称
jdbc:mysql://localhost:3306/db3
jdbc:mysql:///db3
user
:用户名password
:密码功能:
获取执行SQL的对象
管理事务
开启事务
setAutoCommit(boolean autoCommit)
: 调用该方法设置参数为false,即开启事务
提交事务
commit()
回滚事务
rollback()
执行sql
boolean execute(String sql)
: 可以执行任意的sql(了解)
int executeUpdate(String sql)
: 执行DML(insert\update\delete) 语句、DDL语句
返回值:影响的行数,可以通过它判断DML是否执行成功,返回值>0则执行成功,反之,失败
ResultSet executeQuery(String sql)
: 执行DQL(select)语句
练习:
next():
游标向下移动.一行
getXxx(参数)
:获取数据
int getInt(), String getString()
getString(1)
getDouble("balance")
,推荐使用注意:
使用步骤:
游标向下移动一行
判断是否有数据
获取数据
// 循环判断游标是否是最后一行末尾
while(rs.next()){
// 6.2 获取数据
int id = rs.getInt(1);
String name = rs.getString("name");
double balance = rs.getDouble("balance");
System.out.println(id+"--"+name+"--"+balance);
}
练习:定义一个方法,查询emp表的数据将其封装为对象,然后装进集合,返回
SQL注入问题:在拼接sql时,有一些sql的特殊关键字参与字符串的拼接,会造成安全性问题
a' or 'a' = 'a
解决sql注入问题: 使用PreparedStatement
对象来解决
预编译的SQL:参数使用?
作为占位符
步骤:
select * from user where username = ? and password = ?;
PreparedStatement Connection.prepareStatement(String sql)
?
的位置编号,从1开始?
的值注意:
后期都会使用PreparedStatement来完成增删改查的所有操作
- 可以防止SQL注入
- 效率更高
预编译:preparedStatement对象,会提前(预编译)校验SQL语句是否正确,接下来执行SQL语句时,传递的参数就是?
对应的数据,而不会把传递的参数作为SQL语句的一部分
预编译对象,会对特殊的关键词进行转义,比如or
,把它作为password
的参数;而statement
对象,没有预编译功能,也不会对参数的关键词进行转义,传递的数据是什么,就是什么,如果参数有关键词,会作为SQL语句的一部分
JDBCUtils工具类:
public class JDBCUtils {
private static String url;
private static String user;
private static String password;
private static String driver;
/**
* 文件的读取,只需要读取一次即可拿到这些值,使用静态代码块
*/
static{
// 读取资源文件,获取值
// 1. Properties 结合类
Properties pro = new Properties();
// 2.加载文件 类名.class获取字节码文件对象,再获取对应的classLoader
// getResource是传文件名获取对应的Resource资源,以src为相对的路径,获取URL,绝对路径
// 想要获取对应的字符串路径getPath()
ClassLoader classLoader = JDBCUtils.class.getClassLoader();
InputStream in = classLoader.getResourceAsStream("jdbc.properties");
try {
pro.load(in);
} catch (IOException e) {
e.printStackTrace();
}
// 根据配置名称获取对应的数据
url = pro.getProperty("url");
user = pro.getProperty("user");
password = pro.getProperty("password");
driver = pro.getProperty("driver");
try {
Class.forName(driver);
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
}
/**
* 获取连接
* @return 连接对象
*/
public static Connection getConnection() throws SQLException {
return DriverManager.getConnection(url,user,password);
}
/**
* 释放资源
* @param conn
* @param stmt
*/
public static void close(Statement stmt,Connection conn){
if (stmt!=null){
try {
stmt.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
if (conn!=null){
try {
conn.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
}
/**
* 释放资源
* @param rs
* @param conn
* @param stmt
*/
public static void close(ResultSet rs,Connection conn, Statement stmt){
if (rs!=null){
try {
stmt.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
if (stmt!=null){
try {
stmt.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
if (conn!=null){
try {
stmt.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
}
}
public class JDBCUtils3 {
private static String driver = null;
private static String url = null;
private static String username = null;
private static String password = null;
// 加载资源
static {
ResourceBundle bundle = ResourceBundle.getBundle("jdbc");
driver = bundle.getString("driver");
url = bundle.getString("url");
username = bundle.getString("user");
password = bundle.getString("password");
}
// 1. 连接
public static Connection getConnection(){
Connection conn = null;
try {
Class.forName(driver);
conn = DriverManager.getConnection(url, username, password);
} catch (ClassNotFoundException e) {
e.printStackTrace();
} catch (SQLException e) {
e.printStackTrace();
}
return conn;
}
// 2. close释放资源
public static void close(Connection conn,Statement stmt){
if(stmt!=null){
try {
stmt.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
if(conn!=null){
try {
conn.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
}
}
eclipse
sts spring tu suits
其实就是一个容器(集合),存放数据库连接的容器。当系统初始化好后,容器被创建,容器会申请有一些连接对象,当用户来访问数据库时,从容器中获取连接对象,用户访问完,会将连接对象归还给容器。
步骤:
1. 导入jar包(三个)c3p0-....jar 和mchange-java...jar 还有mysql的驱动jar包
2. 定义配置文件:
3. 名称:c3p0.properties 或者 c3p0-config.xml
4. 路径: 直接将文件放在src目录下即可。
5. 创建核心对象 数据库连接池对象 ComboPooledDataSource
6. 获取连接: getConnection
Spring框架对JDBC的简单封装,提供了一个JDBCTemplate对象简化JDBC的开发
步骤:
1. 导入jar包
2. 创建JDBCTemplate对象,依赖于数据源DataSource
- `JDBCTemplate template = new JDBCTemplate(ds)`
3. 调用JDBCTemplate 的方法来完成CRUD的操作
- update() 执行DML语句,增删改
- queryForMap() 查询结果,将结果集封装为map集合,将列名作为key,将值作为value,将这条记录封装为一个map集合
- 注意:这个方法的查询结果集长度为1
- queryForList() 查询结果,将结果集封装为list集合 再将map集合转载到list集合中
- query() 查询结果,将结果封装为JavaBean对象
- query的参数:RowMapper
- 一般使用BeanPropertyRowMapper实现类,可以完成数据到Javabean的自动封装
- new BeanPropertyRowMapper<类型>(类型.class)
- queryForObject 查询结果,将结果封装为对象
- 一般用于聚合函数的查询
使用java语言开发基于互联网的项目
在用户本地有一个客户端程序,在远程有一个服务器端程序
优点:
缺点:
1. 开发、安装、部署、维护麻烦
只需要一个浏览器,用户通过不同的网址URL,客户访问不同的服务端程序
用户看到的内容(数据)一样,不会发生变化,静态资源会直接被解析
三剑客
HTML
:用于搭建基础网页,展示网页的内容css
: 用于美化页面,布局页面JavaScript
: 控制页面的元素,展示动态的效果每个用户访问相同资源后,获得的结果可能各不相同
使用动态网页技术发布的资源
如jsp/servlet,php,asp
…
如果用户请求的是动态,服务器会执行动态资源,转化为静态资源,再发送给浏览器
是最基础的网页开发语言
Hyper Text Markup Language
超文本标记语言
html, xml
语法:
html文档后缀名.html 或者 .htm
标签分为
标签可以嵌套
需要正确嵌套,不能你中有我,我中有你
在开始标签中可以定义属性。属性是由键值对构成,值需要用引号(单双引都可)引起来
html的标签不区分大小写,建议用小写。
构成html
最基本的标签
html
: html
文档的根标签head
:头标签。用于指定html
文档的一些属性,引入外部的资源title
: 标题标签body
: 体标签
: html5中定义该文档是html文档和文本有关的标签
to
: 标题标签
: 段落标签
break
: 换行标签,插入一个回车
horizontal
: 展示一条水平线
bold
: 字体加粗 italic
: 斜体
下划线
: 字体标签
: 文本居中属性定义:
color
:
red green
…width
width='20'
,数值的单位,默认是px(像素pixel)相对路径
同一级目录:以.
开头的路径 ./
;
上一级目录:../
src
alt alternative
: 替代文本
ol ordered list
li: list item
列表项目 type="A" start="5"
ul unordered list
type="disc/ square/ circle"
定义一个超链接 anchor
锚
属性
href
:指定访问资源的url(统一资源定位符)target
:指定打开资源的方式
_self
默认值,在当前页面打开_blank
在空白页面打开div division
分隔,每个div占满一整行。块级标签h5中为了提高程序的可读性,提供了一些标签
页眉
页脚table
: 定义表格width
: 宽度border
: 边框cellpadding
: 定义内容和单元格的距离cellspacing
: 定义单元格之间的距离,如果0,单元格的线会合为一条bgcolor
:align
: 对齐方式tr: table row
定义行 bgcolor align
td: table data cell
定义表格单元,定义单元格th: table header cell
定义表头单元格
表格标题 表示表格的头部分
表示表格的体部分
表示表格的脚部分
9.特殊字符
显示结果
描述
实体名称
全称
空格
空格
space
<
<
less than
>
>
greater than
&
&
"
"
'
'
¥
元
¥
®
注册商标
®
register
©
版权
©
™
商标
™
x
乘号
×
÷
除号
÷
3. 案例:旅游网首页
-
确定使用table来完成布局
-
如果某一行只有一个单元格,使用
-
如果某一行有多个单元格,使用嵌套 目的:避免合并单元格
<tr>
<td>
<table>table>
td>
tr>
4. 表单
概念:
用于采集用户输入的数据,用于和服务器进行交互。封装数据,提交到后台。
使用的标签:
form
:定义表单,可以定义一个范围,范围代表采集用户数据的范围
input
: 可以通过type属性,改变元素展示的样式
select
: 下拉列表 子元素:option
,指定列表项
textarea
: 文本域
form
属性:
-
action
: 指定提交数据的URL
-
method: 指定提交方式
分类:一共7种,2种比较常用
get
post
表单项的数据要想被提交,必须指定其name
属性,name属性作为后台代码获取用户输入数据的标识。
input
属性:
-
type
属性
-
text
: 文本输入框,默认值
placeholder
: 指定输入框的提示信息,当输入框的内容发生变化,会自动清空提示信息
-
password
: 密码输入框
-
radio
: 单选框
注意:
- 要想实现多个单选框实现单选的效果,多个单选框的
name
属性值必须一致
- 一般会给每一个单选框提供
value
属性,指定其被选中后提交的值
checked
属性,可以指定属性默认值
-
checkbox
: 复选框 后台处理用数组作为value
-
lable
指定输入项的文字描述信息
注意:lable
的for
属性一般会和input
的id
属性值对应,如果对应,点击lable
区域,会让input
输入框获取焦点
-
file
: 文件选择框 文件或者图片的上传
-
hidden
: 隐藏域,用于提交一些信息
-
按钮:
submit
: 提交按钮,可以提交表单
button
: 普通按钮
image
: 图片提交按钮
- `src属性指定图片的路径
<form action="#" method="get">
用户名:<input type="text" name="username" placeholder="请输入用户名"><br>
密码:<input type="password" name="password" placeholder="请输入密码"><br>
性别:<input type="radio" name="gender" value="male" checked> 男
<input type="radio" name="gender" value="female"> 女 <br>
爱好:<input type="checkbox" name="hobby" value="shopping" > 逛街
<input type="checkbox" name="hobby" value="skiing"> 滑雪
<input type="checkbox" name="hobby" value="tennis" checked> 网球 <br>
图片:<input type="file" name="file">
隐藏域:<input type="hidden" name="id" value="aaa"> <br>
取色器: <input type="color" name="color"> <br>
生日: <input type="date" name="birthday"> <br>
生日: <input type="datetime-local" name="birthday"> <br>
邮箱:<input type="email" name="email"> <br>
年龄:<input type="number" name="age"> <br>
省份:<select name="province" >
<option value="">-- 请选择省份--option>
<option value="1">北京option>
<option value="2">上海option>
<option value="3">四川option>
select> <br>
自我描述:<textarea name="desc" cols="30" rows="10">textarea> <br>
<input type="submit" value="登录">
<input type="button" value="一个按钮"> <br>
<input type="image" src="img/regbtn.jpg"> <br>
form>
总结:用到url的地方:
get
和post
的区别:
get:
get
请求参数会在地址栏显示
- 请求参数大小有限制
- 不太安全
post
:
post
请求参数不会在地址栏显示,会封装在请求体中
- 请求参数的大小没有限制
- 较为安全
3. css: 页面美化和布局控制
1. 概念
Cascading Style Sheets
层叠样式表
层叠: 多个样式可以作用在同一个html
的元素上,同时生效
2. 好处
- 功能强大
- 将内容的展示和样式的控制分离,解耦,让分工协作更容易,提高开发效率
3. css的使用
- 内联样式 在标签内使用style属性指定css代码 不常用
- 内部样式 在head标签内,定义style标签,style标签的标签体内容就是css代码
- 外部样式 在head标签内,定义link标签,引入外部的资源文件
hello css
a.css文件:
div{
color: blue;
}
hello css
4. css的语法
格式:
选择器{
属性名1:属性值1;
属性名2:属性值2;
...
}
注意:
每一对属性需要使用;隔开,最后一对属性可以不加。
5. 选择器
选择器:筛选具有相似特征的元素,筛选对应的标签。
分类:
基础选择器
-
id选择器 选择具体的id属性值的元素 语法: #id属性值{} id一般唯一
-
元素选择器 选择具有相同标签名称的元素
语法: 标签名称{}
注意: id选择器优先级高于元素选择器
-
类选择器 选择具有相同的class属性值的元素 class一般可以多个标签共用
语法: .class属性值{}
注意:类选择器选择器优先级高于元素选择器
扩展选择器
-
选择所有元素: 语法:*{}
-
并集选择器: 选择器1,选择器2{}
-
子选择器: 选择器1 选择器2{}
-
父选择器: 选择器1 > 选择器2{}
-
属性选择器: 选择元素名称, 属性名=属性值的元素 元素名称[属性名=“属性值”]{}
-
伪类选择器:选择一些元素具有的状态
语法:元素: 状态{}
状态:
- link: 初始化的状态
- visited: 被访问过的状态
- active: 正在访问状态 点击状态
- hover: 鼠标悬浮状态 悬浮状态
6 . 属性
1. 文本、字体
font-size
: 字体大小
color
: 文本颜色
text-align
: 对齐方式
line-height
:行高
常用的应用文本的css样式:
-
color 设置文字的颜色,如: color:red;
-
font-size 设置文字的大小,如:font-size:12px;
-
font-family 设置文字的字体,如:font-family:‘微软雅黑’;
-
font-style 设置字体是否倾斜,如:font-style:‘normal’; 设置不倾斜,font-style:‘italic’;设置文字倾斜
-
font-weight 设置文字是否加粗,如:font-weight:bold; 设置加粗 font-weight:normal 设置不加粗
-
line-height 设置文字的行高,设置行高相当于在每行文字的上下同时加间距, 如:line-height:24px;
-
font 同时设置文字的几个属性,写的顺序有兼容问题,建议按照如下顺序写: font:是否加粗 字号/行高 字体;如: font:normal 12px/36px ‘微软雅黑’;
-
text-decoration 设置文字的下划线,如:text-decoration:none; 将文字下划线去掉
-
text-indent 设置文字首行缩进,如:text-indent:24px; 设置文字首行缩进24px!
-
text-align 设置文字水平对齐方式,如text-align:center 设置文字水平居中
2. 背景
background 复合属性
3. 边框
border: 复合属性,设置边框
border-top-style: 线的类型,实线solid,虚线dashed,点线dotted
4. 尺寸
- width: 宽度
- height: 高度
5. 盒子模型
-
margin: 外边距 外边距的合并,两个垂直外边距相遇,将形成一个外边距,高度等于外边距较大者。
-
padding:内边距
-
padding:内边距
一般: padding: 20px 100px 100px 20px;
三个值: padding: 20px(顶部) 100px(左右) 20px(底部)
两个值:padding: 20px(上下) 100px(左右)
body自身也是盒子模型。1274*760,margin为8,所以盒子不可能挨着浏览器顶部
水平居中 margin: 20px auto;
外边距合并的解决方案:
- 每个盒子只设置margin-top
- 将元素浮动或者定位
- 使用这种特性
默认情况下内边距会影响整个盒子的大小 box-sizing: border-box;
盒子的真实尺寸:
盒子的宽度: width+左右的padding值+左右的border值
盒子的高度:height+上下的padding值+上下的border值
css元素溢出
当子元素的尺寸超过父元素的尺寸时,需要设置父元素显示溢出的子元素的方式,设置的方法是通过overflow属性来设置。
**overflow的设置项: **
1、visible 默认值。内容不会被修剪,会呈现在元素框之外。
2、hidden 内容会被修剪,并且其余内容是不可见的,此属性还有清除浮动、清除margin-top塌陷的功能。
3、scroll 内容会被修剪,但是浏览器会显示滚动条以便查看其余的内容。
4、auto 如果内容被修剪,则浏览器会显示滚动条以便查看其余的内容。
5、inherit 规定应该从父元素继承 overflow 属性的值。
box-sizing: border-box; 设置盒子的属性,让width和height就是盒子的最终大小
- float:浮动
- left
- right
day09-10 JavaScript
1. 基础
1. 概念
基于对象的一门客户端脚本语言(基于对象,对象已经存在,可以直接使用)
运行在客户端浏览器中,每一个浏览器都有JavaScript的解析引擎
脚本语言:
不需要编译,直接就可以被浏览器解析执行了
2. 功能
可以来增强用户和HTML页面的交互过程,可以来控制HTML元素,让页面有一些动态的效果,增强用户的体验。
3. JavaScript的发展史
- 1992年,Nombase公司,开发出第一门客户端脚本语言,专门用于表单的校验。命名为C–
- 1995年,Netscape(网景)公司,开发出一门客户端脚本语言,LiveScript。后来,请来sun公司的专家,修改LiveScript,命名为JavaScript
- 1996年,微软抄袭JavaScript开发出了JScript语言
- 1997年,ECMA(欧洲计算机制造商协会),制定出客户端脚语言的标准:ECMAScript,统一了所有客户端脚本语言的编码方式
- JavaScript = ECMAScript + JavaScript自己特有的东西(DOM+BOM)
4. ECMAScript
客户端脚本语言的标准
2. 语法
1. 基本语法
1. 与html结合方式
- 内部JS
- 定义
,标签体内容就是js代码
- 外部JS
- 定义
,通过src属性引入外部的js文件
注意:
可以定义在html页面的任何地方,但是定义的位置会影响执行的顺序
可以定义多个
建议:
的位置放在
前面,因为html是从上往下加载
const定义的变量不可以修改,而且必须初始化,该变量受全局作用域、函数作用域及块级作用域的限制。
let定义的变量可以修改,该变量受全局作用域、函数作用域及块级作用域的限制。
var定义的变量可以修改,该变量只受全局作用域和函数作用域的限制,并不受块级作用域的限制
原始数据类型(基本数据类型)
引用数据类型:对象
变量
boolean flag = b instanceof String
b +'---'+ typeof(b)
运算符
一元运算符:只有一个运算数的运算符 ++, --, +(正号)
++,-- 自增自减 加加在前,先加后用
注意:在JS中,如果运算数不是运算符所要求的类型,那么js引擎会自动将运算数进行
类型转换
其他类型转number:
string转number:按照字面值转换,如果字面值不是数字,则转为NaN(不是数字的数字)
boolean转number:true转为1,false转为0
算数运算符: + - * / % …
赋值运算符: = += -=
比较运算符: > < >= <= == ===(全等于)
比较方式
1. 类型相同,直接比较
字符串:按照字典顺序比较,按位逐一比较,直到得出大小为止
2. 类型不同:先进行类型转换,再比较
"==="全等于。在比较之前,先判断类型,如果类型不一样,直接返回false
逻辑运算符: && || !
逻辑运算符 && || !
其他类型转boolean
1. number:0或NaN为假,其他为真
2. string 除了空字符串“”,其他都是true
3. null&undefined 都是false
4. 对象 都是true
三元运算符: ?:
特殊语法
函数(方法)对象
创建方式1 动态函数 不用
var fun = new Function(形参列表,方法体); 调用:get();
创建方式2 匿名函数
var get = function(){...}; 调用 get();
创建方式3 普通函数
function get(){} 调用 get();
特点:
方法定义时,形参的类型不用写。
方法是一个对象,如果定义名称相同的方法,会覆盖
在JS中,方法的调用只与方法的名称有关,和参数列表无关,返回值类型也不用写
在方法声明中有一个隐藏的内置对象(数组),arguments,封装了所有的实际参数
arguments是js的数组对象(已经创建好了,可以直接使用:内置对象)
创建:
var arr=new Array(元素列表)
var arr = new Array(默认长度)
var arr = [元素列表];
方法
join(参数):将数组中的元素按照指定的分隔符拼接为字符串
push() 向数组的末尾添加一个或多个元素,并返回新的长度
属性 length:数组的长度
特点:
创建: var date = new Date();
方法:
toLocalString(): 返回当前date对象对应的时间本地字符串格式
getTime(): 获取毫秒值。返回当前日期对象描述的时间到1970年1月1日零点的毫秒值之差
创建:
方法
属性
PI
正则表达式对象
正则表达式:定义字符串的组成规则,校验数据是否符合制定的规范
[a] [ab] [a-zA-Z0-9_]
\d
单个数字字符[0-9]
\w
单个单词字符[a-zA-Z0-9_]
?
表示出现0次或1次 有无*
通配符,有多少都可+
表示出现1次或多次 正数{m,n}
出现m到n次,m<= 数量 <=n
{,n}
最多n次{m,}
最少m次^ $
正则对象
var reg = new RegExp(正则表达式);
var reg = /正则表达式/;
test(参数)
: 验证指定的字符串是否符合正则定义的规范方法名();
encodeURI():
url编码decodeURI(): url
解码encodeURIComponent(): url
编码decodeURIComponent(): url
解码parseInt():
将字符串转为数字,逐一判断每一个字符是否是数字,直到不是数字为止,将前面数字部分转为numberisNaN()
判断一个值是否是NaN
NaN
六亲不认,连自己都不认。NaN
参与的==比较全部都为false某些组件被执行了某些操作之后,触发了某些代码的执行
onclick
----单击事件<body>
<center>
<h1 color="red">中奖号码:h1>
<table style="font-size: 20px;text-align: center;border: 2px solid green;width:200px;height: 50px;line-height: 50px;">
<tr>
<td id="td1">td>
<td id="td2">td>
<td id="td3">td>
<td id="td4">td>
<td id="td5">td>
tr>
table>
<hr>
<input type="button" value="开始抽奖" onclick="start();" id="st">
<input type="button" value="选中一个" onclick="choose();" id="ed" disabled="true">
<input type="button" value="直接选完" onclick="st();" id="end" disabled="true">
center>
<script>
// 构造抽取一个号码的方法
function chooseQiu() {
// 两个数组构造
var arr1 = [0,1,2,3,4,5,6,7,8,9];
var arr2 = [9,8,7,6,5,4,3,2,1,0];
// 根据数组的随机索引拼接
var index1 = Math.floor(Math.random()*arr1.length);
var index2 = Math.floor(Math.random()*arr2.length);
var randNum = arr1[index1]+""+arr2[index2];
return randNum;
}
// 获取对象
var ed = document.getElementById("ed");
var end = document.getElementById("end");
// 开启筛选
var control;
function start() {
control = 5;
setInterval(startChoose,10);
ed.disabled = false;
end.disabled = false;
}
// 具体的筛选
var index;
function startChoose() {
index=1;
while(index<=control){
var num = chooseQiu();
document.getElementById("td"+(6-index)).innerHTML = num;
index++;
}
}
// 一次一次的筛选
function choose() {
control--;
while(control==0){
ed.disabled = true;
end.disabled = true;
}
}
// 一次性选完
function st() {
control=0;
ed.disabled = true;
end.disabled = true;
}
script>
<script>
var arr = ["a","a","b","b","b","c"];
function quChong() {
var uniArr = [];
for (var i = 0; i < arr.length; i++) {
if(uniArr.indexOf(arr[i])==-1){
uniArr.push(arr[i]);
}
}
}
script>
Browser Object Model
浏览器对象模型 由一系列的对象组成,操作就是浏览器
将浏览器的各个组成部分封装为对象
window
: 窗口对象navigator
: 浏览器对象screen
: 显示器屏幕对象history
历史记录对象location
: 地址栏对象窗口对象
创建
方法
属性
获取其他BOM对象
history
location
navigator
screen
获取DOM对象
document
特点
Document Object Model 文档对象模型 由一系列对象组成,操作就是HTML文档
将标记语言文档的各个组成部分,封装为对象。可以使用这些对象,对标记语言文档进行CRUD的动态操作
W3C DOM标准分为3个不同的部分:
window.document
指的是标签之间的内容,比如 总结:围堵标签才有标签体,而自闭合标签没有标签体。 节点对象,其他5个的父对象 超链接功能: 需求: 保留1功能,去掉2功能 实现:href = “javascript:void(0);” 标签体的设置和获取: innerHTML 使用html元素对象的属性 控制元素样式 使用元素的style属性来设置 提前定义好类选择器的样式,通过元素的className属性设置其class属性 某些组件被执行了某些操作之后,触发某些代码的执行 一个前端开发的框架,对html,css,javascript进行了高度的封装。依赖于jquery 同一套页面可以兼容不同分辨率的设备 依赖于栅格系统,默认把每一个页面的一行分成12个格子,(只不过不同的分辨率格子大小显示不一样)可以指定元素占几个格子 定义容器。相当于之前的table 容器分类: 定义行 相当于之前的tr 样式:row 定义元素 指定该元素在不同的设备上,所占的格子数目。 样式:col-设备代号-格子数目 按钮 class=“btn btn-default” 图片 class=“img-responsive” 图片在任意尺寸都占100% 图片形状 表格 表单 组件 Extensible Markup Language 可扩展标记语言 可扩展:标签都是自定义的。 存储数据 W3C:万维网联盟 规定xml文档的书写规则,有哪些标签和属性 作为框架的使用者(程序员): 分类: 引入DTD文档到xml文档中 操作xml文档,将文档中的数据读取到内存中 步骤: xpath为xml的路径语言,是一种用来确定XML(标准通用标记语言的子集)文档中某部分位置的语言 需要导包,查询w3c参考手册就没有标签体,不能用
innerHTML
,
Element对象
innerHTML
属性修改标签体内容
Node:
CRUD DOM
树
appendChild()
向节点的子节点列表的结尾添加新的子节点removeChild()
删除(并返回)当前节点的指定子节点replaceChild()
用新的节点替换一个子节点
parentNode
: 返回节点的父节点
7. HTML DOM
div1.style.border = "1px solid red";
div1.style.width = "200px";
div1.style.fontSize = "20px";
div2.className = "d1";
8. 事件
概念:
点击事件:
焦点事件
加载事件
鼠标事件
键盘事件
选择和改变
表单事件
day11 BootStrap
1. 概念
2. 好处
3. 快速入门
DOCTYPE html>
<html lang="zh-CN">
<head>
<meta charset="utf-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1">
<title>Bootstrap 101 Templatetitle>
<link href="css/bootstrap.min.css" rel="stylesheet">
head>
<body>
<h1>你好,世界!h1>
<script src="js/jquery-3.2.1.min.js">script>
<script src="js/bootstrap.min.js">script>
body>
html>
4. 响应式布局
1. 实现:
2. 步骤:
1. container 固定宽度,两边有留白
2. container-fluid 流式布局,每一种设备都是100%宽度
3. 注意:
5. css样式和js插件
全局css样式
<img src="..." alt="..." class="img-rounded"> 方形
<img src="..." alt="..." class="img-circle"> 圆形
<img src="..." alt="..." class="img-thumbnail"> 相框 缩略图
day12 XML
1. 概念
2. 功能
3. xml与html的区别
4. 语法
1. 基本语法
.xml
2. 组成部分
version
版本号,必须的属性encoding
编码方式 告知解析引擎当前文档使用的字符集,默认ISO8859-1 encoding=‘utf-8’standalone
是否独立
3. 约束
4. DTD&schema
<!DOCTYPE 根标签名 SYSTEM "DTD文件的位置">
例如
<students xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.itcast.cn/xmml student.xsd
http://www.itcast.cn/xmml2 student2.xsd"
xmlns:a="http://www.itcast.cn/xml"
xmlns:b="http://www.itcast.cn/xml2"
>
<student number="heima_0001">
<a:name>zhangsana:name>
<age>11age>
<sex>malesex>
student>
students>
5. 解析
操作xml文档
解析xml的方式
xml的常见解析器
6. Jsoup
快速入门
// 获取document对象
// 1.1 获取student.xml的path
String path = JsoupDemo01.class.getClassLoader().getResource("student.xml").getPath();
// 1.2 解析xml文档,加载进内存
Document document = Jsoup.parse(new File(path), "utf-8");
Elements elements = document.getElementsByTag("name");
System.out.println(elements.size());
// 2 获取第一个name的element对象
Element element = elements.get(0);
// 3. 获取数据
String text = element.text();
System.out.println(text);
对象的使用
7. selector
Selector选择器概述
tagname
: 通过标签查找元素,比如:a
ns|tag
: 通过标签在命名空间查找元素,比如:可以用 fb|name
语法来查找
元素#id
: 通过ID查找元素,比如:#logo
.class
: 通过class名称查找元素,比如:.masthead
[attribute]
: 利用属性查找元素,比如:[href]
[^attr]
: 利用属性名前缀来查找元素,比如:可以用[^data-]
来查找带有HTML5 Dataset属性的元素[attr=value]
: 利用属性值来查找元素,比如:[width=500]
[attr^=value]
, [attr$=value]
, [attr*=value]
: 利用匹配属性值开头、结尾或包含属性值来查找元素,比如:[href*=/path/]
[attr~=regex]
: 利用属性值匹配正则表达式来查找元素,比如: img[src~=(?i)\.(png|jpe?g)]
*
: 这个符号将匹配所有元素Selector选择器组合使用
el#id
: 元素+ID,比如: div#logo
el.class
: 元素+class,比如: div.masthead
el[attr]
: 元素+class,比如: a[href]
a[href].highlight
ancestor child
: 查找某个元素下子元素,比如:可以用.body p
查找在"body"元素下的所有 p
元素parent > child
: 查找某个父元素下的直接子元素,比如:可以用div.content > p
查找 p
元素,也可以用body > *
查找body标签下所有直接子元素siblingA + siblingB
: 查找在A元素之前第一个同级元素B,比如:div.head + div
siblingA ~ siblingX
: 查找A元素之前的同级X元素,比如:h1 ~ p
el, el, el
:多个选择器组合,查找匹配任一选择器的唯一元素,例如:div.masthead, div.logo
伪选择器selectors
:lt(n)
: 查找哪些元素的同级索引值(它的位置在DOM树中是相对于它的父节点)小于n,比如:td:lt(3)
表示小于三列的元素:gt(n)
:查找哪些元素的同级索引值大于n``,比如
: div p:gt(2)
表示哪些div中有包含2个以上的p元素:eq(n)
: 查找哪些元素的同级索引值与n
相等,比如:form input:eq(1)
表示包含一个input标签的Form元素:has(seletor)
: 查找匹配选择器包含元素的元素,比如:div:has(p)
表示哪些div包含了p元素:not(selector)
: 查找与选择器不匹配的元素,比如: div:not(.logo)
表示不包含 class=logo 元素的所有 div 列表:contains(text)
: 查找包含给定文本的元素,搜索不区分大不写,比如: p:contains(jsoup)
:containsOwn(text)
: 查找直接包含给定文本的元素:matches(regex)
: 查找哪些元素的文本匹配指定的正则表达式,比如:div:matches((?i)login)
:matchesOwn(regex)
: 查找自身包含文本匹配指定正则表达式的元素8. xpath
你可能感兴趣的:(java提高,elasticsearch,kafka,打新债)