一、安装开发环境
- JDK:Java SE 11;
- 可选:设置环境变量JAVA_HOME,指明JDK的安装路径;可选:设置环境变量JAVA_HOME,指明JDK的安装路径;
- 可选:设置环境变量PATH,将 $JAVA_HOME/bin 放在PATH中,这样可以在任何地方使用java、javac等命令;可选:设置环境变量PATH,将 $JAVA_HOME/bin 放在PATH中,这样可以在任何地方使用java、javac等命令;
- IDE:IDEA;请下载安装旗舰版,不要安装社区版,社区版不支持Web开发;
- 创建项目:使用Maven作为项目管理工具;
二、Java语言
- main方法是程序的入口,就像一个大门;
- 方法四要素:名字、参数、返回类型、方法体,方法名要小写开头;
- 类以class关键字定义,类名要大写开头;
- 关键字:语言本身使用的那些单词或缩写,比如class,不能把变量的名字叫做class。
- 标志符:类名、变量名、方法名等编程者定义的名字;
- static 的作用:它修饰的字段属于类型,非static的字段属于实例(对象);
- 构造方法:创建类的实例时调用的方法,它的语法特点是:1)没有返回值;2)名字与类名相同;
- final的作用:1)修饰变量,变量的值不能变(成为常量了);2)修饰类时,类不能被继承(做了结扎);3)修饰方法时,方法不能被Override;4) 改变局部变量的生命期,相当于C语言里面的static;
- 抽像类不能实例化,就是不能new一个对象;非抽像类我们叫做具体类;
- 位运算口诀:&(And)-》遇0是0,|(与)-》遇1是1,^(异或)-》相同为0,不同为1,~(取反)-》1变0,0变1;
- 装箱(inbox)与拆箱(outbox),基本类型转换成对应的类叫装箱,比如int-》Integer;基本类型对应的类转成基本类型叫拆箱,比如Double-》double;
- String 与StringBuild和StringBuffer的区别是什么?String是只读的!!StringBuilder和StringBuffer不是只读的。
- StringBuilder与StringBuffer的区别?StringBuffer是多线程安全的,而StringBuilder不是,StringBuilder执行速度比StringBuffer快。
- 数组的类型指的是数组中每个元素的类型!
- 数组并没有对应的装箱的类,有一个类Arrays,它只是一个工具类,专门用于帮我们操作数组;
三、Maven
- maven是一个Java工程管理工具;
- maven的最大特点是可以自动解决对jar包的依赖;
- maven的核心是一个叫做pom.xml的文件,它就是整个工程的配置文件;
- maven工程是很容易移植的,很容被多种开发工具支持;
- maven工程的组织:思想是约定大于配置,各文件夹名字固定,功能固定,你需要记忆;
src-项目的所有文件都位于src中;
src/test-放的是单元测试代码;
src/main-放的是真正有用的代码;
src/main/java-放的是Java源码;
src/main/resources-放的是除java源码之外的文件,都叫资源文件,比如图片等; - Maven工程要运行,需要配置运行方式,应用程序类型的工程,只需要指明主类即可。(主类是包含main方法的类);
四、小例子:计算器
//封装及算器功能的类
public class Calculator {
Scanner scanner = new Scanner(System.in);
//实现主要业务的地方
public void run() {
while (true) {
System.out.println("输入一个数吧:");
//调用方法等待用户输入
String num1 = scanner.nextLine();
System.out.println("再输入一个数吧:");
String num2 = scanner.nextLine();
System.out.println("再输入运算符(加:+,减:-,乘:x,除:/):");
String opt = scanner.nextLine();
//把字符串转换为数字
int n1 = Integer.valueOf(num1);
int n2 = Integer.valueOf(num2);
int result = 0;
if (opt.equals("+")) {
result = n1 + n2;
} else if (opt.equals("-")) {
result = n1 - n2;
} else if (opt.equals("x")) {
result = n1 * n2;
} else if (opt.equals("/")) {
result = n1 / n2;
} else {
//什么都不是
System.out.println("你输入的什么玩意?我不算了!");
return;
}
System.out.println("计算结果是:" + result);
//给用户一个机会,选择退出或继续
System.out.println("你想退出吗?输入\"y\"退出,否则继续。请仔细考虑一小时:");
String isExit = scanner.nextLine();
if(isExit.equals("y")){
System.out.println("Bye-bye");
break;
}
}
}
}
五、Java新特性
Lamda
- 它的出现是为了 代码简捷,就是让我们少写代码。它代替了匿名类。
- Lamda相当于在函数内又定义函数,带来一个问题:能不能在Lamda内访问所在函数的局部变量?能!但是,只能读,不能修改。而且凡是被Lamda访问的外部局部变量实际都成为final型。
函数式接口(也叫方法接口)
- 专门用于引用方法或Lamda;
- 它的特点是:接口中只定义一个方法;
- 它出现的目的也是为了让我们少写代码;
- JDK中内置了很多对应不同方法签名的接口,如果你的方法或Lamda参数不多,可以先去里面找找有没有合适的,就省下自己定义接口了。
方法引用
- Java中可以引用方法了,语法与C++一样:类名::方法名;
- 但是,比C++更进一步的是,还可以用 实例::方法名 的方式,这种方式使得方法中的的this指向实例;
流式调用
- 注意它里面隐函的条件:1)数据必须是集合;2)每个处理方法都是对单条数据进行处理,除了聚合方法。
- 对数据的操作不是随意的,只能是过滤、映射、去重、分组、排序这几种操作,最后是聚合。
- 过滤的代码返回boolean型;
- 映射代码是一对一处理,返回一个元素;
六 Java Web开发
- Java Web开发用到的技术有JSP和Servlet,可以单独使用某一种也可以联合使用这两个。
- JAVA WEB程序是服务端程序,它负责产生HTML文本,把文本发给浏览器之后,浏览器分析它,把网页显示出来。
- 开发环境:1)HTTP容器,比如Tomcat,Jetty;2)数据库,比如MySQL。推荐安装Xampp。
- 开发阶段,推荐使用Jetty作Servlet容器。只需要在Maven配置文件中添加Jetty的Plugin即可。
- 要使用Servlet,必须先创建Servlet类,要求从Servlet基类派生。
- 要想让Servlet起作用,必须在web.xml中配置它。1)告诉容器Servlet的类名;2)告诉容器Servlet对应那个路径。
- Servlet也以使用注解配置其对应路径,但是注意,要在web.xml的web-app元素中指定Servlet版本不低于3.0 。
- HTTP GET对应Servlet的doGet()方法,POST对应doPost()方法。
- 表单是一种HTML元素,叫做form,我们一般会在里面搞一些input,收集用户输入的数据并帮助提交到服务端。它请求的地址由 action属性指定。
七 Struts2
- MVC框架:SpringMVC、Struts2等;M-model-数据;V-View-视图;C-control-控制逻辑;
- SSH: Spirng+Struts+Hibernate;SSM:spring+springmvc+mybatis;
- ORM: 数据访问层,比如Hibernate、Mybatis。
- 添加struts2的库:访问Maven仓库官网:https://mvnrepository.com/,搜索struts,找到依赖项的写法;
- struts2的使用原理:配置一个Struts2的filter,接管请求也分发功能。Struts2它跟据请求的路径把请求分发给Action。要响应一个请求,我们必须实现Action类。要让Action起作用,需要配置它与请求路径的对应,在struts.xml中配置。
八 SSH
- Spring+Struts2+Hibernate。
- Struts2提供了MVC架构。
- Spring负责整合Struts2和Hibernate,说白了,Spring的作用就是让我们少写很多很多代码,同时还提高了扩展性、敏捷性。
- Spring整合Struts2和Hibernate的原理:利用Spring的IoC和DI,将Action和Session的创建都交给Spring,并且可以将Bean自动注入到Action中。
- Hibernate提供了ORM层框架,让我们在访问数据库时少写很多代码。
使用Hibernate原生API
使用步骤
- 添加Hibernate依赖库Hibernate-core;
- 添加Hibernate配置文件;
- 创建实体类,创建类与表的映射文件;
- 创建配置对象(注意必须把实体类添加到配置对象中,否则找不到实体类),创建SesionFactor;
- 从工厂获取Session,执行查询;
- 关闭Session;
查询执行方式
- HQL,简化后的SQL,注意指定表名时不能用表名,而应该用实体类的类名!
- Criteria:这是符合JTA规范的API,类型安全,推荐使用。具体用法参考JTA开发文档。
Spring整合Struts2原理
- 添加Spring的依赖,别忘了依赖Spring与Struts整合的插件。
- 创建Spring的配置文件,在其中将Action配置成Bean,也可以使用注解的方式。
- 修改Strtus的配置文件,告诉它,现在由spring来创建Bean。
- 在web.xml中配置Spring侦听器,它侦听整个WEB程序的启动与停止,所以它是生命期与WEB程序相同,Spring容器,就是靠这个侦听器提供的。
Spring整合Hibernate原理
- 加载Hibernate配置文件和创建SessionFactory的代码不需要写了,我们只需要在Spring的配置文件中定义一个SessionFactory Bean。
- 由于利用Spring创建SessionFactory,Hibernate的配置项需要在Spring的配置文件中指定。
- Session的创建利用Spring的依赖注入,自动注入到需要它的Bean中。
- 我们不再需要写事务代码,Spring利用面向切面的技术(AOP),把事务开始和提交两个代码自动织入需要的方法中。
- 需要配置的Bean:dataSources-配置如何连接数据库;sessionFactory-配置Hibernate设置项;transactionManager-事务管理器;tx:annotation-driven-基于注解的声明式事务切入。
- Spring集成后,sessionFactory可自动注入,获取session时需使用getCurrentSession(),注意sessionFactory的注入需使用Resource,Autowired与Transactional似乎有冲突。
使用Spring Data JPA做为ORM层
- JPA它本身只是一套规范,有多种实现,Hibernate就实现了JPA,所以,Spring Data JPA底层依然依赖于Hibernate。
- 单独使用JPA的过程:创建配置文件;创建实体类,用注解说明实体与表的映射;创建EntityManagerFactory,创建EntityManager,执行查询,关闭EntityManager。
- 注意事项:1)Hibernate已经把JPA集成到Core库中了;2)配置文件名字固定,且必须放到WEB-INFO/classes/META-INFO下。
- 使用Spring集成JPA的原理:1)EntityManager、EntityManagerFactory都成为Bean,由Spring管理;2)JPA配置文件的内容被放到不同的Bean中了;3)必须参在数据操作层;4)操作数据库的代码不再需要手动实现,JPA框架会帮助实现,所以在数据操作层只需要创建接口,定义方法而不需要实现方法;5)数据操作层的方法默认都有事务支持;6)可以在数据操作层的方法上用@Qurey指明内部SQL,注意表名是实体类名;7)在相关Bean的配置中必须指明实体类的包位置、数据操作层的包位置;
九、乱码
- 网页中出现乱码,原因肯定是浏览器的所采用的字符编码与后台的字符编码不一致引起的。
- 解决方案很明确:让前后端采用的字符编码一致,一般统一使用UTF8编码。
- 涉及到的地方有:JSP页面用page指令声明编码格式,设置request的编码格式,设置response的编码格式,设置网页的编码格式;
十、SSM
- Spring+SpringMVC+Mybatis
- Spring用于整合其它框架,提供IoC和DI和AOP支持;
- SpringMVC是MVC框架,代替Struts2;
- MyBatis是ORM层,代替Hibernate;
SpringMVC配置
- 原理:在web.xml中配置一个Servlet,让这个Servlet接管对某些或全部路径的请求,于是SpringMVC就起作用了;
- 步骤:1)添加依赖库;2)在web.xml中配置Servlet;3)添加SpringMVC的配置文件;4)创建SpringMVC Controller类,创建方法,指定方法响应的路径;5)创建JSP文件用于产生网页,并且指定Controller方法与JSP文件的对应关系;
- Model:SpringMVC分离了View层和Controller层,它们之间要传递数据就用Model;