一、Java平台的时间线
1、Java技术栈包含的内容
① Java是一门包含了严格和强类型语法的语言;
② Java平台标准版本,也被称为JavaSE,它是构建Java应用程序的基础;
③ Java的JVM是一个可以运行编译后Java代码的软件虚拟机。因为被编译过的Java代码只是字节码,JVM将在运行代码之前,把字节码编译成机器码。JVM还负责管理内存,从而实现了应用程序管理的简化;
④ Java的JDK是Java开发都开发应用程序所需要的工具包。它包含了Java语言编译器、文档生成器、与本地代码协作的工具和用于调试平台类的Java源代码;
⑤ Java的JRE是用于运行编译后的Java应用程序的软件。
2、JavaSE7平台添加的新特性
① 泛型实例化的简写
未简化之前:声明语句中包含了大量的冗余信息
Map<String, Map<String, List<Object>>> map1 = new HashMap<String, Map<String, List<Object>>>();简化之后:编译器将会为实例化的HashMap推断出它的类型参数
Map<String, Map<String, List<Object>>> map2 = new HashMap<>();② 简化try-catch-finally块管理可关闭的资源
String file = "D:\\GitRepositories\\learn-parent\\learn-javaweb\\javaweb-g2\\test.txt";
String charset = "utf-8";
//将写字符转换成字节流
FileOutputStream outputStream = null;
OutputStreamWriter writer = null;
try {
outputStream = new FileOutputStream(file);
writer = new OutputStreamWriter(outputStream, charset);
writer.write("这是一段用来测试的文本,测试字符流到字节流的转换!");
} catch (IOException e) {
throw new RuntimeException("文件写入失败");
} finally {
try {
if (null != writer) {
writer.close();
}
} catch (IOException e) {
throw new RuntimeException("输出流关闭失败");
}
}简化之后:在try关键字后面的圆括号中声明的资源,将会在隐式的finally块中自动关闭,任何在这段清理过程中抛出的异常都将被添加到现有异常的抑制异常中或者如果之前没有任何异常发生,那么该异常将在所有的资源都关闭后抛出。
String file = "D:\\GitRepositories\\learn-parent\\learn-javaweb\\javaweb-g2\\test.txt";
String charset = "utf-8";
//将写字符转换成字节流
try (FileOutputStream outputStream = new FileOutputStream(file)) {
OutputStreamWriter writer = new OutputStreamWriter(outputStream, charset);
writer.write("这是一段用来测试的文本,测试字符流到字节流的转换!");
} catch (IOException e) {
throw new RuntimeException("文件写入失败");
}③ 可以捕捉多个异常
例如:
try {
//代码块
} catch (MyException | YourException e) {
//异常处理
}注意:不能同时捕捉多个相互之间有继承关系的异常,比如FileNotFoundException和IOException,FileNotFoundException继承了IOException,在这种情况下,只需要捕捉IOException即可,这样这两种异常都可以捕捉到。
④ switch的参数可以使用字符串
3、JavaSE8平台添加的新特性
① lambda表达式
lambda表达式的本质是匿名函数,在定义或调用时不需要被赋予类型名或绑定到标志符,这在实现单方法接口时非常有用。
未使用lambda表达式之前:
Thread thread1 = new Thread(new Runnable() {
@Override
public void run() {
//代码块
}
});使用lambda表达式的情况:
Thread thread2 = new Thread(() -> {
//代码块
});还可以使用一个方法引用来传入一个匹配接口方法的引用,如下:
Thread thread3 = new Thread(this::dosomething);
public void dosomething() {
//代码块
}二、了解基本的Web应用程序的结构
1、Servlet、过滤器、监听器和JSP
几乎发送到应用程序中的所有请求都将经过某种类型Servlet的处理,过滤器可以拦截发送给Servlet的请求,监听器可以通知代码多种事件,JSP可以为Web应用程序创建动态的、基于HTML的图形化用户界面。
2、目录结构和WAR文件
JAR文件只是一个简单的ZIP格式的归档文件,其中包含了可被JVM识别的标准目录结构,WEB-INF目录存储了一些包含信息和指令的文件,它的classes目录被用作包的根目录,所有编译后的应用程序类文件和其他资源都被存储在该目录中。
WAR文件可以包含应用程序所依赖的JAR文件,它们被存储在/WEB-INF/lib目录中,/WEB-INF/tags和/WEB-INF/tld分别用于存储JSP标签文件和标签库描述符。
3、部署描述符
部署描述符是用于描述Web应用程序的元数据,并为Web应用程序部署和运行Web应用程序提供指令。所有元数据都来自于部署描述符文件/WEB-INF/web.xml文件,该文件通常包括Servlet、监听器、过滤器的定义,以及HTTP会话、JSP和应用程序的配置选项。
4、在tomcat中配置编译的JavaSE版本
在conf/web.xml中搜索JspServlet,然后在<servlet></servlet>标签中添加如下内容:
<!--默认情况下tomcat使用jdk1.6来编译jsp文件(即使开启了jdk1.8的支持),这里指定jdk1.8-->
<init-param>
<param-name>compilerSourceVM</param-name>
<param-value>1.8</param-value>
</init-param>
<init-param>
<param-name>compilerTargetVM</param-name>
<param-value>1.8</param-value>
</init-param>注意:Tomcat启动时需要JRE,它会先寻找JRE_HOME,找不到时继续寻找JDK_HOME。