WEB 技术和 java

1 web 技术和 java

1.1. web 技术

操作系统有进程子系统,使用多进程就可以充分利用硬件资源。进程中可以多个线程,每一个线程可以被 CPU 调度执行,这样就可以让程序并行的执行。这样一台主机就可以作为一个服务器为多个客户端提供计算服务。

CPU 不能直接去访问 IO。进程是一个资源管理单位,并且进程管理者线程。线程就是干活的。一个核心在一个瞬间只能一个进程在工作

进程是在内存中形成的数据结构。是一个资源的单位对线程进行管理。线程中写了函数。一个进程中线程太多,进程会管理不过来。

操作系统管理的进程也是有限的。

进程是将内存上的文件写到了磁盘上。进程管理线程。

在工作中都是由线程函数在执行任务。

操作系统调用的是一个个的线程。

并发:指的是在这一段时间之类需要做的事。

并行:在这一个时刻同时有几件事来做。并行不过是并发的一种解决方案。在同一个时刻有多件事可以并发做。而并发关注的是这段时间内有这么多是需要做也叫做水平扩展

客户端和服务端往往处在不同的物理主机上,它们分属不同的进程,这些进程间需要通信。跨主机的进 程间通信需要使用网络编程。最常见的网络编程接口是 Socket。

Socket 称为套接字,本意是插座。也就是说网络通讯需要两端,如果一端被动的接收另一端请求以提供计算和数据的称为服务器端,另一端往往只是发起计算或数据请求,称为客户端。

这种编程模式称为Client(客户端)/Server(服务端)编程模式,简称 C/S 编程。开发的程序也称为 C/S 程序。CS 编程往往使用传输层协议(TCP/UDP),较为底层。

1980年 TCP/IP 协议研发成果。到1984年,美国国防部将 ARPA 在内的所有军事网络全部使用 TCP/IP 协议。IBM、AT&T、DEC 等公司陆续也加入到 TCP/IP 阵营。1989年,加州大学伯克利分校在 BSD 中加入 TCP/IP 协议,产生了广泛的影响。微软从 Windows 95 开始支持。

1990年,基于 TCP 协议的 HTTP 协议和浏览器诞生。在应用层使用文本跨网络在不同进程间传输数据,最后在浏览器中将服务器端返回的 HTML 渲染出来。由此,诞生了网页开发。

网页是存储在 WEB 服务器端的文本文件,浏览器发起HTTP请求后,到达 WEB 服务程序后,服务程序根 据URL读取对应的 HTML 文件,并封装成HTTP响应报文返回给浏览器端。

起初网页开发主要指的是 HTML、CSS 等文件制作,目的就是显示文字或图片,通过超级链接跳转到另一个HTML并显示其内容。

后来,网景公司意识到让网页动起来很重要,傍着 SUN 的 Java 的名气发布了 JavaScript 语言,可以在浏 览器中使用 JS 引擎执行的脚本语言,可以让网页元素动态变化,网页动起来了。

为了让网页动起来,微软使用 ActiveX 技术、SUN 的 Applet 都可以在浏览器中执行代码,但都有安全性 问题。能不能直接把内容直接在WEB服务器端组织成HTML,然后把HTML返回给浏览器渲染呢?

最早出现了CGI(Common Gateway Interface)通用网关接口,通过浏览器中输入URL直接映射到一个服务器端的脚本程序执行,这个脚本可以查询数据库并返回结果给浏览器端。这种将用户请求使用程序动态生成的技术,称为动态网页技术。先后出现了ASP、PHP、JSP等技术,这些技术的使用不同语言编写的程序都运行在服务器端,所以称为 WEB 后端编程。有一部分程序员还是要编写HTML、CSS、JavaScript,这些代码运行在浏览器端,称为WEB 前端编程 。合起来称为 Browser/Server 编程,即 B/S 编程 。

1.1.2 HTML

HTML(HyperText Markup Language)超文本标记语言,它不同于编程语言。

超文本就是超出纯文本的范畴,例如描述文本的颜色、大小、字体等信息,或使用图片、音频、视频等 非文本内容。

HTML由一个个标签组成,这些标签各司其职。有的提供网页信息,有的负责图片,有的负责网页布局。

范例:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>首页</title>
</head>
<body>
<h1>马哥教育欢迎您</h1>
</body>
</html>

超文本需要显示,就得有软件能够呈现超文本定义的排版格式,例如显示图片、表格,显示字体的大、小、颜色,这个软件就是浏览器

超文本的诞生是为了解决纯文本不能格式显示的问题,是为了好看,但是只有通过网络才能分享超文本 的内容,所以制定了 HTTP 协议。

如今,HTML 依然是互联网中展示数据最主要的方式,广泛的应用在 PC 端和移动端。

1.1.3 CSS( Cascading Style Sheets )层叠样式表

HTML 本身为了格式化显示文本,但是当网页呈现大家面前的时候,需求HTML提供更多样式能力。这使得HTML变得越来越臃肿。这促使了CSS的诞生。

1994年,W3C 成立,CSS 设计小组所有成员加入 W3C,并努力研发CSS的标准,微软最终加入。

1996年12月发布CSS 1.0。

1998年5月发布CSS 2.0。

CSS 3 采用了模块化思想,每个模块都在 CSS 2 基础上分别增强功能。所以,这些模块是陆续发布的。

不同厂家的浏览器使用的引擎,对 CSS 的支持不一样,导致网页布局、样式在不同浏览器不一样。因此,想要保证不同用户使用不同浏览器看到的网页效果一直非常困难。

1.1.4 浏览器

1980年代,Tim Berners-Lee 为 CERN(欧洲核子研究中心,当时欧洲最大的互联网节点)设计基于超文本思想的 ENQUIRE 项目,以促进科研人员之间的信息共享和更新。1989年 3 月 他编写了《信息化管理:建议》一文,并构建基于 Internet 的 Hypertext 系统,并在 CERN 开发了 World Wide Web 项目,打造了世界上第一个网站,于1991年8月6日正式上线。2019年是WWW的第三十年。

Tim Berners-Lee于1990年发明了第一个浏览器,还发明了HTTP协议。

1994年MIT他创建了 W3C 。W3C 万维网联盟,负责万维网持续发展。他提出 W3C 的标准应该基于无专 利权、无版税。

Marc Andreessen于1993年发明了Mosaic浏览器。

并看到了这个技术的前景,不久后他成立自己的公司——网景 Netscape。1994发布了 Netscape Navigator浏览器,席卷全球。1995年微软发布IE,开启第一次浏览器大战,最终后来居上。

1999年网景被 AOL 收购,收购后不久,Netscape 公开了浏览器代码,并创建了 Mozilla 组织。Mozilla 组织使用Gecko 引擎重写浏览器。

Mozilla 组织使用 Gecko 引擎发布了几款浏览器,最终于 2004 年更名为 Firefox 浏览器。2003年5月,网景被解散。

AOL于2007年12月宣布停止支持Netscape浏览器。

Apple的Safari于2003发布第一个测试版。

2008年Google的Chrome浏览器带着 V8 引擎横空出世。

2008年IE占据浏览器市场份额的75%,FF占近20%,如今2019 年Chrome占据市场份额近70%。

浏览器内两大核心:渲染引擎和JS引擎

1.1.5 JavaScript

Javascript 简称 JS,是一种动态的弱类型脚本解释性语言,和 HTML、CSS 并称三大 WEB 核心技术,得到了几乎主流浏览器支持。

1994年,网景 Netscape 公司成立并发布了 Netscape Navigator 浏览器,占据了很大的市场份额,网景意识到WEB 需要动态,需要一种技术来实现。

1995年9月网景浏览器2发布测试版本发布了 LiveScript,随即在12月的测试版就更名为 JavaScript 。同时期,微软推出 IE 并支持 JScript、VBScript,与之抗衡。

1997年,网景、微软、SUN、Borland 公司和其他组织在 ECMA 确定了 ECMAScript 语言标准。JS 就成为ECMAScript 标准的实现之一。

2008年后随着 chrome 浏览器的 V8 引擎发布。

V8 JS 引擎不是解释执行,而是本地编译,在 V8 引擎做了很多优化,JS 程序在其上运行堪比本地二进制程序。

V8 引擎使用 C++ 开发,可以嵌入到任何 C++ 程序中。基于它,2009 年 Nodejs 诞生,提供了大量的库供程 序员使用。从此,便可以在服务器端真正大规模使用 JavaScript 编程了。也就是说 JavaScript 也真正称为 了服务器端编程语言了。

1.1.6 静态网页技术

早期的 HTML 设计之初,只能 HTML ,里面可以显示文字、图片,使用 CSS 来控制颜色、字体大小等。再后来引入了 JavaScript 就可以是网页可以人机交互、可以让元素动起来。但这都不是内容的动态变化。

1.1.7 动态网页技术

网页的内容是后端根据用户从浏览器端提交的请求不同,通过后台的程序将内容临时拼凑好,生成HTML,返回到浏览器端,通过浏览器端渲染呈现。常见的有 ASP 和 DotNet、JSP、PHP、Nodejs 等。

浏览器必须有两大核心:

渲染引擎和 JS 引擎

1.2 开发语言

语言:人与人交流的沟通表达方式

计算机语言:人与计算机之间交互沟通的语言

1.2.1 大数据领域

把计算过程分为两部分:

  • Hadoop (哈杜普大数据生态圈)

    • Mapreduce (做离线计算)

    • Hdfs

    • Hbase

  • Spark (实时计算)

  • Blink (实时计算)

    • Kafka

    • Redis

    • ES (搜索引擎)

1.2.2 语言分类

  • 面向机器语言

    • 机器指令或对应的助记符,与自然语言差异太大汇编语言

    • 汇编语言

  • 面向过程语言

    • 做一件事情,排出个步骤,第一步干什么,第二步干什么,如果出现情况A,做什么处理,如果出现了情况B,做什么处理。

    • 问题规模小,可以步骤化,按部就班处理

    • C 语言

  • 面向对象语言

    • 一种认识世界、分析世界的方法论。将万事万物抽象为各种对象

    • 类是抽象的概念,是万事万物的抽象,是一类事物的共同特征的集合

    • 对象是类的具象,是一个实体

    • 问题规模大,复杂系统

按照与自然语言的差异分类:

  • 低级语言

    • 机器语言、汇编语言都是面向机器的语言,都是低级语言。不同机器是不能通用的,不同的 机器需要不同的机器指令或者汇编程序

  • 高级语言

    • 接近自然语言和数学语言的计算机语言

1.2.3 常见语言

  • C语言

    • 面向过程编程,只有函数

    • 操作系统编程、单片机编程等领域

    • Unix 之父Dennis Ritchie 创建 C++语言

  • C ++ 语言

    • 底层高性能开发

    • 面向对象,学习难度极大,目前标准发展有点乱

  • Java

    • WEB开发领域第一,延伸领域极多,库丰富

    • 大数据领域生态完整

  • Python

    • 入门门槛低,非专业程序员容易接受,他们有丰富的专业知识,但计算机专业知识不够Python简洁的语法,不需要让他们关注背后的细节,可以让他们较容易的掌握并开始编程

    • 运维开发使用最广泛语言

    • 数据科学、AI

  • Javascript

    • 网景公司发明的动态脚本语言,前端开发第一语言

    • JavaScript才是目前、前后端通吃的全栈语言

    • 前端执行的 JS 代码,需要从服务器端发送到浏览器端,在浏览器端使用JS引擎执行

  • Go

    • B 语言之父、Unix 之父 Ken Thompson 亲自参与设计

    • 静态编译型语言,但结合了动态解释性语言的特点,例如GC

    • 充分利用多核,适合高并发场景

    • 云生态最重要的语言

1.3 WEB 架构

后端资源分类:

  • 静态资源

    • 图片:一旦创建好,图片文件不再改变。图片数目多,占用磁盘空间多,一般使用单独的图 片服务器

    • HTML、CSS、JavaScript:这些文本是文本的,前端工程师可以修改这些文件,但修改次数较少,一段时间都不变

  • 动态资源

    • 内容由后台程序动态生成,比如查询数据库后,将查询结果生成为HTML

PC端或移动端浏览器访问:

从静态服务器请求 HTML、CSS、JS 等文件发送到浏览器端,浏览器端接收后渲染在浏览器上,这些文件都是文本,可压缩后传输 从图片服务器请求图片资源显示 从业务服务器访问动态内容,动态内容是请求后有后台服务访问数据库后得到的,最终返回到浏览器端

WEB app 访问:

内置了 HTML 和 JS 文件,不需要从静态 WEB 服务器下载 JS 或 HTML 。为的就是减少文件的发送,现代前端开发使用的 JS 文件太多或太大了 有必要就从图片服务器请求图片,从业务服务器请求动态数据 客户需求多样,更多的内容还是需要由业务服务器提供,业务服务器往往都是由一组服务器组成。

1.3.1 一次 WEB 服务的静态资源的访问工作原理流程

www.xxxx.com/index.html -->> 请求报文的 header 首行  -->>  server端找资源
html 标签和数据 称为 HTTP 报文的正文  -->>  浏览器  -->>  DOM 渲染

静态资源请求:
<script src= 'index.js'>  -->>  HTTP 请求
<img src='test.png'>  -->>  HTTP 请求
main.css

后台应用架构:

  • 单体架构

    • JSP、Servlet

    • 不管项目多么大,都打包成一个jar、war部署

    • 服务器有开源的tomcat、jetty。商用的有Jboss、weblogic、websphere、glassfish商用的

  • Dubbo

    • 分布式服务框架

    • 将单体程序分解成多个功能服务模块,模块间使用 Dubbo 框架提供的高性能RPC通信

    • 阿里开源贡献给了 ASF,目前已经是 Apache 的顶级项目

    • 内部协调使用 Zookeeper,实现服务注册、服务发现。有服务治理

  • Spring Cloud 微服务

    • 将单体应用拆分为粒度更小的单一功能服务

    • RPC通信

    • 需要更高的运维水平,服务太多了需要服务治理

不同的应用架构,部署方式也有不同。

1.4 JAVA

1.4.1 java 历史

Java原指的是印度尼西亚的爪哇岛,人口众多,盛产咖啡、橡胶等。

Java语言最早是在1991年开始设计的,期初叫 Oak 项目,它初衷是跑在不同机顶盒设备中的。

1993网景公司成立。Oak 项目组很快他们发现了浏览器和动态网页技术这个巨大的市场,转向 WEB 方向。并首先发布了可以让网页动起来的 Applet 技术(浏览器中嵌入运行 Java 字节码的技术)。

在1995年,一杯爪哇岛咖啡成就了Java这个名字。

Sun 公司第一个 Java 公开版本 1.0 发布于1996年。口号是“一次编写,到处运行”(Write once,Run anywhere),跨平台运行。

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个JAVA API的重新实现受到合理使用的保护。

2017年Oracle上诉美国联邦巡回上诉法院,2018年3月27日,判决Oracle胜诉,Google应赔偿近90亿美金。

2019年1月Google想让美国最高法院撤销联邦法院裁决。谷歌表示裁决是“对软件业的毁灭性一击”。现任特朗普政府支持Oracle公司,但微软、Mozilla、红帽支持Google。目前案件已经受 理,并将审理。

此案如果Oracle胜诉,将在美国形成判例,将深远广泛影响软件业。例如POSIX接口,是商用系 统UNIX的兼容接口规范。

1.4.2 组成

java 包含下面几个部分:

  • 语言、语法规范。关键字if、for、class等等

  • 编写源代码source code

  • 依赖库,标准库、第三方库。底层代码太难使用且开发效率低,封装成现成的,好比净菜直接可以烧了,但是什么口味程序员自己定

  • JVM 虚拟机。字节码运行在 JVM之上

由于操作系统 ABI(应用程序二进制接口)不一样,采用编译方式,需要为不同操作系统编译二进制程序。

1995年,Java 发布 Applet 技术,Java 程序在后台编译成字节码,发送到浏览器端,在浏览器中运行一个 Applet程序,这段程序是运行在另外一个 JVM 进程中的。

但是这种在客户端运行 Java 代码的技术,会有很大的安全问题。1997 年 CGI 技术发展起来,动态网页技 术开始向后端开发转移,在后端将动态内容组织好,拼成 HTML 发回到浏览器端。

1.4.3 Java 动态网页技术

1.4.3.1 servlet

本质就是一段 Java 程序

import java.io.*; 
import javax.servlet.*;
import javax.servlet.http.*;

public class HelloWorld extends HttpServlet 
  { private String message;
  public void init() throws ServletException
  {
  message = "Hello World";
  }

  public void doGet(HttpServletRequest request,
                    HttpServletResponse response) 
              throws ServletException, IOException
{
    response.setContentType("text/html");

    PrintWriter out = response.getWriter(); 
    out.println("<h1>" + message + "</h1>");
}

  public void destroy()
  {
    }
  }

在 Servlet 中最大的问题是,HTML 输出和 Java 代码混在一起,如果网页布局要调整,就是个噩梦。

1.4.3.2 jsp ( Java Server Pages )

提供一个 HTML ,把它变成一个模板,也就是在网页中预留以后填充的空,以后就变成了填空了。

<%@ page language="java" contentType="text/html; 
        charset=UTF-8" pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
    <meta charset="utf-8">
    <title>jsp例子</title>
</head>
<body>
后面的内容是服务器端动态生成字符串,最后拼接在一起
<%
out.println("你的 IP 地址 " + request.getRemoteAddr());
%>
</body>
</html>

JSP 是基于 Servlet 实现,JSP 将表现和逻辑分离,这样页面开发人员更好的注重页面表现力更好服务客户。

JSP 先转换为 Servlet 的源代码.java 文件(Tomcat 中使用 Jasper 转换),然后再编译成 .class 文件,最后就可以在JVM中运行了。

1.5 JDK

JRE:它是Java Runtime Environment缩写,指 Java 运行时环境, 包含 JVM + Java 核心类库

JDK:它是Java Development Kit,即 Java 语言的软件开发工具包。

JDK:也就是常说的 J2SE,在 1999 年,正式发布了 Java 第二代平台,发布了三个版本:

J2SE:标准版,适用于桌面平台

J2EE:企业版,适用于企业级应用服务器开发 J2ME:微型版,适用于移动、无线、机顶盒等设备环境

2005年,Java的版本又更名为 JavaSE、JavaEE、JavaME。

Servlet、Jsp 都包含在JavaEE规范中。

JDK7、JDK8、JDK11 是 LTS(Long Term Suppot)

版本 项目名称 发行日期
JDK 1.1.4 Sparkler(宝石) 1997-09-12
JDK 1.1.5 Pumpkin(南瓜) 1997-12-13
JDK 1.1.6 Abigail(阿比盖尔–女子名) 1998-04-24
JDK 1.1.7 Brutus(布鲁图–古罗马政治家和将军) 1998-09-28
JDK 1.1.8 Chelsea(切尔西–城市名) 1999-04-08
J2SE 1.2 Playground(运动场) 1998-12-04
J2SE 1.2.1 none(无) 1999-03-30
J2SE 1.2.2 Cricket(蟋蟀) 1999-07-08
J2SE 1.3 Kestrel(美洲红隼) 2000-05-08
J2SE 1.3.1 Ladybird(瓢虫) 2001-05-17
J2SE 1.4.0 Merlin(灰背隼) 2002-02-13
J2SE 1.4.1 grasshopper(蚱蜢) 2002-09-16
J2SE 1.4.2 Mantis(螳螂) 2003-06-26
Java SE 5.0 (1.5.0) Tiger(老虎) 2004-09-30
Java SE 6.0 (1.6.0) Mustang(野马) 2006-04
Java SE 7.0 (1.7.0) Dolphin(海豚) 2011-07-28
Java SE 8.0 (1.8.0) Spider(蜘蛛) 2014-03-18
Java SE 9 2017-09-21
Java SE 10 2018-03-14 [3]

JDK协议是JRL( JavaResearch License)协议

1.5.1 OpenJDK

OpenJDK 是 Sun 公司采用 GPL v2 协议发布的 JDK 开源版本,于2009年正式发布。

https://openjdk.java.net/projects/jdk6/

OpenJDK 7 是基于 JDK7 的 beta 版开发,但为了也将 Java SE 6 开源,从 Open JDK7 的 b20 构建反向分支开发,从中剥离了不符合 Java SE 6 规范的代码,发布 OpenJDK 6。所以 OpenJDK6 和 JDK6 没什么关系。

OpenJDK 使用 GPL v2 可以用于商业用途。

1.5.2 安装 JDK (部署 java 环境)

1.5.2.1 使用yum安装openjdk。

JDK 是运行 java 的环境

# yum install java-1.8.0-openjdk

# java -version
openjdk version "1.8.0_212"
OpenJDK Runtime Environment (build 1.8.0_212-b04) OpenJDK 64-Bit Server VM (build 25.212-b04, mixed mode)

1、使用 yum list java*列出说有 java 开头的安装包查看 CentOS7.6 默认 yum 的 base 源中都有哪些 jdk 版本

[15:13:54 root@a7 ~]#yum list java*

devel 包主要是供开发用,至少包括以下2个东西:

  • 头文件

  • 链接库有的还含有开发文档或演示代码。以 java 和 java-devel 为例:如果你安装基于 java 开发的程序,只需要安装 java 包就行了。但是如果你要编译使用了 java 的源代码,则需要安装 java-devel。

2、安装 java-11-openjdk 包和 java-

[15:13:54 root@a7 ~]#yum install java-11-openjdk java-11-openjdk-devel -y

3、通过 java -version 查看当前 java 版本

[15:21:30 root@a7 ~]#java -version
openjdk version "1.8.0_242"
OpenJDK Runtime Environment (build 1.8.0_242-b08)
OpenJDK 64-Bit Server VM (build 25.242-b08, mixed mode)

4、使用 java 编写 Hello world ,一定要是 .java后缀因为这样才是一个 java 程序该执行的文件

[15:37:46 root@a7 ~]#vim Hello.java
public class Hello{
        public static void main(String[] args){
                System.out.println("hello world !!!");
    }
}

5、javac:是编译命令,将java源文件编译成.class字节码文件。使用javac将hello编译成class字节码文件

[15:47:51 root@a7 ~]#javac Hello.java 
[15:47:57 root@a7 ~]#ll
-rw-r--r--  1 root root   419 Oct 26 15:47 Hello.class

6、使用java Hello执行这个java程序

[15:50:14 root@a7 ~]#java Hello
hello world !!!

通过上面一系列操作,我们的java环境就已经部署好了

1.5.2.2 使用 Oracle 官方网站 JDK 8 RPM 安装

oracle 官网:

https://www.oracle.com/index.html

Jdk 下载地址:

https://www.oracle.com/java/technologies/javase/javase-jdk8-downloads.html

下载 jdk-linux

1、然后再将这个jdk的rpm安装包拖入到我们的虚拟机中

[16:07:34 root@a7 ~]#ll jdk-8u271-linux-x64.rpm 
-rw-r--r-- 1 root root 112994496 Oct 26 16:06 jdk-8u271-linux-x64.rpm

2、使用yum进行安装,这样就能够自动解决依赖问题

[16:07:57 root@a7 ~]#yum install jdk-8u271-linux-x64.rpm -y

3、生成全局环境变量使其 jdk 1.8.0_271版本生效

# 生成全局变量
[16:11:19 root@a7 ~]#vim /etc/profile.d/jdk.sh
#! /bin/bash
export JAVA_HOME=/usr/java/default 
export PATH=$JAVA_HOME/bin:$PATH 

# 使其变量生效
[16:13:18 root@a7 ~]#. /etc/profile.d/jdk.sh

4、通过查看 java1.8.0_271 已经生效

[16:14:13 root@a7 ~]#java -version
java version "1.8.0_271"
Java(TM) SE Runtime Environment (build 1.8.0_271-b09)
Java HotSpot(TM) 64-Bit Server VM (build 25.271-b09, mixed mode)
点赞