编程语言:
- 硬件级:微码编程,汇编语言
- 系统级:C,C++,...
- 应用级:Java,PHP,Python,Ruby,Perl,C#,...
- 程序:指令+数据
- 过程式编程:以指令为中心,数据服务于代码;
- 对象式编程:以数据为中心,指令服务于数据;
- 对象,方法(method)
CGI:Common Gateway Interface,通用网关接口
主要作用:例如在web服务器上,当收到客户端请求时,仅能够从本地加载静态内容返回给客户端;如果需要在服务器端运行一些处理结果,比如让客户端基于post提交表单,传些数据过来,在服务器端能保存下来,存储到数据库中或者存储到文件系统上,这时就需要服务端运行一些代码,而运行代码并不是http或者nginx的能力;
比如要运行java代码,对linux来讲,内核在跑,且内核上有接口,代码就能运行起来;所以使用java 写了一段动态网页放在服务器端,让客户端去请求,是没有问题的,只要java能够跟服务器端的CGI协议通信就行;实际就是java代码里面有个CGI库就可以;
因此,客户端一请求,就发送一个java进程,运行后就结束;再有请求就在那运行一个java进程;
CGI是通用的,背后使用任何一个变成语言,只要支持cgi扩展,能作为cgi交互运行即可;
JAVA发展史:
- java最初是由James Gosling博士领导的绿色计划(Green Project)开始启动,此计划的目的是开发一种能够在各种消费性电子产品(如机顶盒、冰箱、收音机等)上运行的程序架构。这个计划的产品就是Java语言的前身:Oak(橡树)。Oak当时在消费品市场上并不算成功,但随着1995年互联网潮流的兴起,Oak迅速找到了最适合自己发展的市场定位并蜕变成为Java语言。
- 1995年5月23日,由Sun Microsystems公司将Oak语言改名为Java,并且在SunWorld大会上正式发布Java 1.0版本。Java语言第一次提出了“Write Once,Run Anywhere”的口号。
- 1996年,JDK(Java Development kit) 1.0发布,Java语言有了第一个正式版本的运行环境。它包含类库、开发工具(java编译器:javac)以及JVM(Sun Classic VM)
- 1997年,Sun公司发布了JDK1.1;技术代表有:JAR文件格式、JDBC、JavaBeans、RMI。Java语法也有了一定的发展,如内部类(Inner Class)和反射(Reflection)都是在这个时候出现的;
- 1998年发布JDK1.2;代表性技术:EJB,JAVA Plugin,Swing,JIT(java in time)
Sun分拆Java技术为三个方向:- J2SE:Standard Edition
- J2EE:Enterprise Edition
- J2ME:Moble
- 2000年发布JDK,1.3
- 1999:Hotspot VM;
- 2002:JDK 1.4
... - 2006: Sun开源了Java技术,GPL,建立了一个称为OpenJDK组织;
- 2006发布JDK1.6,Sun终结了从JDK 1.2开始已经有8年历史的J2EE、J2SE、J2ME的命名方式,启用Java SE 6、Java EE 6、Java ME 6的命名方式。
- 2009:Oracle公司收购Sun公司;
- 2011年Oracle公司发布Java SE 1.7
- 2014年发布java SE 1.8
java体系结构规范:(见下图)
- java编程语言
- Java Class文件格式
- Java API
-
Java VM
Java程序设计语言、Java虚拟机、JavaAPI类库这三部分统称为JDK(JavaDevelopmentKit),JDK是用于支持Java开发的最小环境。可以把JavaAPI类库中的Java SE API子集和Java虚拟机这两部分统称为JRE(Java Runtime Environment),JRE是支持Java程序运行的标准环境。
Java的核心组件:
- Class Loader
- 执行引擎
Java编程语言的主要特性:
纯面向对象的编程、多线程、结构化错误处理、自动垃圾收集、动态链接、动态扩展、...
- GC:Garbage Collector垃圾收集器
JVM运行时区域:
- 方法区:线程共享;用于存储被JVM加载的class信息、常量、静态变量、方法等;
- Java堆: 是JVM所管理的内存中占用空间最大的一部分;也是GC管理的主要区域;存储对象;
- Java栈:线程私有,存储 线程自己的局部变量;
- PC寄存器:线程私有的内存空间,program counter程序的指令指针;
- 本地方法栈:存放当前系统的C库
Java 2 EE:
- Java 2 SE : JDK
- OpenJDK,OracleJDK
- Java 2 EE: JDK+企业级类库
- 企业级类库:
- CGI: Common Gateway Interface
- Servlet:
- 类库;web app;
- Servlet container,Servlet Engine
- EJB、JMS、JMX、JavaMail、...
- JSP: Java Server Page
- 企业级类库:
TITLE
...
<%
... java code...
%>
基于japsper,将其转换为纯java代码,格式为servlet;
java源代码执行过程:index.java(源代码) --> javac(java编译器) --> index.class (java字节码)--> class loader(执行引擎) --> jvm(java虚拟机)
jsp文件的执行过程:index.jsp --> jasper(jsp引擎) --> index_jsp.java --> javac --> index_jsp.class --> class loader --> jvm
jsp:关键组件是jasper可以把java代码嵌入到html里;跟php一样;
- 企业级类库的实现:
- 商业版:WebSphere(IBM)、 WebLogic(Oracle)、Oc4j(Oracle)、 Glassfish、Geronimo、JOnAS、 JBOSS
- 开源实现:Tomcat(重量)、Jetty(轻量)、Resin
- tomcat主要实现Servlet、jsp、JMX;tomcat就是java编写的;
Tomcat
1.tomcat的安装:
Tomcat安装分两步:
<1>. 安装JDK
-
安装方式一:系统自带的rpm包:
[root@localhost ~]# yum list all *jdk* [root@localhost ~]# yum -y install java-1.7.0-openjdk.x86_64 java-1.7.0-openjdk-devel.x86_64 [root@localhost local]# which java /usr/bin/java [root@localhost local]# ll `which java` lrwxrwxrwx 1 root root 22 Oct 5 21:51 /usr/bin/java -> /etc/alternatives/java [root@localhost local]# ll /etc/alternatives/java lrwxrwxrwx 1 root root 76 Oct 5 21:51 /etc/alternatives/java -> /usr/lib/jvm/java-1.7.0-openjdk-1.7.0.191-2.6.15.4.el7_5.x86_64/jre/bin/java 注:java程序的链接文件,如果1.6/1.7/1.8版本都安装了,则直接修改/etc/alternatives/java链接文件即可; 为了以后能使用$JAVA_HOME找到/usr/bin/,要编辑: [root@localhost local]# vim /etc/profile.d/java.sh export JAVA_HOME=/usr/bin/
-
安装方式二:安装官方Oracle提供的:jdk-8u144-linux-x64.rpm
先到Oracle官网下载jdk:https://www.oracle.com/technetwork/java/javase/downloads/jdk8-downloads-2133151.html
[root@localhost src]# rpm -ivh jdk-8u144-linux-x64.rpm [root@localhost src]# vim /etc/profile.d/java.sh JAVA_HOME=/usr/java/latest PATH=$JAVA_HOME/bin:$PATH export JAVA_HOME PATH [root@localhost src]# . /etc/profile.d/java.sh [root@localhost ~]# ln -svi /usr/java/latest/jre/bin/java /etc/alternatives/java ln: replace ‘/etc/alternatives/java’? y ‘/etc/alternatives/java’ -> ‘/usr/java/latest/jre/bin/java’ [root@localhost ~]# java -version java version "1.8.0_144" Java(TM) SE Runtime Environment (build 1.8.0_144-b01) Java HotSpot(TM) 64-Bit Server VM (build 25.144-b01, mixed mode)
<2>.安装tomcat
-
方式一:系统自带
[root@localhost ~]# yum list all *tomcat* ... jglobus-ssl-proxies-tomcat.noarch 2.1.0-6.el7 epel tomcat.noarch 7.0.76-7.el7_5 updates tomcat-admin-webapps.noarch 7.0.76-7.el7_5 updates web应用管理器 tomcat-docs-webapp.noarch 7.0.76-7.el7_5 updates tomcat-el-2.2-api.noarch 7.0.76-7.el7_5 updates tomcat-javadoc.noarch 7.0.76-7.el7_5 updates tomcat-jsp-2.2-api.noarch 7.0.76-7.el7_5 updates tomcat-jsvc.noarch 7.0.76-7.el7_5 updates tomcat-lib.noarch 7.0.76-7.el7_5 updates tomcat-native.x86_64 1.2.17-1.el7 epel tomcat-servlet-3.0-api.noarch 7.0.76-7.el7_5 updates tomcat-webapps.noarch 7.0.76-7.el7_5 updates 示例web应用 tomcatjss.noarch 7.2.1-7.el7_5 [root@localhost ~]# yum install tomcat tomcat-lib tomcat-admin-webapps tomcat-webapps [root@localhost ~]# systemctl start tomcat.service
使用浏览器访问192.168.43.14:8080
<2>.方式二:官方下载二进制编译包
使用官方程序包:http://tomcat.apache.org/download-70.cgi
下载Binary Distributions中的core栏内的程序包版本就行;为tar.gz (pgp, md5, sha1)
下载:apache-tomcat-7.0.57.tar.gz
]# tar xf apache-tomcat-7.0.57.tar.gz -C /usr/local
]# cd /usr/local
]# ln -sv apache-tomcat-7.0.57 tomcat
]# vim /etc/profile.d/tomcat.sh
CATALINA_BASE=/usr/local/tomcat
PATH=$CATALINA_BASE/bin:$PATH
export CATALINA_BASE PATH
]# . /etc/profile.d/tomcat.sh
]# catalina.sh --help
commands:
debug
debug -security
jpda start
run
run -security
start 启动;
start -security 使用安装管理器启动;
stop
stop n
stop -force
stop n -force
configtest 配置测试;
version
注意:java程序运行时并不需要特权,使用普通用户身份运行即可;所以这就是为什么使用8080端口,因为只有管理员才能使用1023以内的端口;
-
tomcat的目录结构:
- bin:脚本及启动时用到的类
- lib:类库
- conf:配置文件
- logs:日志文件
- webapps:webapp默认的部署目录
- work:工作目录
- temp:临时文件目录
-
tomcat的配置文件
- server.xml:主配置文件
- context.xml:每个webapp都可以有专用的配置文件,这些配置文件通常位于webapp应用程序自己的目录下的META-INF目录中;此context.xml为每个webapp提供默认配置
- web.xml:每个webapp只有在部署后才能访问;这些配置文件通常位于webaoo应用程序自己的目录下的WEB-INF目录中;此文件则用于为各webapps定义默认的部署方式
- tomcat-users.xml:用户认证的账号和密码文件
- catalina.policy:当使用-security选项来启动tomcat实例时,会读取此配置文件来实现基于安全策略的运行方式
- catalina.properties:Java属性定义的文件,用于设定类加载器路径,以及一些与JVM调优相关的参数等
- logging-propeties:日志系统相关的配置
-
Tomcat的核心组件:server.xml
... ... ... ... -
每一个组件都由一个Java“类”实现,这些组件大体可分为以下几个类型:
- 顶级组件:Server
- 服务类组件:Service
- 连接器组件:http, https, ajp(apache jserv protocol)
- 容器类:Engine, Host, Context
- 被嵌套类:valve, logger, realm, loader, manager, ...
- 集群类组件:listener, cluster, ...
-
JSP WebAPP组织结构
-
/
webapps的根目录 -
index.jsp
:主页 -
WEB-INF/
:存放当前webapp的私有资源的目录,通常存放当前webapp自用的web.xml -
META-INF/
:当前webapp的私有资源目录,通常存放当前webapp自用的contex.xml -
classes/
:类文件,存放当前webapp的私有类; -
lib/
:当前webapp的私有类,被打包成jar格式
-
-
webapp归档格式:(webapp文件量会非常大,开发人员开发好后给运维人员,里面会有成千上万个文件;因此常被归档;)
-
.war
:webapp归档 -
.jar
:EJB的类打包文件 -
.rar
:资源适配器类打包文件 -
.ear
:企业级webapp
-
2. 部署一个测试应用myapp
[root@localhost ~]# cd /var/lib/tomcat/webapps #这是yum方式安装后webapp默认部署目录
[root@localhost webapps]# mkdir -pv myapp/{classes,lib,WEB-INF,META-INF} #创建webapp特有的目录结构
[root@localhost webapps]# vim myapp/index.jsp #提供webapp的测试页面
<%@ page language="java" %>
<%@ page import="java.util.*" %>
JSP Test Page
<% out.println("hello world") ;
%>
浏览器访问192.168.43.14:8080/myapp
被部署应用以后,会在对应的work目录下/var/cache/tomcat/work/Catalina/localhost/目录下,每一个应用程序都有单独的目录,如:myapp/org/apache/jsp/index_jsp.java;
其jsp目录下有两个文件一个是由jsper转换之后的servlet源码文件,一个是被complier编译后的类文件index_jsp.class;
查看编译后的类文件:
]# cat work/Catalina/localhost/myapp/org/apache/jsp/index_jsp.java
此文件就是自己定义的页面资源被转换成servlet代码格式;如果没有jsp类库的话,这些代码都得有程序员自己编写;但有了jsp类库就可有jsper实现转换了;
编译结果就是index_jsp.class文件;使用java运行这个class文件是能够单独运行的;当然,class文件所依赖的各种类库有可能需要手动装载;
-
部署(deploy)webapp的相关操作:
-
deploy
:将文本app的源文件放置于目标目录、配置tomcat服务器能够基于context.xml文件中定义的路径来访问此webapp;将其特有的类通过class loader装载至tomcat;
有两种部署方式:- 自动部署:
auto deloy
- 手动部署:
- [1] 冷部署:把webapp复制到指定位置,而后才启动tomcat
- [2] 热部署:不停止tomcat的前提下进行部署;使用部署工具:manager app、ant脚本、tcd(tomcat clent deoloyer)等;
- 自动部署:
-
undeploy
: 反部署,停止webapp,并从tomcat实例上拆除其部分文件和部署名 -
stop
:停止,不在向用户提供服务 -
start
:启动处于停止状态的webapp -
redeploy
:重新部署
-
-
tomcat的两个管理应用
- manager
- host-manager
[root@localhost tomcat]# vim /etc/tomcat/tomcat-users.xml
#添加如下两行:
[root@localhost tomcat]# systemctl restart tomcat
[root@localhost tomcat]# vim /etc/tomcat/tomcat-users.xml
#添加如下两行:
[root@localhost tomcat]# systemctl restart tomcat
-
部署一个商城程序shopxx
<1>.冷部署:]# unzip shopxx-a5-Beta.zip
]# cd /shopxx-v3.0-Beta
]# mv shopxx-3.0Beta/ /usr/local/tomcat/webapps/shopxx
]# systemctl restart tomcat.service
<2>. 使用manager app工具部署:
将shopxx程序包shopxx-3.0Beta解压并放在目录/var/lib/tomcat/webapps下
访问测试:
3. Tomcat常用组件:
- Server组件:tomcat实例,即运行的一个jvm进程;监听于tcp的8005端口接收“SHUTDAOWN”,各server监听的端口不能相同,因此一个物理主机上启动多个server实例时应该使用不同的端口。
- service组件:用于实现将一个或多个connector链接器关联至一个engine;每个service可以包含多个connector,但只能包含一个engine。
- connector组件:主要作用接入用户请求
进入tomcat的请求可分为两类:- 第一,tomcat作为独立的应用程序服务器:standalone(直接由客户端发给tomcat链接器的请求),此时请求将来自于浏览器;浏览器只支持http,https。
- 第二,tomcat作为应用程序服务器(基于反代模式提供服务),请求将来自前端的反代主机;
- httpd:http,https,ajp
- nginx:http,https
- 链接器属性:
-
address
:链接器监听的ip地址;默认省略标识监听本机所有可用ip -
maxThreads
:最大并发链接数,默认150; -
port
:监听的tcp端口; -
protocol
:链接器使用的协议,一般为HTTP/1.1orAJP/1.3; -
redirectPort
:重定向端口 -
connectionTimeout
:连接的超时时长,单位为毫秒,默认为60000 -
enablelookups
:是否通过DNS实现反解;一般都关闭 -
acceptCount
:定义等待队列的长度 -
scheme
:客户端请求时映射的协议类型; -
debug
:是否开启连接器调试功能 -
secure
是否要求在安全模式工作 -
clientAuth
: 是否验证客户端证书 -
sslProtocol=
使用ssl协议版本;一般使用tsl
-
-
Engine:可以被称作容器的组件,是真正意义Servlet的一个实例,即Servlet引擎;默认引擎为catalina,其内部可以又有一个或多个Host组件来定义站点;通常需要通过defaultHost的属性定义默认Host
- 属性:
- name=
- defaultHost=默认虚拟主机
- JvmRoute=
- 属性:
-
Host组件:位于Engine容器中用于接收请求并进行相应处理的主机或虚拟主机。
-
常用属性说明:
- appBase:此Host的webapps目录,及存放非归档的web应用程序的目录或归档后的WAR文件的目录路径;可以使用基于$CATALINA_HOME的相对路径;
- autoDeploy:在Tomcat处于运行状态时放置于appBase目录中的应用程序文件是否自动进行deploy,默认为true
- unpackWars:在启用此webapps时是否对WAR格式的归档文件先进行展开;默认为true。
-
定义实例:
-
-
主机别名定义:如果一个主机有两个或以上的主机名,额外的名称均可以以别名的形式进行定义,如下:
magedu.com
-
Context组件:相当于httpd中的alias,定义访问路径;
- 常用的属性定义:
- docBase:相应的Web应用程序的存放位置;也可以使用相对路径,起始路径为此Context所属Host中appBase定义的路径;切记,docBase的路径名不能与相应的Host中appBase中定义的路径名有包含关系,比如,如果appBase为deploy,而docBase绝不能为deploy-bbs类的名字;
- path:相对于Web服务器根路径而言的URI;如果为空“”,则表示为此webapp的根路径;如果context定义在一个单独的xml文件中,此属性不需要定义;
- reloadable:是否允许重新加载此context相关的Web应用程序的类;默认为false;
示例:
- valve组件:
- 访问控制:
- 访问日志:
- 将tomcat日志格式定义为combined类型:
pattern="%h %l %u %t %r %s %b %D %{Cookie}i %{User-Agent}i %{a}r"
- 访问控制:
- 常用的属性定义: