开发者学堂课程【Tomcat 服务器入门详解:WEB 架构和 Java 网页技术】学习笔记,与课程紧密联系,让用户快速学习知识。
课程地址:https://developer.aliyun.com/learning/course/654/detail/10844
三、Java
1.历史
Java 原指的是印度尼西亚的爪哇岛,人口众多,盛产咖啡、橡胶等。
Java 语言最早是在1991年开始设计的,期初叫 Oak 项目,它初衷是跑在不同机顶盒设备中的。
1993网景公司成立。Oak 项目组很快他们发现了浏览器和动态网页技术这个巨大的市场,转向 WEB 方向。并首先发布了可以让网页动起来的 Applet 技术(浏览器中嵌入运行 Java 字节码的技术)。
在1995年,一杯爪哇岛咖啡成就了 Java 这个名字。
Sun 公司第一个 lava 公开版本1.0发布于1996年。口号是“一次编写,到处运行"(Write once,Runanywhere),跨平台运行。
1999年,SUN 公司发布了第二代 Java 平台 (Java2)。
2009年4月20日,Oracle 甲骨文公司宣布将以每股9.50美元,总计74亿美金收购SUN (计算机系统)公司。2010年1月成功收购。
2010年,Java 创始人之一的 James Gosling 离开了 Oracle,去了 Google。
2010年8月13日,Oracle 在加利福尼亚地方法院起诉 Google 侵犯版权和专利权。Oracle 声称 Google 侵犯了 Java 37个 API 和部分专利。地方法院的陪审团认为未侵犯专利,且 API 无版权。2016年5月26日,地方法院二审陪审团认定未侵犯版权,对37个 JAVAAPI 的重新实现受到合理使用的保护。
2017年 Oracle 上诉美国联邦巡回上诉法院,2018年3月X7日,判决 Oracle 胜诉,Google 应赔偿近90亿美金。
2019年1月 Google 想让美国最高法院撤销联邦法院裁决。谷歌表示裁决是"对软件业的毁灭性一击"”。现任特朗普政府支持 Oracle 公司,但微软、Mozilla、红帽支持 Google。目前案件已经受理,并将审理。
此案如果 Oracle 胜诉,将在美国形成判例,将深远广泛影响软件业。例如 POSIX接口,是商用系统 UNIX 的兼容接口规范。
2.组成
Java 包含下面部分:
语言、语法规范(开源的)。关键字 if、for、class(为语言成分,使用其来进行编程)等等
编写源代码 source code(将基础类库进行加工之后,就是源代码)
依赖库,标准库(Java 自身提供的库,又叫基础类库,好比做菜并不需要自己种蔬菜,只需要买回所需食材即可,买回的食材为半成品,即此处的核心类库)、第三方库(如 Apache 中的类库,就可以直接使用)。底层代码太难使用且开发效率低,封装成现成的库,好比净菜直接可以烧菜了,但是什么口味程序员自己定
JVM 虚拟机(基于核心类库编写源代码后运行的场所就在 JVM上)。字节码运行在 JVM 之上。将源代码编译为二进制的,并非 exe 的,是一种中间状态编码,可以被虚拟机识别。
虚拟机意为将其当做物理机,当物理机要跑一个二进制代码的信机器码格式,但此处机器码仅对于虚拟机的格式,在此的机器码叫做中间代码,又因其是二进制的,所以取名为字节码(Byte-code)。在此 Java 没有虚拟机(解释器)就无法运行,并非是就地编辑,需要一个中间代码。又名字节码。同时在v8引擎之前许多高级语言,如:JavaScript,java,php 都是在虚拟机上运行,GO 语言除外,为了性能,仅仅将内存回收交给垃圾回收。
写一遍到处运行,指的是先使用记事本等编写代码,然后编译生成 class,之后若想在 window 系统上运行就放到 window 虚拟机上,即按不同 CPU 和操作类型选择虚拟机,java 并非直接运行 .class 而是将其放到平台的虚拟机上。再任何平台上编译后字节码一样,所谓的不一样应该是 window、Linux 和 mac 的虚拟机有所差别。把字节码在上面运行,虚拟剧会将字节码转化为符合本地 cpu 运行的指令集。
由于操作系统 ABI (应用程序二进制接口)不一样,采用编译方式,需要为不同操作系统编译二进制程序。
被淘汰的 Applet 技术:
有一个浏览器,在其中装一个 java 虚拟机(含义 jre),在其中嵌入一个 java 运行的代码,但是并非 .java 而是 .class,而 .class 在服务器端,浏览器发起请求到服务器端后会被编译为 class 然后再返回浏览器中的虚拟机运行环境中运行,其中存在较大的安全性,所以被淘汰。
1995年,Java 发布 Applet 技术,Java程序在后台编译成字节码,发送到浏览器端,在浏览器中运行一个 Applet 程序,这段程序是运行在另外一个 JVM 进程中的。
但是这种在客户端运行 Java 代码的技术,会有很大的安全问题。1997年 CGl 技术发展起来,动态网页技术开始向后端开发转移,在后端将动态内容组织好,拼成 HTML 发回到浏览器端。
四、Java 动态网页技术
1.servlet
最早并没有动态网页技术,而有 servlet。
本质就是一段 Java 程序
代码如下:
//导入需要使用的包和库
import java.io.* ;
import javax.servlet.* ;
import javax.servlet.http.*;
//类扩展为 HTTP 的 Servlet
public class Helloworld extends HttpServlet {
//初始化
private String message;
public void init() throws ServletException
{
message = "Hello world";
}
//一个 http 请求接受之后,会找到 get 方法后请求以下 doGet 方法。将来的信息封装到 request 中,加工后的信息即响应后的报文放在 response。
public void doGet(HttpservletRequest request,
HttpservletResponse response)
throws ServletException,IOException
{//但并非都需要更改,更改其中的响应状态码等等即可。
response . setContentType( "text/html");//设置响应报文的类型,将得到的 html 链接放在响应报文的头部
Printwriter out = response.getwriter();//编写 Printwriter类,向缓存区写,从 response 中拿一个 Writer 对象
out.printin("
" + message + "
");//调用其打印,向 writer 对象中写入字符串"
" + message + "
"
}
//到此全部完成,我们只需要更改状态码,其余的会自动封装。以上为一个 get 请求到来后,直接调用函数,而 throws ServletException,IOException 中的内容全部动态实现。
若这块数据要调用数据库,也可以直接实现先调用业务层,再去调用数据访问层,数据访问再去调用 model,最后返回再将数据嵌入,类似于字符串的拼接。
//在此可以发现,不论函数多么复杂,最后都是字符串的拼接,因为 http 是纯文本的。
public void destroy()
{
}
问题
在 Servlet 中最大的问题是需要一行一行打印 HTML 输出和 Java 代码混在一起,太过繁琐,同时在改版需要等待美工完成后更改代码,多次重复的更改使得效率大大降低。
如果网页布局要调整,就是个噩梦。
2. jsp (Java Server Pages)
为了更加简单,提高效率就出现了 jsp。在 jsp 不必再写过多的 print 而是采用提供一个 HTML,把它变成一个模板,也就是在网页中预留以后填充的空,以后就变成了填空了。
<%page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
< !DOCTYPE html>
jsp 例子
动态可更换的代码,后面的内容是服务器端动态生成字符串,最后拼接在一起。在此基本上都是调用函数,不使用视图层,大多使用业务逻辑层
<%
out.print1n("你的 IP 地址“ +request.getRemoteAddr( ));
%>
①改进:
jsp几乎都是填充工作,可以将业务逻辑层先写好,之后美工再将填充模版合在一起,比之前的方法更加简单。
Jsp本质仍然是 servlet,仅仅不过是将其通过工具来实现 print,省略了手写。
在之后的 AJAX 中真正实现了前后分析,页面也不再编写完全交给前端,后端纯粹变为编写内容,当调用接口时就给与 JSON,不再关心放置的场所。
而<% out.print1n("你的 IP 地址“ +request.getRemoteAddr( ));
%>也不再是 Java 代码,会变为前端在浏览器中运行的js 。
②图解补充
浏览器
Tomcat
浏览器当中会在 nginx 中部署 html、css 和 js 三样,当发起一个 url 请求访问nginx 发现只访问静态时,就会将静态的 html5 拖回浏览器,同理的其中还要访问css 和 js,有了 js 后就可以发起新的 ajax 得到 JavaScript 代码后,有可能是直接发起,也可能为正在准备中的等待模式会发出请求,请求到达 Nginx 后会再来到业务服务器去请求代理。
找到业务服务器:tomcat,tomcat 因为是 Java 编写的,回去访问数据库,然后将数据库内容转化为 json,再给 neginx 返回给浏览器的 Ajax 再将其插入到 html5 中。在此就不需要任何的页面和 html 文件。都存在 nginx,同时其中的 nginx 和 tomcat 一个为前端一个为后端,称为前后端分离。
③完成过程
发起一个请求访问到 tomcat 中的j sp,jsp 先将模板找到,发现需要数据,先在后访问将数据找到插入进来形成一个大的 html 的 string,将字符串在服务器端将其封装。
与之前的前后端分离不同,前后端分离是由客户端插入到网页中去,为动态变化。
JSP 是基于 Servlet 实现,JSP 将表现(html) 和逻辑分离,这样页面开发人员更好的注重页面逻辑层即可,最后将数据调用即可,表现力更好服务客户。
④如何转换
JSP 先转换为 Servlet 的源代码 .java 文件(Tomcat 中使用 Jasper 转换成 .java),然后再编译成 .class 文件,最后就可以在 JVM 中运行了。