Javac 编译命令
Javap 反编译命令
Javadoc 生产api命令
面对对象的三大特征:封装 继承 多态
public interface 接口名称{
//接口内容
//抽象方法
[public abstract] 返回值类型 方法名(参数列表);
}
接口中可以包括:
注意事项:接口中默认修饰符(public abstract)这两个修饰符可以省略
使用步骤:
1.接口不能直接使用,必须有一个“实现类”来“实现”接口
@Override
public class 实现类名称 implements 接口名称,接口名称{
//重写覆盖接口中的所有抽象方法
//可以实现多个接口
//重复的只需要重写覆盖一次
}
2.接口的实现类必须覆盖重写所有的抽象方法
3.创建实现类的对象开始使用。
注意:如果实现类没有覆盖重写所有的抽象方法,那么这个实现类必须是抽象类。
Java8以后还包括
public default 返回值类型 方法名称 (参数列表){
//方法体
}
a)静态方法通过接口名称调用 接口名称.静态方法名
public static 返回值类型 方法名称(参数列表){
//方法体
}
Java9 还可以包括有
private 返回值类型 方法名称(参数列表){
方法体
}
private static 返回值类型 方法名称(参数列表){ 方法体}
父类引用指向子类对象
父类名称 对象名 = new 子类名();
接口名称 对象名 = new 实现类名称();
or ((子类名称)父类对象名).子类方法
对象 instanceof 类名称 //判断对象是不是这个类的 返回boolean值
修饰 :
public final class 类名称{……}
基本类型:数据不能更改值 只有唯一一次赋值
引用类型:内容可变地址值不变
final 数据类型 变量名 = 值;
注意:final 与 abstract 不能同时使用
修饰符 class 外部类名称{
修饰符 class 内部类名称{……}
……
}
注意:内用外,随意访问;外用内,需要内部类对象
使用方法:
外部类名称.内部类名称 对象名 = new 外部类名称(). new 内部类名称();
内部类调用外部类成员变量 :外部类名. this . 变量名
匿名内部类 只需要使用唯一的一次
接口名 对象名 = new 接口名(){
//覆盖重写所有的方法
};
根类,所有类的父类(Java.lang.object).
基本数据类型 :比较值
引用数据类型 :比较地址
System.currentTimeMillis()
获取当前系统从1970年1月1日0:0:0至今经历了多少毫秒(getTime())
格式化日期类按照指定的格式格式化 解析
创建对象构造方法中传入指定的格式
调用format(Date)方法按格式转化日期类为字符串
SimpleDateFormat s = new SimpleDateFormat("yyyy年MM月dd日 HH时mm分ss");
用parse(String)方法把文本解析为指定格式的Date日期
String c = "1998-10-2";
try {
Date a = s.parse(c);
} catch (ParseException e) {
e.printStackTrace();
}
get方法:
Calendar c = Calendar.getInstance();
Date d = c.getTime();//获得日期
int year = c.get(Calendar.YEAR);//获取年 MONTH获取月(西方的月1-11)要加一
DATE 天(DAY_OF_MONTH)
set方法
c.set(Calendar.YEAR,999);//设置年
c.set(888,8,8);//公式设置年月日
c.add(Calendar.YEAR,2);//把年增加2
long time = System.currentTimeMillis();//获取一个毫秒值
arraycopy(Object src(原数组), int srcPos(起始索引), Object dest(目标数组), int destPos(目标数组的起始位置), int length(复制的个数))
将指定源数组中的数组从指定位置复制到目标数组的指定位置。
字符串缓冲区,可以提高字符串的操作效率.(可以看成是一个可以变化的数组)
底层是数组,但是没有被final修饰,
StringBuilder在内存中始终是一个数组,占用空间少效率高,会自动扩容
构造方法:
StringBuilder b = new StringBuilder();//构造创建空字符串,初始容量15字符
StringBuilder b1 = new StringBuilder("dasdas");//带字符串的构造
append //添加任意类型的数据
b.append("a").append(1).append(1).append(1);//链式编程
toString()把StringBuilder返回一个字符串
add(E e);添加元素
clear();清空集合中的元素
remove(E e);把给定的对象在当前集合中删除
contains(E e);判断集合中是否包含给定的对象
isEmply();判断当前集合是否为空
size();返回集合中元素的个数
toArray();把集合中的数据存储到数组中
1.有序的集合
2.允许存储重复的元素
3.有索引可以使用普通的for循环遍历
ArrayList集合
LinkedList集合
addFirst()在开头插入一个元素(getFirst,removeLast)
addLast()在末尾插入(setLast、removeLast)
Vector集合(了解)
HashSet集合( LinkedHashSet集合)
无序的集合,存储顺序和取出元素的顺序有可能不一致
底层是一个hash表结果查询的速度非常快
hash表 :数组 + 链表/红黑树
LinkedHashSet集合
底层是哈希表(数组+链表/红黑树) + 链表:多了一条链表,保证元素有序
TreeSet集合
addall 在一个集合中添加多个元素Collections.addAll(li(集合名字),"a","b","c");
shufflc 打乱顺序Collections.shuffle(li);
sort 默认规则排序Collections.sort(li);
对集合进行遍历
Boolean hasNext()如果仍有元素可以迭代则返回ture
next() 返回迭代的下一个元素(取出)25
Iterator接口也是有泛型的,跟着集合走,
Collection
Iterator
while(it.hasNext()){
String s = it.next();
System.out.println(s);
}
for(Iterator
String s = it.next();
System.out.println(s);}
双列集合,由键和值组成,键是唯一的不可重复作为K的元素,对象必须重写code和equals方法
put(key,value) 添加元素 键重复 会覆盖前面的
remove(key) 通过键删除元素
get(key) 获得该键的值
底层哈希表,查询速度特别快 无序的
有序的
for(数组/集合的数据类型 变量名:数组/集合名){
System.out.println(i);}
它自己具有写数据到文件的方法
没有泛型的默认是String,String
有map的所有方法
特有方法
栈: 先进后出
队列: 先进先出
数组: 查询快增删慢
链表: 查询慢增删快
单项链表:只有一条链子不能保证元素的顺序(存储和取出的顺序可能不一样)
双向链表:两条链有一条专门记录元素的顺序有序列表
二分法查找O(logn) 所需执行指令数: a*logn
寻找数组中的最大/最小值O(n) 所需执行指令数: a*logn
归并排序算法O(nlogn) 所需执行指令数:c*nlogn
选择排序 O(n^2) 所需执行指令数:d*n^2
当方法参数的类型已经确定,但是参数的个数不确定,就可以使用可变参数
使用:
修饰符 返回值类型 方法名(数据类型 变量名){}
底层是一个数组 ,根据传递参数的个数不同,会创建不同长度的数组,来储存这些参数
传递的参数个数可以0-n个
注意:1.一个方法的列表只能有一个可变参数
2.如果方法的参数有多个,可变参数必须写在参数末尾
终极写法:public static void method(Object ... obj){}
标准格式:
(参数列表) - > { 一些重写方法的代码 }
( ) 接口中抽象方法发的参数列表 没有参数就空着,有参数就写出参数,多个参数用都好分割
-> 传递的意思 把参数传递给方法体
{} 重写接口的抽象方法的方法体
特点 : 可推导可省略,凡是根据上下文推导出来的内容,都可以省略
可省略的内容:
1.(参数列表 ) 括号中参数列表的数据类型可以省略不写
2.(参数列表) 括号中的参数如果只有一个,那么类型和()都可以不写
3.{一些代码} 如果()中的代码只有一行,无论是否有返回值,都可以省略({} ,return ,分号)
要省略 ({},return,分号)要一起省略
测试分类:
Junit使用: 白盒
1.定义一个测试类 测试类名:被测试的类后加Test 包名: xxx.xxx.xx.test cn.tian.test
2.定义测试方法 : 可以独立运行 方法名: text测试的方法名 textadd() 返回值 void 参数列表建议空参
3.给方法加注解 @tests
判定结果:绿色为成功 红色为失败 一般为们会用断言的操作来处理结果 Assertions.assertEquals(期望的结果 , 运算的结果)
init()方法 初始化方法 : 用于资源的申请,所有的测试方法在执行钱都会先执行该方法
@BeforeAll public void init(){
}
close()方法 释放资源方法 : 所有测试方法执行完后都会自动执行该方法
@AfterAll public void close(){ }
进程 : 正在运行的程序叫进程
线程 : 是进程中的一个小任务
分时调度: 所有线程轮流使用cpu的使用权 平均分配
抢占式调度:优先让优先级高的线程使用
框架 : 半成品软件,可以在框架的基础上进行软件开发,简化编码
概念 : 将类的个个组成部分,封装为其他对象,这就是反射机制
好处: 1.可以在程序运行过程中,操作这些对象
2.可以解耦,提高程序的可扩展性
获取成员变量方法
//1.获取person对象的Class对象 Class peClass = Person.class;
Field[] getFields() 获取所有public修饰的成员变量 get/set
Field getField(""); 需要传入值 获取指定的成员变量 get/set
Field[] de = peClass.getDeclaredFields();获取所有的成员变量,不考虑修饰符
Field name = peClass.getDeclaredField("name");获取指定的成员变量,不考虑修饰符
name.setAccessible(true);忽略访问修饰符的安全检查,暴力反射
获取构造方法的对象
//获取person的构造方法 Constructor constructor = peClass.getConstructor(String.class, int.class);
constructor.setAccessible(true);//暴力反射
//创建构造法的对象 Object person = constructor.newInstance("张", 10);
//空参 Constructor constructor = peClass.getConstructor(); Object zhn = constructor.newInstance();
//空参简化 Object o = peClass.newInstance();
获取成方法
//获取成员方法对象 Method eat = peClass.getMethod("eat");
eat.setAccessible(true);
//执行方法 eat.invoke(eat);//需要传入方法的名字和参数列表
//获得所有public修饰的方法 Method[] methods = peClass.getMethods();
//获取方法名 String name = eat.getName();
获取类名
String className = peClass.getName();
概念:说明程序的,给计算机看的
定义:注解(Annotation),也叫元数据。一种代码级别的说明,他是jdk1.5以后版本引入的一个新特性,与类、接口、枚举是在同一个层次,他可以声明在包、类、字段、方法、局部变量、方法参数等的前面,用来对这些元素进行说明,注释。
作用分类:
①编写文档:通过代码里标识的注解生成文档(生成文档doc文档)
②代码分析:通过代码里标识的注解对代码进行分析【使用反射】
③编译检查:通过代码里标识的注解让编译器能够实现基本的编译检查【Override】
JDK中预定义的一些注解
@Override 检测被该注解标注的方法是否是继承父类的
@Deprecated 该注解标注的内容已过时
@SuppressWarnings 压制警告 参数为all @SuppressWarnings("all")一般用在类上,所有的警告都不在出现
自定义注解
①格式
元注解
Public @interfa 名字{}
②本质:注解本质上是一个接口,该接口默认继承Annotation接口
Public interface 注解名 extends Java.lang.annotation{}
③属性:接口中可以定义的成员方法,就是接口中定义的抽象方法
④元注解:用于描述注解的注解
在程序使用(解析)注解:获取注释中定义的属性值
注解设置配置文件
Java Databases Connectivity Java 数据库链接,java语言操作数据库
官方定义的一套操作所有关系型数据库的规则,即接口,个个数据库厂商去实现这个接口,提供数据库的驱动jar包
使用 :
PreparStatement :执行sql的对象 解决sql注入问题 预编译的SQL 参数使用?作为占位符
public class Demo {
public static void main(String[] args) throws ClassNotFoundException {
Connection conn = null;
String sql;
// MySQL的JDBC URL编写方式:jdbc:mysql://主机名称:连接端口/数据库的名称?参数=值
// 避免中文乱码要指定useUnicode和characterEncoding
String url = "jdbc:mysql://127.0.0.1:3306/text?useUnicode=true&characterEncoding=UTF8&serverTimezone=UTC&"
+ "user=root&password=kanglimin";
try {
Class.forName("com.mysql.cj.jdbc.Driver");// 动态加载mysql驱动
System.out.println("成功加载MySQL驱动程序");
// 一个Connection代表一个数据库连接
conn = DriverManager.getConnection(url);
// Statement里面带有很多方法,比如executeUpdate可以实现插入,更新和删除等
Statement stmt = conn.createStatement();
sql = "create table student(NO char(20),name varchar(20),primary key(NO))";
// executeUpdate语句会返回一个受影响的行数,如果返回-1就没有成功
int result = stmt.executeUpdate(sql);
if (result != -1) {
System.out.println("创建数据表成功");
sql = "insert into student(NO,name) values('2016001','刘大')";
result = stmt.executeUpdate(sql);
sql = "insert into student(NO,name) values('2016002','陈二')";
result = stmt.executeUpdate(sql);
sql = "select * from student";
ResultSet rs = stmt.executeQuery(sql);// executeQuery会返回结果的集合,否则返回空值
System.out.println("学号\t姓名");
while (rs.next()) {
System.out.println(rs.getString(1)+ "\t" + rs.getString(2));
// 入如果返回的是int类型可以用getInt()
}
}
} catch(SQLException e) {
System.out.println("MySQL操作错误");
e.printStackTrace();
} catch (Exception e) {
e.printStackTrace();
} finally {
try {
conn.close();
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}
就是一个容器,(集合),存放数据库链接的容器
当系统初始化后,容器被创建,,容器中会申请一些链接对象,当用户访问数据库时,从容器中获取链接对象,用户访问玩之后,会将连接对象归还给容器.
节约资源,用户访问高效\
实现:
spring框架对JDBC的简单封装,提供了一个JDBCTemplate对象简化JDBC的开发
java语言在企业级开发中使用的技术规范的总和,一共规定了13项大的规范
java动态项目的目录结构:
--项目根目录
--WEB-INF
--web.xml web项目的核心配置文件
--classes目录 放置字节码文件的目录
--lib目录 放置依赖jar包的
纵向重复代码,横向抽取
概念:Extensible Markup Language 可拓展标记语言
可扩展:标签都是自定义的,
功能:存储数据(配置文件) 在网络中传输
与html: 都是W3C(万维网联盟) xml语法非常严格
语法:
基本语法
快速入门:
组成部分:
version : 版本号 必须的属性
ebcoding : 编码方式,告知解析引擎当前文档使用的编码方式 默认iso-8859-1
standalone : 是否独立 yes (不依赖其他文件) no(依赖其他文件)(了解)
CDATA区:
约束文档 :规定xml文档的书写规则
约束文档:
引入:
内部dtd : 将约束规则定义在xml文档中
约束内容
]>
内部dtd : 将约束规则定义在外部dtd文件中
本地 :
网络
解析:操作xml文档,将文档中的数据读取到内存中
操作xml文档
解析xml的方式:
xml常见的解析器
parse解析html或xml文档,返回Document
parse(File in,String charsetName) : 解析xml或html文件的
parse(string html) : 解析xml或html字符串
parse(URL url , int timemeoutMillis) : 通过网络路径获取指定的html或xml的文档对象
获取Element对象
getElementsById(String id ) : 根据ID属性值获取唯一的element对象
getElementsByTag(string tagName) : 根据标签名获取元素对象集合
getElementsByAttribute(String Key) : 根据属性名称获取元素对象集合
getElementsByAttributevalue(string key,string value)根据对应得属性名和属性值获取元素对象集合
Selector:选择器 Elements select(String cssQuery)
XPath: 查询xml的语法路径语言 需要额外导入jar包
服务器:安装了服务器软件的计算机
web服务器软件: 接受用户的请求 ,处理请求,做出响应 在web服务软件中,可以部署web项目,让用户通过浏览器来访问这
些项目
与Java相关的服务器软件:
WebLogic: oracle公司,大型的javaEE服务器,支持所有的javaEE规范,收费的
WebSphere: IBM公司,大型的javaEE服务器,支持所有的javaEE规范,收费的
JBoss: JBoss公司,大型的javaEE服务器, 支持所有的javaEE规范,收费的
Tomcat: Apache基金组织,中小型的javaEE服务器,仅仅支持少量的javaEE规范,开源的,免费的
Tomcat:web服务器软件
部署项目的方式:
简化部署:将项目打包为一个war包放到webapps下,war包会自动解压缩
概念:运行在服务端的小程序,servlet就是一个接口,定义了java类被浏览器访问到(被Tomcat识别的规则)的规则
将来我们复写一个类实现servlet接口,就可以被浏览器(Tomcat)访问到
体系结构
两个实现类servlet -à GenericServlet(抽象类) ---à HttpServlet(抽象类)
GenericServlet将servlet中的方法做了空实现,只将Service()方法作为抽象方法
HttpServlet:对http协议的一种封装
复写doGet/doPost方法
1.创建一个继承Servlet的类,实现方法
public class ServletDemo1 implements Servlet{
/* *
*执行时机:当Servlet的对象销毁时被调用,做一些收尾,清理的工作
*
*/
@Override
public void destroy() {
System.out.println("Servlet销毁了");
}
/**
* 获得当前ServletConfig的配置对象
*/
@Override
public ServletConfig getServletConfig() {
// TODO Auto-generated method stub
return null;
}
/**
* 获得当前Servlet的属性信息 , 返回一些作者,(了解)
*/
@Override
public String getServletInfo() {
// TODO Auto-generated method stub
return null;
}
/*执行时机,当servlet创建的时候被调用,做初始化工作(初始化方法)
*ServletConfig:Serlet :Servlet的配置对象,初始化的时候可以进行配置
*/
@Override
public void init(ServletConfig arg0) throws ServletException {
System.out.println("Servlet被创建了(init方法)");
}
/*
*当一个请求,请求当前Servlet的时候被调用
*处理当前Servlet的业务逻辑并把相应的 返回给浏览器
*ServletRequest请求对象
*ServletResponse响应对象
*/
@Override
public void service(ServletRequest request, ServletResponse response) throws ServletException, IOException {
response.getOutputStream().write("hello Servlet".getBytes());
}
}
2.配置
<servlet> <servlet-name>demoservlet-name> <servlet-class>cn.tian.servlet.ServletDemo1servlet-class> servlet> <servlet-mapping> <servlet-name>demoservlet-name> <url-pattern>/demourl-pattern> servlet-mapping>
注解配置
@WebServlet(urlPatterns = "/demo") public class ServletDemo2 implements Servlet {
简写: @WebServlet("/demo")
执行原理
生命周期
servlet的init方法只执行一次说明servlet在内存中只存在一个对象,servlet是单例的
多个用户同时访问时,容易出现线程安全问题;尽量不要在servlet中定义成员变量
即使定义的成员变量,也不要对其赋值修改值
什么时候被创建?
1.默认情况下第一次访问,servlet被创建,
2.在服务器启动时创建,方法
servlet被销毁 前 执行,服务器被关闭时,servlet被销毁
只有服务器正常关闭时才会被执行
一般用于释放资源
报错版本不对应
Tomcat、jdk、web.xml 对应关系:
版本对应错误,更换便可。(版本往下兼容)
web.xml——version2.2——JDK1.1——Tomcat3.3
web.xml——version2.3——JDK1.3——Tomcat4.1
web.xml——version2.4——JDK1.4——Tomcat5.5
web.xml——version2.5——JDK5.0——Tomcat6.0
web.xml——version3.0——JDK6.0——Tomcat7.0
web.xml——versio3n3.1——JDK7.0——Tomcat8.0,Tomcat8.5
web.xml——version4.0——JDK8.0——Tomcat9.0
定义类继承HttpServlet
获取请求消息数据
GET /day/demo?name = zhang HTTP/1.1
getRequestURL() http://localhost/day/demo
获取客户机的ip地址: getRemoteAddr()
获取协议及版本 : getProtocol()
功能:设置响应消息
简单的重定向方法
response.sendRedirect("/response1");
5)forword 和 redirect 的区别
Hyper Text Transfer Protocol 超文本传输协议
请求消息:客户端发送给服务端的数据
响应消息:服务端发送给客户端的消息
传输协议:定义了客户端,服务器端发送数据的格式
特点:1.基于TCP/IP的高级协议
2.默认端口号80
3.基于请求/响应模型的:一次请求对应一次响应
4.无状态的,每次请求时间相互独立,不能相互交互数据
版本:
1.0:每一次请求响应都会建立新的链接
1.1:复用链接
请求消息数据格式
请求方式: 请求url 请求的版本/协议
GET Host: localhost:8080 HTTP/1.1
请求方式:HTTP协议有七种请求方式
GET:请求参数在url后 , 请求长度有限制(不太安全)
post:请求参数在请求体中,请求长度没有限制(相对安全)
请求头名称:请求头值
User-Agent: Mozilla/5.0 (Windows NT 10.0; WOW64; rv:66.0) Gecko/20100101 Firefox/66.0浏览器告诉服务器,浏览器的版本信息
解决兼容性问题
Referer: 告诉服务器我(当前请求)从哪里来 1.防盗链2.统计工作
空行 用于分割post请求头和请求体的
封装post请求消息的请求体的
Host: localhost:8080
User-Agent: Mozilla/5.0 (Windows NT 10.0; WOW64; rv:66.0) Gecko/20100101 Firefox/66.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Language: zh-CN,zh;q=0.8,zh-TW;q=0.7,zh-HK;q=0.5,en-US;q=0.3,en;q=0.2
Accept-Encoding: gzip, deflate
Upgrade-Insecure-Requests: 1
响应消息数据格式
提高开发效率
在项目的运行编译打包过程都需要依赖于ant构建工具
基于Ant的,Ant有的功能Maven都有,额外添加了其他功能
他不是java独有,所有B/S架构的项目都在使用它!
M - - model 模型(自己写代码)
V - - view 视图(jsp)
C - - Cotroller 控制器(servlet)
在dao层操作数据库数据的(可以以面向对象的方式来完成,不需要书写SQL语句)
在dao层操作数据库数据的技术
QueryRunner qr = new QueryRnner(连接池);
ORM框架 : 对象关系映射框架,将对象和表建立映射关系,,想操作对象就相当于操作数据库的表了
hibernate环境搭建
持久化类的编写和一级缓存
hibernate的关联关系( 一对多|多对多的关系)
hibernat的jpa
主配置
然后第一个是本地路径(文件是复制过来的,不能直接复制),第二个是struts-2.3.dtd里面的路径
然后把这个也放入到xml
struts2默认常量配置位置:
修改默认常量配置:方式先后也是加载顺序,后加载的会覆盖先加载的
常量配置
struts.i18n.encoding=UTF-8 i18n : 国际化 解决post提交乱码
struts.action.extension=action,, 指定反问action时的后缀名struts.action.extension=”do”访问时后缀名.do
struts.devMode = false 指定struts2是否以开发模式运行
ssh : hibernate + struts2 + spring
ssm : mybatis + springMVC + spring7
spring是分层的ee的full-stack(一站式)开源框架
ee分了三层: web层 service层 dao层(spring对ee 的每一层都提供了解决的技术)
web层 : struts2 springmvc
service层 : spring
dao层 : hibernate spring jdbcTemplate (dbutils)
IOC思想 : 工厂+反射+ 配置文件 解耦合 控制反转