http://www.web008.net

背景知识和设置tomcat

Tomcat系列文章:http://www.cnblogs.com/f-ck-need-u/p/7576137.html**

Tomcat配置(一):背景知识和安装tomcat,背景知识tomcat

本文目录:

  1. 背景知识
     1.1 java和jdk概念
     1.2 jsp、servlet是什么
     1.3 web服务器、web容器、应用程序服务器
     1.4 tomcat体系结构
  2. 安装tomcat
     2.1 安装jdk
     2.2 安装tomcat

  3. 基础背景知识


1.1 java和jdk概念

无论是何种程序,要能在计算机上运行,必须能转换为二进制的机器语言才能和硬件进行交互,在机器语言的上层是汇编语言,再上层是C/C++这样较底层的语言,由于它们严重依赖于平台架构,所有一般只能运行在程序源代码已编译的机器上,可移植性比较差。

Java是一种面向对象的语言,它的层次比C更高一点,层次指的是离硬件更远一点。它将写好的程序文件(.java)通过java编译器javac编译成字节码类型的class文件(.class),在编译过程中涉及词法分析、语法分析、语义分析、字节码生成等过程,最终生成字节码的class文件。class文件是Java的类文件,是编译成功后的字节码文件,字节码由Java虚拟机JVM解释执行,它将每一条字节码送给解释器,再翻译成机器语言,从而在特定的机器上运行。Java通过JVM的方式实现了一次编译到处运行的功能。

即:

源码XXX.java-->javac编译器-->字节码XXX.class-->JVM-->机器语言(依赖于不同平台)-->执行

JRE(Java Runtime Environment)是包含了JVM和其他一些简单功能的JAVA运行环境,它适用于只运行java程序时。JDK(Java Development Kit)比JRE包含了更多东西,它除了能作为JAVA运行环境,还提供了很多用于开发的工具,所以它适用于开发程序时使用。

JAVA SE是java开发标准版,里面有JDK,Java EE是企业版,本质上ee只是比se多提供了几个类库而已。

1. 基础背景知识

1.2 jsp、servlet是什么

在web应用程序上,早期Java的实现方式是服务器端放置应用程序,客户端访问时将其下载到客户端本地并执行,这样不仅不安全,而且要求客户有java运行环境,这种实现方式是applet。

与applet相对的是servlet,但它是服务端程序。后来,java将应用程序放在服务器端,客户端请求此应用程序时,服务端通过servlet类库分析http协议,将请求的应用程序在服务端执行,然后将结果组织起来返回给客户端,但此时servlet能分析的http协议非常简单,且和html的组织方式非常不友好,它要求java程序员首先得懂html开发,于是后来出现了JSP类库。

JSP可以简单的将java代码嵌入在html文档中,它们能够很友好地结合,结合后的文档类型为.jsp文件。当客户端请求应用程序资源时,JSP类库负责解析.jsp文件中的jsp部分并通过jasper组件将其翻译成servlet代码,然后再交由servlet来编译并交给JVM来执行。实际上,jsp和servlet本质上是一样的,jsp类只不过是继承于servlet类并添加了一些和html友好结合的特性,最终它还是要翻译成servlet代码。

事实上,JSP是Servlet的一种特殊形式,每个JSP页面就是一个Servlet实例,Servlet再负责响应用户请求。JSP其实也是Servlet的一种简化,使用JSP时,其实还是使用Servlet,因为Web应用中的每个JSP页面都会由Servlet容器生成对应的Servlet。对于Tomcat而言,JSP页面生成的Servlet放在work路径对应的Web应用下。

1.1 java和jdk概念

无论是何种程序,要能在计算机上运行,必须能转换为二进制的机器语言才能和硬件进行交互,在机器语言的上层是汇编语言,再上层是C/C++这样较底层的语言,由于它们严重依赖于平台架构,所有一般只能运行在程序源代码已编译的机器上,可移植性比较差。

Java是一种面向对象的语言,它的层次比C更高一点,层次指的是离硬件更远一点。它将写好的程序文件(.java)通过java编译器javac编译成字节码类型的class文件(.class),在编译过程中涉及词法分析、语法分析、语义分析、字节码生成等过程,最终生成字节码的class文件。class文件是Java的类文件,是编译成功后的字节码文件,字节码由Java虚拟机JVM解释执行,它将每一条字节码送给解释器,再翻译成机器语言,从而在特定的机器上运行。Java通过JVM的方式实现了一次编译到处运行的功能。

美高梅163888,即:

源码XXX.java-->javac编译器-->字节码XXX.class-->JVM-->机器语言(依赖于不同平台)-->执行

JRE(Java Runtime Environment)是包含了JVM和其他一些简单功能的JAVA运行环境,它适用于只运行java程序时。JDK(Java Development Kit)比JRE包含了更多东西,它除了能作为JAVA运行环境,还提供了很多用于开发的工具,所以它适用于开发程序时使用。

JAVA SE是java开发标准版,里面有JDK,Java EE是企业版,本质上ee只是比se多提供了几个类库而已。

1.3 web服务器、web容器、应用程序服务器

web服务器用于提供web服务,要求能解析http协议,通常认为提供静态内容的服务器是web服务器。如apache httpd、nginx等。

对于java而言,web容器是能提供servlet容器的服务器,它们是等价的概念。常见的有tomcat、weblogic、websphere、jboss。其中tomcat只提供servlet容器,它们在功能上是等价的。除tomcat外,后面3种web容器还提供除servlet容器外的EJB容器,专用于大型分布式程序开发。

应用程序服务器是用于提供应用服务的服务器。这是业务逻辑上的概念划分。更具体一点的说,它提供WEB容器(servlet容器)、EJB容器以及其他功能。

它们之间的关系和功能大致如下:web服务器提供web服务,主要处理http请求并响应给客户端,并可以将动态请求委托给其他程序,如cgi脚本、jsp脚本、asp脚本等进行处理;web容器即servlet容器主要负责处理基于http请求的动态jsp内容;EJB容器主要提供和后端数据库服务、其他服务进行交互的功能;应用服务器通常来说包括servlet容器或EJB容器,它们都运行于支持Java的应用服务器中,因此tomcat/weblogic/websphere/jboss都算是应用服务器。

1.2 jsp、servlet是什么

在web应用程序上,早期Java的实现方式是服务器端放置应用程序,客户端访问时将其下载到客户端本地并执行,这样不仅不安全,而且要求客户有java运行环境,这种实现方式是applet。

与applet相对的是servlet,但它是服务端程序。后来,java将应用程序放在服务器端,客户端请求此应用程序时,服务端通过servlet类库分析http协议,将请求的应用程序在服务端执行,然后将结果组织起来返回给客户端,但此时servlet能分析的http协议非常简单,且和html的组织方式非常不友好,它要求java程序员首先得懂html开发(实际上现在还是如此,java程序员至少要懂简单的html/css/javascript等前端技术),于是后来出现了JSP类库。

JSP可以简单的将java代码嵌入在html文档中,它们能够很友好地结合,结合后的文档类型为.jsp文件。当客户端请求应用程序资源时,JSP类库负责解析.jsp文件中的jsp部分并通过jasper组件将其翻译成servlet的java源代码,然后再编译成class文件并交给JVM来执行。实际上,jsp的本就就是servlet,jsp类只不过是继承于servlet类并添加了一些和html友好结合的特性,最终它还是要翻译成servlet代码。

JSP的本质还是Servlet,每个JSP页面就是一个Servlet对象(当然也可能引用了其他servlet对象),Servlet再负责响应用户的动态请求数据(其实也包括静态数据,因为jasper翻译jsp代码时,静态标签也被翻译到servlet的java源文件中以待输出)。对于Tomcat而言,JSP页面生成的Servlet放在work路径对应的Web应用下。

考虑到tomcat和httpd、nginx等http服务程序的对比,有两点需要明确:

(1).一个java程序只有一个进程,但是可以有多个线程,也就是说java程序的开发是基于线程的。那唯一的进程就是JVM进程,每个应用程序都开启一个JVM进程,根据开发时设计的多线程代码,在这个JVM进程中会启动多个线程。它不像httpd或nginx,能开启多进程(对于tomcat而言,这意味着多个不同的应用程序甚至意味着开启多个tomcat实例)。

(2).tomcat可以处理动态请求,也可以处理静态资源请求。但无论是动态资源,还是静态资源的请求,都是经过servlet处理并响应给客户端的,只不过请求静态资源时使用的是默认的servlet。虽然它能像httpd和nginx一样处理静态资源,但显然,它既要处理动态请求,又要处理静态请求,压力会很大。因此tomcat前一般使用httpd或nginx专门处理静态请求,而动态请求则通过反向代理的方式代理至tomcat。

1.4 tomcat体系结构

tomcat是jdk+servlet(严格地说是+jsp)实现的精简版的java ee,由于它只在jdk的基础上附加了jsp和servlet类库,所以它的应用范围主要是web应用。tomcat项目目前由apache软件基金会维护。

它是一种应用程序服务器,只提供servlet容器,同时还提供apache解析静态HTML,只不过之它的处理能力不如独立的apache服务器。类似的应用程序服务还有websphere/weblogic/jetty/resin/jboss等,它们都是在jdk基础上附加各种类库实现不同程度的java ee(tomcat=jdk+servlet)。

对于tomcat来说,它高度模块化,通过各个组件实现各种功能。它的体系结构如下图所示:

美高梅163888 1

其中:

  • server是顶级类,一个server算是一个tomcat实例,在此层次中可定义tomcat服务的监听端口。
  • service是server下的子组件,用于封装绑定connector和containor,并为它们提供一个名称属性。有了service就可以提供相关的服务,如监听TCP连接请求、处理http请求。注意server是管理整个tomcat实例的层次,它和提供服务没有关系。
  • connector是连接器,定义http协议(默认)以及该协议的监听端口。连接器用于接收客户端请求并将containor处理的数据返回给客户端
  • containor称为容器,它和connector连接器进行绑定。该容器内有4个子容器,包括:engine容器、host容器、context容器、Wrapper容器。容器用于分析、处理请求,并构建响应给connector以发送给客户端。它和connector是tomcat的心脏组件。
  • engine容器定义servlet引擎,用于定义引擎的名称、默认的虚拟主机。引擎用于分析http请求并将请求转发给对应的虚拟主机。
  • host容器用于定义虚拟主机。
  • context容器用于定义webapp,一个context定义一个webapp。它是真正管理servlet容器的层次。
  • wrapper容器对应的是真正的servlet容器,一个wrapper代表一个servlet,它负责管理一个Servlet,包括的Servlet的装载、初始化、执行以及资源回收。Wrapper是最底层的容器,一个context只能包含一个wrapper。在配置文件中,无法配置该容器的属性。

还有一些其他组件,如session管理组件、JMX等。

一个server可以有多个service。一个service可以有多个connector和唯一的containor。containor是容器类,从containor层次开始,真正进入servlet容器相关的过程。它包含了唯一的engine容器,engine容器中包含了一个或多个host容器,host容器中包含了一个或多个context容器,context容器中包含了唯一的wrapper。它们的组织结构大致如下:

<server>
    <service>
        <connector />
        <engine>
            <host>
                <context />
                <context />
            </host>
            <host>
                <context />
            </host>
        </engine>
    </service>

    <service>
         ......
    </service>
</server>

1.3 web服务器、web容器、应用程序服务器

web服务器用于提供web服务,要求能解析http协议,通常认为提供静态内容的服务器是web服务器。如apache httpd、nginx等。

对于java而言,web容器是能提供servlet容器的服务器,它们是等价的概念。常见的有tomcat、weblogic、websphere、jboss。其中tomcat只提供servlet容器,它们在功能上是等价的。除tomcat外,后面3种web容器还提供除servlet容器外的EJB容器,专用于大型分布式程序开发。

应用程序服务器是用于提供应用服务的服务器。这是业务逻辑上的概念划分。更具体一点的说,它提供WEB容器(servlet容器)、EJB容器以及其他功能。

它们之间的关系和功能大致如下:web服务器提供web服务,主要处理http请求并响应给客户端,并可以将动态请求委托给其他程序,如cgi脚本、jsp脚本、asp脚本等进行处理;web容器即servlet容器主要负责处理基于http请求的动态jsp内容;EJB容器主要提供和后端数据库服务、其他服务进行交互的功能;应用服务器通常来说包括servlet容器或EJB容器,它们都运行于支持Java的应用服务器中,因此tomcat/weblogic/websphere/jboss都算是应用服务器。

2. 安装tomcat

tomcat依赖于jdk,所以需要先安装jdk。tomcat和jdk版本之间存在对应关系,应该考虑好要安装哪个版本的jdk以及哪个版本的tomcat。官方给出的对应关系网址为: 9.x版本和jdk的对应表。

美高梅163888 2

本文jdk以jdk-8u131为例,表示版本为8的第131次更新,tomcat以apache-tomcat-8.5.14为例。

1.4 tomcat体系结构

tomcat是jdk+servlet(严格地说是+jsp)实现的精简版的java ee,由于它只在jdk的基础上附加了jsp和servlet类库,所以它的应用范围主要是web应用。tomcat项目目前由apache软件基金会维护。

它是一种应用程序服务器,只提供servlet容器,同时还提供apache解析静态HTML,只不过之它的处理能力不如独立的apache服务器。类似的应用程序服务还有websphere/weblogic/jetty/resin/jboss等,它们都是在jdk基础上附加各种类库实现不同程度的java ee(tomcat=jdk+servlet)。

对于tomcat来说,它高度模块化,通过各个组件实现各种功能。它的体系结构如下图所示:

美高梅163888 3

其中:

  • server是顶级类,一个server算是一个tomcat实例,在此层次中可定义tomcat服务的监听端口。
  • service是server下的子组件,用于封装绑定connector和containor,并为它们提供一个名称属性。有了service就可以提供相关的服务,如监听TCP连接请求、处理http请求。注意server是管理整个tomcat实例的层次,它和提供服务没有关系。
  • connector是连接器,定义http协议(默认)以及该协议的监听端口。连接器用于接收客户端请求并将containor处理的数据返回给客户端
  • containor称为容器,它和connector连接器进行绑定。该容器内有4个子容器,包括:engine容器、host容器、context容器、Wrapper容器。容器用于分析、处理请求,并构建响应给connector以发送给客户端。它和connector是tomcat的心脏组件。
  • engine容器定义servlet引擎,用于定义引擎的名称、默认的虚拟主机。引擎用于分析http请求并将请求转发给对应的虚拟主机。
  • host容器用于定义虚拟主机。
  • context容器用于定义webapp,一个context定义一个webapp。它是真正管理servlet容器的层次。
  • wrapper容器对应的是真正的servlet容器,一个wrapper代表一个servlet,它负责管理一个Servlet,包括的Servlet的装载、初始化、执行以及资源回收。Wrapper是最底层的容器,一个context只能包含一个wrapper。在配置文件中,无法配置该容器的属性。

还有一些其他组件,如session管理组件、JMX等。

一个server可以有多个service。一个service可以有多个connector和唯一的containor。containor是容器类,从containor层次开始,真正进入servlet容器相关的过程。它包含了唯一的engine容器,engine容器中包含了一个或多个host容器,host容器中包含了一个或多个context容器,context容器中包含了唯一的wrapper。它们的组织结构大致如下:

<server>
    <service>
        <connector />
        <engine>
            <host>
                <context />
                <context />
            </host>
            <host>
                <context />
            </host>
        </engine>
    </service>

    <service>
         ......
    </service>
</server>

2.1 安装jdk

下载地址:

以rpm包的为例。

shell> yum localinstall -y jdk-8u131-linux-x64.rpm

安装路径为/usr/java。在该路径有3个文件,其中两个是版本号的软链接。

shell> ll /usr/java
total 4
lrwxrwxrwx 1 root root   16 May  4 22:54 default -> /usr/java/latest
drwxr-xr-x 9 root root 4096 May  4 22:54 jdk1.8.0_131
lrwxrwxrwx 1 root root   22 May  4 22:54 latest -> /usr/java/jdk1.8.0_131

通过这种软链接方式,以后有新版jdk要安装,直接改latest的链接对象即可。

在安装目录的Bin目录下,有很多可执行程序,包括javac(java编译器),java(java主程序,其中包括JVM),jps(查看当前java进程及pid,所以可以查看java进程数)。

shell> ls latest/bin/
appletviewer  idlj  java  javafxpackager  javapackager  jcmd  jdb  jinfo  jmc
jrunscript  jstat  keytool  pack200  rmid  serialver  unpack200  xjc ControlPanel
jar  javac  javah  java-rmi.cgi  jconsole  jdeps  jjs  jmc.ini  jsadebugd  jstatd
native2ascii  policytool  rmiregistry  servertool  wsgen extcheck  jarsigner
javadoc  javap  javaws  jcontrol  jhat  jmap  jps  jstack  jvisualvm  orbd  rmic
schemagen  tnameserv  wsimport

执行java -version可以验证jdk工具是否安装成功。

[root@xuexi jdk1.8.0_131]# bin/java -version
java version "1.8.0_131"
Java(TM) SE Runtime Environment (build 1.8.0_131-b11)
Java HotSpot(TM) 64-Bit Server VM (build 25.131-b11, mixed mode)

然后再设置JAVA_HOME环境变量并导出java程序所在目录的PATH环境变量。

shell> echo 'export JAVA_HOME=/usr/java/latest' > /etc/profile.d/jdk.sh
shell> echo 'export PATH=$JAVA_HOME/bin:$PATH' >> /etc/profile.d/jdk.sh
shell> . /etc/profile.d/jdk.sh

shell> java -version
java version "1.8.0_131"
Java(TM) SE Runtime Environment (build 1.8.0_131-b11)
Java HotSpot(TM) 64-Bit Server VM (build 25.131-b11, mixed mode)

郑重声明:本文版权归美高梅163888所有,转载文章仅为传播更多信息之目的,如作者信息标记有误,请第一时间联系我们修改或删除,多谢。