Java 技術體系及Tomcat結構
===============================================================================
概述:
本章將主要介紹Java技術體系基礎和Tomcat的結構,具體內容如下:
編程語言的分類程序的分類;
Java簡介
·java的發展歷程;
·JDK,JRE,JVM的區別和聯繫;
Java代碼的運行和技術體系;
Java的安裝
·Opean JDK;
·Orecal JDK;
Java 2 EE
·Servlet類庫;
·Jsp類庫;
·Tomcat的出現
Tomcat的執行過程;
Tomcat的運行和環境部署;
Tomcat的核心組件
===============================================================================
編程語言:
【百度百科解釋】
編程語言俗稱“計算機語言”,種類非常的多,總的來說可以分成機器語言、彙編語言、高級語言三大類。電腦每做的一次動作,一個步驟,都是按照已經用計算機語言編好的程序來執行的,程序是計算機要執行的指令的集合,而程序全部都是用我們所掌握的語言來編寫的。所以人們要控制計算機一定要通過計算機語言向計算機發出命令。 目前通用的編程語言有兩種形式:彙編語言和高級語言
【級別分類】
☉硬件級:微碼編程,彙編語言
☉系統級:C,C++,...(編譯型語言)
☉應用級:Java, PHP, Python, Ruby, Perl, C#, ...
Python:PVM(代碼運行環境)
Standard Library (標準庫):Web Framework(如:Django, Flask, ...)
Java:JVM(運行環境),JDK(開發環境)
bash:bash explainer(解釋器)
...
【程序】:指令+數據
☉過程式編程:以指令爲中心,數據服務於代碼;
☉對象式編程:以數據爲中心,指令服務於數據;
類,class;類屬性、類方法;
對象,方法(method)
Java:
1.簡介
★百度百科解釋
Java是一門面向對象編程語言,不僅吸收了C++語言的各種優點,還摒棄了C++裏難以理解的多繼承、指針等概念,因此Java語言具有功能強大和簡單易用兩個特徵。Java語言作爲靜態面向對象編程語言的代表,極好地實現了面向對象理論,允許程序員以優雅的思維方式進行復雜的編程;
Java具有簡單性、面向對象、分佈式、健壯性、安全性、平臺獨立與可移植性、多線程、動態性等特點。Java可以編寫桌面應用程序、Web應用程序、分佈式系統和嵌入式系統應用程序等
☉發展歷程:
2.JDK,JRE,JVM的關係與區別
★JDK:
JDK(Java Development Kit) 是Java語言的軟件開發工具包(SDK)。
JDK是整個JAVA的核心,包括了Java運行環境(Java Runtime Envirnment),一堆Java工具(javac/java/jdb等)和Java基礎的類庫(即Java API )。
☉有三種版本
SE(J2SE),standard edition,標準版
EE(J2EE),enterprise edition,企業版
ME(J2ME),micro edition,主要用於移動設備、嵌入式設備上的java應用程序
★JRE
運行JAVA程序所必須的環境的集合,包含JVM標準實現及Java核心類庫。
JRE爲Java Runtime Environment的簡稱,JRE(包括Java Plug-in)是Sun的產品,包括兩部分:Java Runtime Environment和Java Plug-in。
JRE 是可以在其上運行、測試和傳輸應用程序的Java平臺;
JRE需要輔助軟件--Java Plug-in--以便在瀏覽器中運行applet(小程序)。
沒有JDK的話,無法編譯Java程序,但在有JRE環境的系統上可以運行程序。所以當你只需要運行Java程序或Applet,下載並安裝JRE即可。如果你要自行開發 Java軟件,請下載JDK。
★JVM
JVM是Java Virtual Machine(Java虛擬機)的縮寫,JVM是一種用於計算設備的規範,它是一個虛構出來的計算機,是通過在實際的計算機上仿真模擬各種計算機功能來實現的。
Java語言的一個非常重要的特點就是與平臺的無關性。而使用Java虛擬機是實現這一特點的關鍵。一般的高級語言如果要在不同的平臺上運行,至少需要編譯成不同的目標代碼。而引入Java語言虛擬機後,Java語言在不同平臺上運行時不需要重新編譯。Java語言使用Java虛擬機屏蔽了與具體平臺相關的信息,使得Java語言編譯程序只需生成在Java虛擬機上運行的目標代碼(字節碼),就可以在多種平臺上不加修改地運行。Java虛擬機在執行字節碼時,把字節碼解釋成具體平臺上的機器指令執行。這就是Java的能夠“一次編譯,到處運行”的原因。
附圖:
附圖:
3.Java代碼的運行及技術體系
★Java代碼的運行
☉*.java(source code) 源代碼--> javac --> *.class(bytecode) 類文件(字節碼)
◆jvm:
class loader(類加載器),加載程序的類文件及依賴到的其它的類文件至執行引擎運行; 整個運行表現爲一個jvm進程;
◆jvm thread;
◆過程:
利用JDK(調用JAVA API)開發JAVA程序後,通過JDK中的編譯程序(javac)將文本java文件編譯成JAVA字節碼,在JRE上運行這些JAVA字節碼,JVM解析這些字節碼,映射到CPU指令集或OS的系統調用。
★Java技術體系:
Java編程語言
Java Class 文件格式
Java API:Java編程語言中擁有的類庫
Java VM:
★JVM的核心組件:
class loader
執行引擎
★JVM運行時區域:
方法區:線程; 用於存儲被JVM加載的class信息、常量、靜態變量、方法等;
堆:是jvm所管理的內存中佔用空間最大的一部分;也是GC管理的主要區域;存儲對象;
Java棧:線程私有,存儲 線程自己的局部變量;
PC寄存器(程序計數器):線程私有的內存空間,程序的指令指針;
本地方法棧:
4.總結:
★Java 2 SE:JDK
★Java 2 EE:JDK + Servlet, JSP, EJB, JMS, JMX, JavaMail, ...(企業及類庫)
☉商業實現:
BEA(oracle):WebLogic
IBM:WebSphere
Oracle:oc4j
...
Java安裝
★瞭解當前的java環境:
~]# java -version
★OpenJDK 相關程序包
☉java-VERSION-openjdk:
The OpenJDK runtime environment.
☉java-VERSION-openjdk-headless:
The OpenJDK runtime environment without audio and video support.
☉java-VERSION-openjdk-devel:
The OpenJDK development tools.
注意:
多版本並存時,可使用 alternatives命令設定默認使用的版本;
★Oracle JDK:
☉安裝相應版本的rpm包;
jdk-VERSION-OS-ARCH.rpm 例如:jdk-1.8.0_25-linux-x64.rpm
注意:
安裝完成後,要配置JAVA_HOME環境變量,指向java的安裝路徑;
◆OpenJDK:
JAVA_HOME=/usr
◆Oracle JDK:
JAVA_HOME=/usr/java/jdk_VERSION
export PATH=$JAVA_HOME/bin:$PATH
演示1:Oracle JDK:
1.下載Orecal官方JDK程序包並安裝
[root@centos7 JDK]# ls jdk-7u79-linux-x64.rpm jdk-8u25-linux-x64.rpm # 下載的程序包 # 安裝1.8版本第25次升級的程序包 [root@centos7 JDK]# rpm -ivh jdk-8u25-linux-x64.rpm Preparing... ################################# [100%] Updating / installing... 1:jdk1.8.0_25-2000:1.8.0_25-fcs ################################# [100%] Unpacking JAR files... rt.jar... jsse.jar... charsets.jar... tools.jar... localedata.jar... jfxrt.jar...
2.安裝後生成的目錄在/usr/java中;
[root@centos7 JDK]# cd [root@centos7 ~]# cd /usr/ [root@centos7 usr]# ls bin etc games i686-w64-mingw32 include java lib lib64 libexec local sbin share src tmp x86_64-w64-mingw32 [root@centos7 usr]# cd java/ [root@centos7 java]# ll total 4 lrwxrwxrwx 1 root root 16 Dec 11 21:04 default -> /usr/java/latest drwxr-xr-x 9 root root 4096 Dec 11 21:04 jdk1.8.0_25 lrwxrwxrwx 1 root root 21 Dec 11 21:04 latest -> /usr/java/jdk1.8.0_25 # 執向的是最新版 [root@centos7 java]# cd latest/ [root@centos7 latest]# ll total 25784 drwxr-xr-x 2 root root 4096 Dec 11 21:03 bin # 二進制程序 -rw-r--r-- 1 root root 3244 Sep 18 2014 COPYRIGHT drwxr-xr-x 4 root root 115 Dec 11 21:03 db drwxr-xr-x 3 root root 125 Dec 11 21:03 include # 頭文件 -rw-r--r-- 1 root root 5025522 Sep 17 2014 javafx-src.zip drwxr-xr-x 5 root root 4096 Dec 11 21:03 jre # 運行環境 drwxr-xr-x 5 root root 4096 Dec 11 21:04 lib -rw-r--r-- 1 root root 40 Sep 18 2014 LICENSE drwxr-xr-x 4 root root 44 Dec 11 21:04 man -rw-r--r-- 1 root root 159 Sep 18 2014 README.html -rw-r--r-- 1 root root 525 Sep 18 2014 release -rw-r--r-- 1 root root 21057306 Sep 18 2014 src.zip -rw-r--r-- 1 root root 110114 Sep 17 2014 THIRDPARTYLICENSEREADME-JAVAFX.txt -rw-r--r-- 1 root root 178400 Sep 18 2014 THIRDPARTYLICENSEREADME.txt [root@centos7 latest]# ll jre total 308 drwxr-xr-x 2 root root 4096 Dec 11 21:03 bin -rw-r--r-- 1 root root 3244 Sep 18 2014 COPYRIGHT drwxr-xr-x 15 root root 4096 Dec 11 21:04 lib -rw-r--r-- 1 root root 40 Sep 18 2014 LICENSE drwxr-xr-x 3 root root 20 Dec 11 21:03 plugin # 插件 -rw-r--r-- 1 root root 46 Sep 18 2014 README -rw-r--r-- 1 root root 110114 Sep 17 2014 THIRDPARTYLICENSEREADME-JAVAFX.txt -rw-r--r-- 1 root root 178400 Sep 18 2014 THIRDPARTYLICENSEREADME.txt -rw-r--r-- 1 root root 955 Sep 18 2014 Welcome.html [root@centos7 latest]# ls bin appletviewer jar javadoc javapackager jconsole jhat jmc jsadebugd jvisualvm pack200 rmiregistry tnameserv xjc ControlPanel jarsigner javafxpackager java-rmi.cgi jcontrol jinfo jmc.ini jstack keytool policytool schemagen unpack200 extcheck java # 主要的程序文件 javah javaws jdb jjs jps jstat native2ascii rmic serialver wsgen idlj javac # 編譯器 javap jcmd jdeps jmap jrunscript jstatd orbd rmid servertool wsimport
3.安裝完成後,要配置JAVA_HOME環境變量,指向java的安裝路徑;
# 沒有配置環境變量前運行版本號 [root@centos7 latest]# bin/java -version java version "1.8.0_25" Java(TM) SE Runtime Environment (build 1.8.0_25-b17) Java HotSpot(TM) 64-Bit Server VM (build 25.25-b02, mixed mode) [root@centos7 latest]# vim /etc/profile.d/java.sh # 配置環境變量 export JAVA_HOME=/usr/java/latest export PATH=$JAVA_HOME/bin:$PATH [root@centos7 ~]# . /etc/profile.d/java.sh # 重讀腳本文件 [root@centos7 ~]# java -version # 直接運行java命令即可 java version "1.8.0_25" Java(TM) SE Runtime Environment (build 1.8.0_25-b17) Java HotSpot(TM) 64-Bit Server VM (build 25.25-b02, mixed mode)
演示2:OpenJDK
1.安裝及查看程序看路徑
[root@centos7 ~]# yum install java-1.8.0-openjdk.x86_64 java-1.8.0-openjdk-devel.x86_64 java-1.8.0-openjdk-headless.x86_64 -y [root@centos7 ~]# rpm -ql java-1.8.0-openjdk /usr/lib/jvm/java-1.8.0-openjdk-1.8.0.65-3.b17.el7.x86_64/jre/bin/policytool /usr/lib/jvm/java-1.8.0-openjdk-1.8.0.65-3.b17.el7.x86_64/jre/lib/amd64/libawt_xawt.so /usr/lib/jvm/java-1.8.0-openjdk-1.8.0.65-3.b17.el7.x86_64/jre/lib/amd64/libjawt.so /usr/lib/jvm/java-1.8.0-openjdk-1.8.0.65-3.b17.el7.x86_64/jre/lib/amd64/libjsoundalsa.so /usr/lib/jvm/java-1.8.0-openjdk-1.8.0.65-3.b17.el7.x86_64/jre/lib/amd64/libsplashscreen.so /usr/share/applications/java-1.8.0-openjdk-1.8.0.65-3.b17.el7.x86_64-policytool.desktop /usr/share/icons/hicolor/16x16/apps/java-1.8.0.png /usr/share/icons/hicolor/24x24/apps/java-1.8.0.png /usr/share/icons/hicolor/32x32/apps/java-1.8.0.png /usr/share/icons/hicolor/48x48/apps/java-1.8.0.png # 可使用 alternatives命令設定默認使用的版本 [root@centos7 ~]# ll /etc/alternatives/java lrwxrwxrwx 1 root root 70 Dec 11 21:44 /etc/alternatives/java -> /usr/lib/jvm/java-1.8.0-openjdk-1.8.0.65-3.b17.el7.x86_64/jre/bin/java # 列出程序指向的路徑 [root@centos7 ~]# alternatives --list libnssckbi.so.x86_64 auto /usr/lib64/pkcs11/p11-kit-trust.so ld auto /usr/bin/ld.bfd print auto /usr/bin/lpr.cups xinputrc auto /etc/X11/xinit/xinput.d/ibus.conf mysqlbug auto /usr/lib64/mysql/mysqlbug cifs-idmap-plugin auto /usr/lib64/cifs-utils/cifs_idmap_sss.so akonadiserverrc auto /etc/xdg/akonadi/akonadiserverrc.mysql mta auto /usr/sbin/sendmail.postfix libwbclient.so.0.12-64 auto /usr/lib64/samba/wbclient/libwbclient.so.0.12 zabbix-proxy auto /usr/sbin/zabbix_proxy_mysql java auto /usr/lib/jvm/java-1.8.0-openjdk-1.8.0.65-3.b17.el7.x86_64/jre/bin/java jre_openjdk auto /usr/lib/jvm/java-1.8.0-openjdk-1.8.0.65-3.b17.el7.x86_64/jre jre_1.8.0 auto /usr/lib/jvm/java-1.8.0-openjdk-1.8.0.65-3.b17.el7.x86_64/jre jre_1.8.0_openjdk auto /usr/lib/jvm/jre-1.8.0-openjdk-1.8.0.65-3.b17.el7.x86_64 javac auto /usr/lib/jvm/java-1.8.0-openjdk-1.8.0.65-3.b17.el7.x86_64/bin/javac java_sdk_openjdk auto /usr/lib/jvm/java-1.8.0-openjdk-1.8.0.65-3.b17.el7.x86_64 java_sdk_1.8.0 auto /usr/lib/jvm/java-1.8.0-openjdk-1.8.0.65-3.b17.el7.x86_64 java_sdk_1.8.0_openjdk auto /usr/lib/jvm/java-1.8.0-openjdk-1.8.0.65-3.b17.el7.x86_64 [root@centos7 ~]# ls -l /bin/java lrwxrwxrwx 1 root root 22 Dec 11 21:44 /bin/java -> /etc/alternatives/java # 始終指向的是真實路徑 [root@centos7 ~]# java -version # 可以直接使用java命令 openjdk version "1.8.0_65" OpenJDK Runtime Environment (build 1.8.0_65-b17) OpenJDK 64-Bit Server VM (build 25.65-b01, mixed mode)
2.聲明JAVA_HOME,不需要聲明環境變量,因爲已經在bin環境下了
[root@centos7 ~]# vim /etc/profile.d/java.sh export JAVA_HOME=/usr [root@centos7 ~]# . /etc/profile.d/java.sh
Java 2 EE:
★CGI:通用網關接口
任何一種編程語言,只要能夠兼容CGI規範,都可以做爲httpd的後端動態網站的執行引擎,無論是C,Java,php,Python,pear等都是通過這種方式來運行的;
httpd能夠自己基於CGI的規範,向後端的應用程序的執行環境代碼發起請求,代碼在運行環境中執行運行之後把結果封裝成響應報文響應給客戶端。
★Servlet
Servlet(Server Applet),全稱Java Servlet,是用Java編寫的服務器端程序。其主要功能在於交互式地瀏覽和修改數據,生成動態Web內容。狹義的Servlet是指Java語言實現的一個接口,廣義的Servlet是指任何實現了這個Servlet接口的類,一般情況下,人們將Servlet理解爲後者。
Servlet運行於支持Java的應用服務器中。從原理上講,Servlet可以響應任何類型的請求,但絕大多數情況下Servlet只用來擴展基於HTTP協議的Web服務器。servlet兼容CGI規範,能接受http請求;
服務器上需要一些程序,常常是根據用戶輸入訪問數據庫的程序。這些通常是使用公共網關接口(Common Gateway Interface,CGI)應用程序完成的。然而,在服務器上運行 Java,這種程序可使用 Java 編程語言實現。在通信量大的服務器上,JavaServlet 的優點在於它們的執行速度更快於 CGI 程序。各個用戶請求被激活成單個程序中的一個線程,而無需創建單獨的進程,這意味着服務器端處理請求的系統開銷將明顯降低。
★JSP: Java Server Page
JSP全名爲Java Server Pages,中文名叫 java服務器頁面,其根本是一個簡化的Servlet設計,它是由Sun Microsystems公司倡導、許多公司參與一起建立的一種動態頁面技術標準。JSP技術有點類似ASP技術,它是在傳統的網頁HTML(標準通用標記語言的子集)文件(*.htm,*.html)中插入Java程序段(Scriptlet)和JSP標記(tag),從而形成JSP文件,後綴名爲(*.jsp)。 用JSP開發的Web應用是跨平臺的,既能在Linux下運行,也能在其他操作系統上運行。
它實現了Html語法中的java擴展(以 <%, %>形式)。JSP與Servlet一樣,是在服務器端執行的。通常返回給客戶端的就是一個HTML文本,因此客戶端只要有瀏覽器就能瀏覽。
Java Servlet是JSP的技術基礎,而且大型的Web應用程序的開發需要Java Servlet和JSP配合才能完成。JSP具備了Java技術的簡單易用,完全的面向對象,具有平臺無關性且安全可靠,主要面向因特網的所有特點。
JSP執行過程
★Web Container(容器):
Servlet container(Servlet+JDK)
JSP
☉Tomcat初現:
Java Web Server:JWS
ASF:JServ
Tomcat 3.x
Tomcat 4.x:Catalina(代碼名稱)
☉商業實現:
WebSphere, WebLogic, Oc4j, Glassfish, Geronimo, JOnAS, JBoss, ...
☉開源實現:
Tomcat, Jetty, Resin, ...
※Tomcat:
爲Java 2 EE技術體系的不完整實現;(只是構建實現了servlet 和 jsp類庫 )
Tomcat:
1.簡介
★百度百科:
Tomcat是Apache 軟件基金會(Apache Software Foundation)的Jakarta 項目中的一個核心項目,由Apache、Sun 和其他一些公司及個人共同開發而成。由於有了Sun 的參與和支持,最新的Servlet 和JSP 規範總是能在Tomcat 中得到體現,Tomcat 5支持最新的Servlet 2.4 和JSP 2.0 規範。因爲Tomcat 技術先進、性能穩定,而且免費,因而深受Java 愛好者的喜愛並得到了部分軟件開發商的認可,成爲目前比較流行的Web 應用服務器。
Tomcat 服務器是一個免費的開放源代碼的Web 應用服務器,屬於輕量級應用服務器,在中小型系統和併發訪問用戶不是很多的場合下被普遍使用,是開發和調試JSP 程序的首選。對於一個初學者來說,可以這樣認爲,當在一臺機器上配置好Apache 服務器,可利用它響應HTML(標準通用標記語言下的一個應用)頁面的訪問請求。實際上Tomcat 部分是Apache 服務器的擴展,但它是獨立運行的,所以當你運行tomcat 時,它實際上作爲一個與Apache 獨立的進程單獨運行的。
訣竅是,當配置正確時,Apache 爲HTML頁面服務,而Tomcat 實際上運行JSP 頁面和Servlet。另外,Tomcat和IIS等Web服務器一樣,具有處理HTML頁面的功能,另外它還是一個Servlet和JSP容器,獨立的Servlet容器是Tomcat的默認模式。不過,Tomcat處理靜態HTML的能力不如Apache服務器。目前Tomcat最新版本爲9.0。
★Tomcat的執行過程及應用環境
Tomcat因爲是由Java語言編寫的,所以要想運行Tomcat首先要轉備好一個JDK環境,然後在JDK之上再部署Tomcat(爲JDK提供了Servlet和Jsp類庫),除此之外Tomcat還自帶了一個類庫,可以使其監聽在8080端口,所以Tomcat又是一個Web服務器。它同httpd一樣可以解析http請求,並根據用戶的請求加載文件之後響應給客戶端;
如果請求的爲一個靜態文件,因爲Tomcat是一個使用Java語言編寫的web服務器,所以可以直接在磁盤上加載資源響應給客戶端;如果爲一個動態資源(JSP),則會加載資源到JDK環境中(Tomcat),先由jasper轉換成Servlet,然後由Servlet提請運行在JVM虛擬機上,最後把運行的結果通過Web服務器響應給客戶端請求;所以,Tomcat就是一個支持動靜資源響應的完整的Web服務器。
當併發請求較低時,Tomcat可以直接響應;但如果當併發請求過大時,爲了保證Tomcat的運行,可以在前端可以部署一個http請求的反代組件(如:HAproxy,nginx),實現動靜分離。即所有的動態資源請求發給後端的多個Tomcat實例,所有的靜態請求發給後端的httpd或者nginx服務器集羣。但是Tomcat通常不直接面向前端(客戶端)請求,而是在Tomcat前端再使用一個httpd反代,即前端的會話請求由http接受,而Tomcat只接受反代過來的請求(動),如果需要提供數據存儲的話後端還需要MySQL,如此一來整個環境就是一個lnamt環境;
因爲Tomcat是由Java語言編寫的,同時,並沒有依賴特權資源,所以,在運行Tomcat時最好不要用管理員的賬戶運行;Tomcat默認監聽的端口爲8080而非80端口,這也是爲什麼在Tomcat的前端要添加一個httpd反代的原因。即:爲了程序執行安全,一般使用普通用戶(Tomcat)來運行Tomcat,這樣一來,Tomcat就無法監聽在80端口之上了,要想基於80端口接受前端的調度請求或者客戶端請求,就要使用一個httpd的反代組件。
2.Tomcat的核心組件
★Tomcat的核心組件:server.xml
★每一個組件都由一個Java“類”實現,這些組件大體可分爲以下幾個類型:
頂級組件: Server
服務類組件:Service
連接器組件:http, https, ajp
容器類: Engine, Host, Context
被嵌套類: valve, logger, realm, loader, manager, ...
集羣類組件:listener, cluster, ...
☉Server
代表整個servlet 容器
☉Service
它由一個或者多個Connector組成,以及一個Engine,負責處理所有Connector所獲得的客戶請求。
☉Connector
一個Connector將在某個指定的端口上監聽客戶請求,並且將獲得的請求交給Engine來處理,從Engine獲得獲得迴應並且返回給客戶。Tomcat有一個典型的Connector,一個直接監聽來自browser的http請求,一個監聽來自其他WebServer的請求。比如8080端口和8009端口就是做這兩個事。
☉Engin
Engine下可以配置多個虛擬主機Virtual Host,每個虛擬主機都有一個域名,當Engine獲得一個請求時,它把該請求匹配到某個Host上,然後把該請求交給該Host來處理,Engine有一個默認虛擬主機,當請求無法匹配到任何一個Host上的時候,將交給該Host來處理。
☉Host
代表一個虛擬主機,每個虛擬主機和某個網絡域名Domain Name相匹配,每個虛擬主機下可以部署一個或者多個WebApp,每個WebApp對應一個Context,每個Context都有一個Context Path,當Host獲得一個請求時,將把該請求匹配到某個Context上,然後把該請求交給該Context來處理。
☉Context
一個Context 對應於一個Web Application,一個Web Application 由一個或者多個Servlet組成,Context在創建的時候將根據配置文件 $CATALINA_HOME/conf/web.xml和$WEBAPP_HOME/WEB-INF/web.xml載入Servlet類。