JAVA编程语言与Tomcat

编程语言:
  • 硬件级:微码编程,汇编语言
  • 系统级: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编程语言与Tomcat_第1张图片
    java体系结构图.png

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


JAVA编程语言与Tomcat_第2张图片
tomcat.png

<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


JAVA编程语言与Tomcat_第3张图片
tomcat-myapp.png

被部署应用以后,会在对应的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
JAVA编程语言与Tomcat_第4张图片
tomcat-Manager.png
JAVA编程语言与Tomcat_第5张图片
tomcat-Manager2.png
[root@localhost tomcat]# vim /etc/tomcat/tomcat-users.xml 
#添加如下两行:


[root@localhost tomcat]# systemctl restart tomcat
JAVA编程语言与Tomcat_第6张图片
host-manager.png
JAVA编程语言与Tomcat_第7张图片
host-manager2.png
  • 部署一个商城程序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下


    JAVA编程语言与Tomcat_第8张图片
    tomcat-Manager.png
JAVA编程语言与Tomcat_第9张图片
deploy-manager.png

访问测试:


JAVA编程语言与Tomcat_第10张图片
shopxx.png

3. Tomcat常用组件:

JAVA编程语言与Tomcat_第11张图片
tomcat组件图.png

  • 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"

你可能感兴趣的:(JAVA编程语言与Tomcat)