java发展历史
1995年5月23日,Java语言诞生
1996年1月,第一个JDK-JDK1.0诞生
1996年4月,10个最主要的操作系统供应商申明将在其产品中嵌入JAVA技术
1996年9月,约8.3万个网页应用了JAVA技术来制作
1997年2月18日,JDK1.1发布
1997年4月2日,JavaOne会议召开,参与者逾一万人,创当时全球同类会议规模之纪录
1997年9月,JavaDeveloperConnection社区成员超过十万
1998年2月,JDK1.1被下载超过2,000,000次
1998年12月8日,JAVA2企业平台J2EE发布
1999年6月,SUN公司发布Java的三个版本:标准版(JavaSE,以前是J2SE)、企业版(JavaEE以前是J2EE)和微型版(JavaME,以前是J2ME)
2000年5月8日,JDK1.3发布
2000年5月29日,JDK1.4发布
2001年6月5日,NOKIA宣布,到2003年将出售1亿部支持Java的手机
2001年9月24日,J2EE1.3发布
2002年2月26日,J2SE1.4发布,自此Java的计算能力有了大幅提升
2004年9月30日18:00PM,J2SE1.5发布,成为Java语言发展史上的又一里程碑。为了表示该版本的重要性,J2SE1.5更名为Java SE 5.0
2005年6月,JavaOne大会召开,SUN公司公开Java SE 6。此时,Java的各种版本已经更名,以取消其中的数字“2”:J2EE更名为Java EE,J2SE更名为Java SE,J2ME更名为Java ME
2006年12月,SUN公司发布JRE6.0
2009年4月7日Google App Engine开始支持Java
2009年04月20日,甲骨文74亿美元收购Sun。取得java的版权。
2010年11月,由于甲骨文对于Java社区的不友善,因此Apache扬言将退出JCP。
2011年7月28日,甲骨文发布java7.0的正式版。
2014年3月19日,甲骨文公司发布java8.0的正式版。
主要服务
1.JDBC(Java Database Connectivity)提供连接各种关系数据库的统一接口,作为数据源,可以为多种关系数据库提供统一访问,它由一组用Java语言编写的类和接口组成。JDBC为工具/数据库开发人员提供了一个标准的API,据此可以构建更高级的工具和接口,使数据库开发人员能够用纯Java API 编写数据库应用程序,同时,JDBC也是个商标名。
2.EJB(Enterprise JavaBeans)使得开发者方便地创建、部署和管理跨平台的基于组件的企业应用。
3.Java RMI(Java Remote Method Invocation)用来开发分布式Java应用程序。一个Java对象的方法能被远程Java虚拟机调用。这样,远程方法激活可以发生在对等的两端,也可以发生在客户端和服务器之间,只要双方的应用程序都是用Java写的。
4.Java IDL(Java Interface Definition Language) 提供与CORBA(Common Object Request Broker Architecture)的无缝的互操作性。这使得Java能集成异构的商务信息资源。
5.JNDI(Java Naming and Directory Interface)提供从Java平台到的统一的无缝的连接。这个接口屏蔽了企业网络所使用的各种命名和目录服务。
6.JMAPI(Java Management API)为异构网络上系统、网络和服务管理的开发提供一整套丰富的对象和方法。
7.JMS(Java Message Service)提供企业消息服务,如可靠的消息队列、发布和订阅通信、以及有关推拉(Push/Pull)技术的各个方面。
8.JTS(Java transaction Service)提供存取事务处理资源的开放标准,这些事务处理资源包括事务处理应用程序、事务处理管理及监控。
9.JMF(Java Media Framework API),她可以帮助开发者把音频、视频和其他一些基于时间的媒体放到Java应用程序或applet小程序中去,为多媒体开发者提供了捕捉、回放、编解码等工具,是一个弹性的、跨平台的多媒体解决方案。
10.Annotation(Java Annotation),在已经发布的JDK1.5(tiger)中增加新的特色叫Annotation。Annotation提供一种机制,将程序的元素如:类,方法,属性,参数,本地变量,包和元数据联系起来。这样编译器可以将元数据存储在Class文件中。这样虚拟机和其它对象可以根据这些元数据来决定如何使用这些程序元素或改变它们的行为。
在Java技术中,值得关注的还有JavaBeans,它是一个开放的标准的组件体系结构,它独立于平台,但使用Java语言。一个JavaBean是一个满足JavaBeans规范的Java类,通常定义了一个现实世界的事物或概念。一个JavaBean的主要特征包括属性、方法和事件。通常,在一个支持JavaBeans规范的开发环境(如Sun Java Studio 和IBM VisualAge for Java)中,可以可视地操作JavaBean,也可以使用JavaBean构造出新的JavaBean。JavaBean的优势还在于Java带来的可移植性。EJB (Enterprise JavaBeans) 将JavaBean概念扩展到Java服务端组件体系结构,这个模型支持多层的分布式对象应用。除了JavaBeans,典型的组件体系结构还有DCOM和CORBA,关于这些组件体系结构的深入讨论超出了本书的范围。
11.javaFX Sun刚刚发布了JavaFX技术的正式版,它使您能利用JavaFX 编程语言开发富互联网应用程序(RIA)。JavaFX Script编程语言(以下称为JavaFX)是Sun微系统公司开发的一种declarative,staticallytyped(声明性的、静态类型)脚本语言。JavaFX技术有着良好的前景,包括可以直接调用Java API的能力。因为JavaFXScript是静态类型,它同样具有结构化代码、重用性和封装性,如包、类、继承和单独编译和发布单元,这些特性使得使用Java技术创建和管理大型程序变为可能。
JavaFX从它2007年发布以来,表现一直差强人意。Oracle收购了Sun之后,在JavaFX中投入了大量的精力进行推广和更新。JavaFX比较出名的应用应该是在2010年温哥华冬奥会上,调整了JavaFX中的很多概念,以及重新设计和实现了很多重要组件之后,得到的就是现在的JavaFX 2.0。JavaFX 2.0的beta版已经发布,正式版则定于2010年第3季度发布。JavaFX 2.0的新特性使得开发人员应该需要重新审视它在RIA开发领域中的位置。在很多情况下,JavaFX 2.0也会是不错的选择。
12.JMX(Java Management Extensions,即Java管理扩展)是一个为应用程序、设备、系统等植入 管理功能的框架。JMX可以跨越一系列异构操作系统平台、系统体系结构和网络传输协议,灵活的开发无缝 集成的系统、网络和服务管理应用。
13.JPA(Java Persistence API),JPA通过JDK 5.0注解或XML(标准通用标记语言的子集)描述对象-关系表的映射关系,并将运行期的实体对象持久化到数据库中。
14.JSP(Java Server Pages)是由Sun Microsystems公司倡导、许多公司参与一起建立的一种动态网页技术标准。JSP技术有点类似ASP技术,它是在传统的网页HTML文件(*.htm,*.html)中插入Java程序段(Scriptlet)和JSP标记(tag),从而形成JSP文件(*.jsp)。 用JSP开发的Web应用是跨平台的,既能在Linux下运行,也能在其他操作系统上运行。
J
ava体系结构包括四个独立但相关的技术:
Java程序设计语言
Java class文件格式
Java API
Java VM
用Java语言编译源代码,把它编译成Java Class文件,然后在Java VM中运行class文件;当编写程序时,通过调用类(Java API)中的方法来访问系统资源,而当程序运行时,它通过调用class文件中实现了Java API的方法也满足程序的Java API调用。Java VM和Java API一起组成了一个“平台”,所有Java程序都在其上编译和运行,因此,它们有时也被称作Java运行时环境。
Java VM的主要任务是装载class文件并且执行其中的字节码。Java VM包含一个类装载器(class loader),它可以从程序和API装载class文件;而Java API的类只在程序执行中需要时才会被装载。
Java字节码由执行引擎来执行。而不同的Java VM中,其执行引擎的实现可能各不相同。最简单的执行引擎不是一次性解释字节码,而另一种称为“即时编译器(just-in-time compiler)”的执行引擎执行速度更快,但要消耗更多的内存资源。即时编译模式下,第一次被执行的字节码会被编译成本地机器代码并缓存下来以实现“复用”。第三种执行引擎是所谓的自适应优化器,此种方法中,虚拟机始的时候解释字节码,介是会监视运行中程序的活动,并且记录下使用最频繁的代码。程序运行时,虚拟机只把那些活动最频繁的代码编译成本地代码,而不频繁的代码则仍然保留为字节码由虚拟机解释执行。自适应优化器可以使得Java VM在80%-90%的时间里执行被优化过的本地代码,而只需要编译10%-20%对性能有影响的代码。最后一种虚拟机由硬件芯片构成,它用本地方法执行Java字节码,其执行引擎内嵌于芯片中。
Sun公司创建了第一个Servlet容器,即Java Web Server, 但JWS只是为了演示Servlet的相应功能,所以其很不稳定。与此同时,ASF创建了JServ项目,一个能够与apache整合起来的servlet容器。1999年,Sun把JWS捐给了ASF,于是两个项目合二为一,即今天Tomcat的前身。第一个tomcat版本是Tomcat 3.x系列,而发布于2001年Tomcat4.0则是在此前基础上进行了重新设计和实现,其代码项目被命名为Catalina。目前最新的版本则是8.x系列。
Java SE则包含了Java二进制程序(如JVM和Java字节码编译器)和Java的核心代码库,而Jave EE标准则包含了一组适用于创建企业级Web应用程序的API。Jave EE建立在Java SE的基础上,并依赖于Java SE才能正常工作。当然,任何级别的应用程序均能从Java EE中获益,但Jave EE却更适合解决大型软件系统设计中的问题。
JAVA EE包含多个独立的API,Servlet和JSP就是其中的两个,而JAVA EE中著名的API中还包含如下的几个:
JAVA EE APIs:
EJB(Enterprise JavaBeans):JAVA相关的诸多高级功能的实现,如RMI(Remote Method Invocation), 对象/关系映射,跨越多个数据源的分布式事务等;
JMS(Java Message Service):高性能异步消息服务,实现JAVA EE应用程序与非JAVA程序的“透明”通信;
JMX(Java Management Extensions):在程序运行时对其进行交互式监控和管理的机制;
JTA(Java Transaction API):允许应用程序在自身的一个或多个组件中平滑地处理错误的机制;
JavaMail:通过工业标准的POP/SMTP/IMAP协议发送和接收邮件的机制;
JVM运行时:运行为多个线程
方法区:共享,虚拟机加载的类、常量、静态变量;
堆:对象存放区域,是jvm管理的内存中最大的一部分;也是GC管理的主要区域;
java栈:线程私有,存放线程的局部变量等信息;
pc寄存器:程序代码的指示器,下一次运行代码的指针空间;线程独占的内存空间;
本地方法栈:依赖于本地方法
tomcat的主配置文件:
组件:由java类实现;有些组件实现的方式不止一种;有些组件可以实现嵌套别的组件;
顶级类组件:server(代表一个tomcat实例)
服务类组件:service(connector与engine相互关联)
容器类组件:engine(代表一个web container), host, context,tomcat核心组件,运行Jsp或servelet代码
连接器组件:connector,接收并解析用户请求,并将请求映射为engine中运行的代码,将结果映射为响应报文;
http, ssl, ajp(apache jserv protocol)
host:相当于httpd的虚拟主机,
context:相当于httpd的alias
被嵌套类组件:valve, logger, realm
一个connector只能属于一个engine;一个engine可以有多个connector;一个service只能有一个engine,可以有多个connector;
一、下载jdk
官方下载地址:http://www.oracle.com/technetwork/java/javase/downloads/index.html
二、linux安装jdk
[root@localhost ~]# ls anaconda-ks.cfg Desktop icbc_auto_platform jdk-8u131-linux-x64.rpm mysql-5.6.13-linux-glibc2.5-x86_64 Public tornado-3.1.0 apache-tomcat-6.0.53.tar.gz Documents install.log main mysql-5.6.13-linux-glibc2.5-x86_64.tar.gz static v3.1.0.tar.gz demo Downloads install.log.syslog Music Pictures Templates Videos [root@localhost ~]#rpm -ivh jdk-8u131-linux-x64.rpm [root@localhost ~]# rpm -qa | grep jdk jdk1.8.0_131-1.8.0_131-fcs.x86_64 [root@localhost ~]# rpm -ql jdk1.8.0_131-1.8.0_131-fcs.x86_64 #查看jdk安装路径 /usr/java/jdk1.8.0_131/lib/missioncontrol/plugins/com.jrockit.mc.rjmx_5.5.1.172852/icons /usr/java/jdk1.8.0_131/lib/missioncontrol/plugins/com.jrockit.mc.rjmx_5.5.1.172852/icons/console_view.png /usr/java/jdk1.8.0_131/lib/missioncontrol/plugins/com.jrockit.mc.rjmx_5.5.1.172852/icons/date-span-16.png /usr/java/jdk1.8.0_131/lib/missioncontrol/plugins/com.jrockit.mc.rjmx_5.5.1.172852/icons/day-of-week-16.png /usr/java/jdk1.8.0_131/lib/missioncontrol/plugins/com.jrockit.mc.rjmx_5.5.1.172852/icons/diagnostic-command-16.png /usr/java/jdk1.8.0_131/lib/missioncontrol/plugins/com.jrockit.mc.rjmx_5.5.1.172852/icons/hprof-16.png /usr/java/jdk1.8.0_131/lib/missioncontrol/plugins/com.jrockit.mc.rjmx_5.5.1.172852/icons/send-email-16.png /usr/java/jdk1.8.0_131/lib/missioncontrol/plugins/com.jrockit.mc.rjmx_5.5.1.172852/icons/time-span-16.png /usr/java/jdk1.8.0_131/lib/missioncontrol/plugins/com.jrockit.mc.rjmx_5.5.1.172852/lib /usr/java/jdk1.8.0_131/lib/missioncontrol/plugins/com.jrockit.mc.rjmx_5.5.1.172852/lib/dsn.jar /usr/java/jdk1.8.0_131/lib/missioncontrol/plugins/com.jrockit.mc.rjmx_5.5.1.172852/lib/gimap.jar /usr/java/jdk1.8.0_131/lib/missioncontrol/plugins/com.jrockit.mc.rjmx_5.5.1.172852/lib/imap.jar /usr/java/jdk1.8.0_131/lib/missioncontrol/plugins/com.jrockit.mc.rjmx_5.5.1.172852/lib/mailapi.jar /usr/java/jdk1.8.0_131/lib/missioncontrol/plugins/com.jrockit.mc.rjmx_5.5.1.172852/lib/pop3.jar [root@localhost ~]# cd /usr/java/ # jdk独特的安装路径/usr/java [root@localhost java]# ls default jdk1.8.0_131 latest [root@localhost java]# ll total 4 lrwxrwxrwx. 1 root root 16 May 29 04:53 default -> /usr/java/latest drwxr-xr-x. 9 root root 4096 May 29 04:53 jdk1.8.0_131 lrwxrwxrwx. 1 root root 22 May 29 04:53 latest -> /usr/java/jdk1.8.0_131 [root@localhost java]# cd /usr/java/jdk1.8.0_131/ [root@localhost jdk1.8.0_131]# ll total 25884 drwxr-xr-x. 2 root root 4096 May 29 04:53 bin -rw-r--r--. 1 root root 3244 Mar 15 01:32 COPYRIGHT drwxr-xr-x. 4 root root 4096 May 29 04:53 db drwxr-xr-x. 3 root root 4096 May 29 04:53 include -rwxr-xr-x. 1 root root 5097105 Mar 14 21:39 javafx-src.zip drwxr-xr-x. 5 root root 4096 May 29 04:53 jre drwxr-xr-x. 5 root root 4096 May 29 04:53 lib -rw-r--r--. 1 root root 40 Mar 15 01:32 LICENSE drwxr-xr-x. 4 root root 4096 May 29 04:53 man -rw-r--r--. 1 root root 159 Mar 15 01:32 README.html -rw-r--r--. 1 root root 526 Mar 15 01:32 release -rw-r--r--. 1 root root 21115141 Mar 15 01:32 src.zip -rwxr-xr-x. 1 root root 63933 Mar 14 21:39 THIRDPARTYLICENSEREADME-JAVAFX.txt -rw-r--r--. 1 root root 177094 Mar 15 01:32 THIRDPARTYLICENSEREADME.txt [root@localhost jdk1.8.0_131]#
三、配置java环境变量
[root@localhost bin]# vi /etc/profile.d/java.sh [root@localhost bin]# cat /etc/profile.d/java.sh #jdk环境变量配置文件 export JAVA_HOME=/usr/java/latest export PATH=$JAVA_HOME/bin:$PATH [root@localhost bin]# . /etc/profile.d/java.sh # 重读配置文件 [root@localhost 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 HotSpot虚拟机 [root@localhost bin]#
四、下载tomcat
官方下载地址:http://tomcat.apache.org
二、linux解压tomcat源码
[root@localhost ~]# ls anaconda-ks.cfg Desktop icbc_auto_platform jdk-8u131-linux-x64.rpm mysql-5.6.13-linux-glibc2.5-x86_64 Public tornado-3.1.0 apache-tomcat-6.0.53.tar.gz Documents install.log main mysql-5.6.13-linux-glibc2.5-x86_64.tar.gz static v3.1.0.tar.gz demo Downloads install.log.syslog Music Pictures Templates Videos [root@localhost ~]# tar xf apache-tomcat-6.0.53.tar.gz -C /usr/local/ # 将源码解压到/usr/local路径 [root@localhost ~]# cd /usr/local/ [root@localhost local]# ls apache-tomcat-6.0.53 bin etc games gcc include info lib lib64 libexec man mysql python27 sbin share src [root@localhost local]# ln -sv apache-tomcat-6.0.53 tomcat # 创建链接tomcat `tomcat' -> `apache-tomcat-6.0.53' [root@localhost local]# ll total 64 drwxr-xr-x. 9 root root 4096 May 29 05:11 apache-tomcat-6.0.53 lrwxrwxrwx. 1 root root 20 May 29 05:12 tomcat -> apache-tomcat-6.0.53 [root@localhost local]# cd tomcat/ [root@localhost tomcat]# ll total 116 drwxr-xr-x. 2 root root 4096 May 29 05:11 bin #脚本及启动相关类 drwxr-xr-x. 3 root root 4096 May 29 05:32 conf # 配置文件 drwxr-xr-x. 2 root root 4096 May 29 05:11 lib # 类库 -rw-r--r--. 1 root root 56685 Apr 2 00:29 LICENSE drwxr-xr-x. 2 root root 4096 May 29 05:32 logs #日志文件 -rw-r--r--. 1 root root 807 Apr 2 00:29 NOTICE -rw-r--r--. 1 root root 9124 Apr 2 00:29 RELEASE-NOTES -rw-r--r--. 1 root root 16220 Apr 2 00:29 RUNNING.txt drwxr-xr-x. 2 root root 4096 May 29 05:11 temp #临时目录 drwxr-xr-x. 7 root root 4096 Apr 2 00:29 webapps # 应用程序默认部署目录 drwxr-xr-x. 3 root root 4096 May 29 05:32 work #工作目录 You have new mail in /var/spool/mail/root [root@localhost tomcat]#
五、配置tomcat环境变量
[root@localhost tomcat]# vim /etc/profile.d/tomcat.sh [root@localhost tomcat]# cat /etc/profile.d/tomcat.sh #配置tomcat环境变量 export CATALINA_HOME=/usr/local/tomcat export PATH=$CATALINA_HOME/bin:$PATH [root@localhost tomcat]# . /etc/profile.d/tomcat.sh #重读tomcat配置文件 [root@localhost tomcat]# version.sh #验证tomcat环境变量配置成功 Using CATALINA_BASE: /usr/local/tomcat Using CATALINA_HOME: /usr/local/tomcat Using CATALINA_TMPDIR: /usr/local/tomcat/temp Using JRE_HOME: /usr/java/latest Using CLASSPATH: /usr/local/tomcat/bin/bootstrap.jar Server version: Apache Tomcat/6.0.53 Server built: Apr 2 2017 07:25:00 UTC Server number: 6.0.53.0 OS Name: Linux OS Version: 2.6.32-504.el6.x86_64 Architecture: amd64 JVM Version: 1.8.0_131-b11 # jvm版本 JVM Vendor: Oracle Corporation [root@localhost tomcat]# ls bin/ # .sh脚本可以直接运行 或 catalina.sh + 命令 使用 bootstrap.jar catalina-tasks.xml cpappend.bat digest.sh shutdown.bat startup.sh tool-wrapper.bat version.sh catalina.bat commons-daemon.jar daemon.sh setclasspath.bat shutdown.sh tomcat-juli.jar tool-wrapper.sh catalina.sh commons-daemon-native.tar.gz digest.bat setclasspath.sh startup.bat tomcat-native.tar.gz version.bat [root@localhost tomcat]# catalina.sh version Using CATALINA_BASE: /usr/local/tomcat Using CATALINA_HOME: /usr/local/tomcat Using CATALINA_TMPDIR: /usr/local/tomcat/temp Using JRE_HOME: /usr/java/latest Using CLASSPATH: /usr/local/tomcat/bin/bootstrap.jar Server version: Apache Tomcat/6.0.53 Server built: Apr 2 2017 07:25:00 UTC Server number: 6.0.53.0 OS Name: Linux OS Version: 2.6.32-504.el6.x86_64 Architecture: amd64 JVM Version: 1.8.0_131-b11 JVM Vendor: Oracle Corporation [root@localhost tomcat]#
六、启动tomcat,默认再8080端口
[root@localhost tomcat]# catalina.sh --help #查看帮助 Using CATALINA_BASE: /usr/local/tomcat Using CATALINA_HOME: /usr/local/tomcat Using CATALINA_TMPDIR: /usr/local/tomcat/temp Using JRE_HOME: /usr/java/latest Using CLASSPATH: /usr/local/tomcat/bin/bootstrap.jar Usage: catalina.sh ( commands ... ) commands: debug Start Catalina in a debugger debug -security Debug Catalina with a security manager jpda start Start Catalina under JPDA debugger run Start Catalina in the current window run -security Start in the current window with security manager start Start Catalina in a separate window start -security Start in a separate window with security manager stop Stop Catalina, waiting up to 5 seconds for the process to end stop n Stop Catalina, waiting up to n seconds for the process to end stop -force Stop Catalina, wait up to 5 seconds and then use kill -KILL if still running stop n -force Stop Catalina, wait up to n seconds and then use kill -KILL if still running version What version of tomcat are you running? Note: Waiting for the process to end and use of the -force option require that $CATALINA_PID is defined [root@localhost tomcat]# #注意:tomcat默认开启在8080端口 [root@localhost tomcat]# ss -tnl State Recv-Q Send-Q Local Address:Port Peer Address:Port LISTEN 0 128 :::22 :::* LISTEN 0 128 *:22 *:* LISTEN 0 128 127.0.0.1:631 *:* LISTEN 0 128 ::1:631 :::* LISTEN 0 100 ::1:25 :::* LISTEN 0 100 127.0.0.1:25 *:* LISTEN 0 80 :::3306 :::* [root@localhost tomcat]# [root@localhost tomcat]# catalina.sh start #运行tomcat Using CATALINA_BASE: /usr/local/tomcat Using CATALINA_HOME: /usr/local/tomcat Using CATALINA_TMPDIR: /usr/local/tomcat/temp Using JRE_HOME: /usr/java/latest Using CLASSPATH: /usr/local/tomcat/bin/bootstrap.jar [root@localhost tomcat]# ss -tnl LISTEN 0 100 :::8080 :::* [root@localhost tomcat]# ss -tnlp State Recv-Q Send-Q Local Address:Port Peer Address:Port LISTEN 0 100 :::8080 :::* users:(("java",13729,41)) # java程序监听,而不是tomcat监听 [root@localhost tomcat]# ps -aux root 13729 4.0 14.0 2140400 68480 pts/0 Sl 05:32 0:02 /usr/java/latest/bin/java -Djava.util.logging.config.file=/usr/local/tomcat/conf/logging. # java传递具体的参数启动tomcat程序 root 13749 0.0 0.2 110240 1136 pts/0 R+ 05:33 0:00 ps -aux [root@localhost tomcat]# #验证:成功打开浏览器, http://localhost:8080
七、tomcat的目录结构:
bin: 脚本及启动时用到类;
lib:类库;
conf:配置文件;
logs:日志文件;
webapps:webapp的默认部署目录;
work:工作目录;
temp:临时文件目录;
八、tomcat的配置文件:
[root@localhost tomcat]# ll conf/ total 204 drwxr-xr-x. 3 root root 4096 May 29 05:32 Catalina -rw-------. 1 root root 10572 Apr 2 00:29 catalina.policy -rw-------. 1 root root 3765 Apr 2 00:29 catalina.properties -rw-------. 1 root root 1395 Apr 2 00:29 context.xml -rw-------. 1 root root 3290 Apr 2 00:29 logging.properties -rw-------. 1 root root 6824 Apr 2 00:29 server.xml -rw-------. 1 root root 1950 Apr 2 00:29 tomcat-users.xml -rw-------. 1 root root 164845 Apr 2 00:29 web.xml [root@localhost tomcat]# #server.xml:主配置文件; #context.xml:每个webapp都可以有专用的配置文件,这些配置文件通常位于webapp程序目录下的WEB-INF目录中,用于定义会话管理顺、JDBC等 ;conf/context.xml是为各webapp提供默认配置 #web.xml:每个webapp只有在“部署”之后才能够被访问;此文件则用于为各webapps定义默认的部署操作方式; #tomcat-users.xml:用户认证的账号和密码配置文件; #catalina.policy:当使用-security选项来启动tomcat实例时会读取此配置文件来实现基于安全策略的运行方式; #catalina.properties:Java属性的定义文件,用于设定类加载器路径等 ,以及一些与JVM性能相关的调优参数; #logging.properties:日志系统相关的配置;
九、tomcat的组件:
#每个组件,均有java类来实现;此些组件可分为如下几类: #顶级组件:Server #服务类:Service #连接器:http, https, ajp(apache jserv protocol) #容器类:Engine, Host, Context #被嵌套的组件:valve, logger, realm, loader, manager #集群类组件:listener, ... ...
Java Webapp的组织结构:
有特定的组织形式、层次型的目录结构;主要包含了servlet代码文件、JSP页面文件、类文件、部署描述符文件等 ;
/:webapps的根目录 index.jsp:jsp的主页面文件 WEB-INF/:当前webapp的私有资源目录,通常存放当前webapp自用的web.xml; META-INF/:当前webapp的私有资源目录,通常存储当前webapp自用的context.xml; classes/: 当前webapp的私有类; lib/:当前webapp的私有类,被打包成jar格式; webapp归档格式: .war:webapp .jar:EJB的类; .rar:资源适配器; .ear:企业级应用程序;
server.xml主配置文件
[root@localhost tomcat]# cat conf/server.xml# 管理端口号 # 基于内存的认证功能文件 --- service #连接器组件 #连接器,端口号8080,http协议 # AJP连接器,apache jserv protocol,二进制协议;httpd协议,tomcat支持 #engine组件 # 默认虚拟主机 # 定义虚拟主机,相对路径catalina_home; [root@localhost tomcat]#
十、tomcat组件介绍
tomcat 6支持Servlet 2.5和JSP 2.1的规范,它由一组嵌套的层次和组件组成,一般可分为以下四类:
顶级组件:位于配置层次的顶级,并且彼此间有着严格的对应关系;
连接器:连接客户端(可以是浏览器或Web服务器)请求至Servlet容器,
容器:包含一组其它组件;
被嵌套的组件:位于一个容器当中,但不能包含其它组件;
各常见组件:
1、服务器(server):Tomcat的一个实例,通常一个JVM只能包含一个Tomcat实例;因此,一台物理服务器上可以在启动多个JVM的情况下在每一个JVM中启动一个Tomcat实例,每个实例分属于一个独立的管理端口。这是一个顶级组件。
2、服务(service):一个服务组件通常包含一个引擎和与此引擎相关联的一个或多个连接器。给服务命名可以方便管理员在日志文件中识别不同服务产生的日志。一个server可以包含多个service组件,但通常情下只为一个service指派一个server。
连接器类组件:
3、连接器(connectors):负责连接客户端(可以是浏览器或Web服务器)请求至Servlet容器内的Web应用程序,通常指的是接收客户发来请求的位置及服务器端分配的端口。默认端口通常是HTTP协议的8080,管理员也可以根据自己的需要改变此端口。一个引擎可以配置多个连接器,但这些连接器必须使用不同的端口。默认的连接器是基于HTTP/1.1的Coyote。同时,Tomcat也支持AJP、JServ和JK2连接器。
容器类组件:
4、引擎(Engine):引擎通是指处理请求的Servlet引擎组件,即Catalina Servlet引擎,它检查每一个请求的HTTP首部信息以辨别此请求应该发往哪个host或context,并将请求处理后的结果返回的相应的客户端。严格意义上来说,容器不必非得通过引擎来实现,它也可以是只是一个容器。如果Tomcat被配置成为独立服务器,默认引擎就是已经定义好的引擎。而如果Tomcat被配置为Apache Web服务器的提供Servlet功能的后端,默认引擎将被忽略,因为Web服务器自身就能确定将用户请求发往何处。一个引擎可以包含多个host组件。
5、主机(Host):主机组件类似于Apache中的虚拟主机,但在Tomcat中只支持基于FQDN的“虚拟主机”。一个引擎至少要包含一个主机组件。
6、上下文(Context):Context组件是最内层次的组件,它表示Web应用程序本身。配置一个Context最主要的是指定Web应用程序的根目录,以便Servlet容器能够将用户请求发往正确的位置。Context组件也可包含自定义的错误页,以实现在用户访问发生错误时提供友好的提示信息。
被嵌套类(nested)组件:
这类组件通常包含于容器类组件中以提供具有管理功能的服务,它们不能包含其它组件,但有些却可以由不同层次的容器各自配置。
7、阀门(Valve):用来拦截请求并在将其转至目标之前进行某种处理操作,类似于Servlet规范中定义的过滤器。Valve可以定义在任何容器类的组件中。Valve常被用来记录客户端请求、客户端IP地址和服务器等信息,这种处理技术通常被称作请求转储(request dumping)。请求转储valve记录请求客户端请求数据包中的HTTP首部信息和cookie信息文件中,响应转储valve则记录响应数据包首部信息和cookie信息至文件中。
8、日志记录器(Logger):用于记录组件内部的状态信息,可被用于除Context之外的任何容器中。日志记录的功能可被继承,因此,一个引擎级别的Logger将会记录引擎内部所有组件相关的信息,除非某内部组件定义了自己的Logger组件。
9、领域(Realm):用于用户的认证和授权;在配置一个应用程序时,管理员可以为每个资源或资源组定义角色及权限,而这些访问控制功能的生效需要通过Realm来实现。Realm的认证可以基于文本文件、数据库表、LDAP服务等来实现。Realm的效用会遍及整个引擎或顶级容器,因此,一个容器内的所有应用程序将共享用户资源。同时,Realm可以被其所在组件的子组件继承,也可以被子组件中定义的Realm所覆盖。
引擎(Engine):引擎是指处理请求的Servlet引擎组件,即Catalina Servlet引擎,它从HTTPconnector接收请求并响应请求。它检查每一个请求的HTTP首部信息以辨别此请求应该发往哪个host或context,并将请求处理后的结果返回的相应的客户端。严格意义上来说,容器不必非得通过引擎来实现,它也可以是只是一个容器。如果Tomcat被配置成为独立服务器,默认引擎就是已经定义好的引擎。而如果Tomcat被配置为Apache Web服务器的提供Servlet功能的后端,默认引擎将被忽略,因为Web服务器自身就能确定将用户请求发往何处。一个引擎可以包含多个host组件。
Tomcat连接器架构:
基于Apache做为Tomcat前端的架构来讲,Apache通过mod_jk、mod_jk2或mod_proxy模块与后端的Tomcat进行数据交换。而对Tomcat来说,每个Web容器实例都有一个Java语言开发的连接器模块组件,在Tomcat6中,这个连接器是org.apache.catalina.Connector类。这个类的构造器可以构造两种类别的连接器:HTTP/1.1负责响应基于HTTP/HTTPS协议的请求,AJP/1.3负责响应基于AJP的请求。但可以简单地通过在server.xml配置文件中实现连接器的创建,但创建时所使用的类根据系统是支持APR(Apache Portable Runtime)而有所不同。
APR是附加在提供了通用和标准API的操作系统之上一个通讯层的本地库的集合,它能够为使用了APR的应用程序在与Apache通信时提供较好伸缩能力时带去平衡效用。
同时,需要说明的是,mod_jk2模块目前已经不再被支持了,mod_jk模块目前还apache被支持,但其项目活跃度已经大大降低。因此,目前更常用 的方式是使用mod_proxy模块。
如果支持APR:
1、HTTP/1.1:org.apache.coyote.http11.Http11AprProtocol
2、AJP/1.3:org.apache.coyote.ajp.AjpAprProtocol
如果不支持APR:
HTTP/1.1: org.apache.coyote.http11.Http11Protocol
AJP/1.3: org.apache.jk.server.JkCoyoteHandler
连接器协议:
Tomcat的Web服务器连接器支持两种协议:AJP和HTTP,它们均定义了以二进制格式在Web服务器和Tomcat之间进行数据传输,并提供相应的控制命令。
AJP(Apache JServ Protocol)协议:
目前正在使用的AJP协议的版本是通过JK和JK2连接器提供支持的AJP13,它基于二进制的格式在Web服务器和Tomcat之间传输数据,而此前的版本AJP10和AJP11则使用文本格式传输数据。
HTTP协议:诚如其名称所表示,其是使用HTTP或HTTPS协议在Web服务器和Tomcat之间建立通信,此时,Tomcat就是一个完全功能的HTTP服务器,它需要监听在某端口上以接收来自于商前服务器的请求。
十一、自测一个myapp
server.xml文件中可定义的元素非常多,包括Server, Service, Connector, Engine, Cluster, Host, Alias, Context, Realm, Valve, Manager, Listener, Resources, Resource, ResourceEnvRef, ResourceLink, WatchedResource, GlobalNameingResources, Store, Transaction, Channel, Membership, Transport, Member, ClusterListener等。
下面简单介绍几个常用组件:
1、Server组件
如上面示例文件中定义的:
这会让Tomcat6启动一个server实例(即一个JVM),它监听在8005端口以接收shutdown命令。各Server的定义不能使用同一个端口,这意味着如果在同一个物理机上启动了多个Server实例,必须配置它们使用不同的端口。这个端口的定义用于为管理员提供一个关闭此实例的便捷途径,因此,管理员可以直接telnet至此端口使用SHUTDOWN命令关闭此实例。不过,基于安全角度的考虑,这通常不允许远程进行。
Server的相关属性:
className: 用于实现此Server容器的完全限定类的名称,默认为org.apache.catalina.core.StandardServer;
port: 接收shutdown指令的端口,默认仅允许通过本机访问,默认为8005;
shutdown:发往此Server用于实现关闭tomcat实例的命令字符串,默认为SHUTDOWN;
2、Service组件:
Service主要用于关联一个引擎和与此引擎相关的连接器,每个连接器通过一个特定的端口和协议接收入站请求交将其转发至关联的引擎进行处理。困此,Service要包含一个引擎、一个或多个连接器。
如上面示例中的定义:
这定义了一个名为Catalina的Service,此名字也会在产生相关的日志信息时记录在日志文件当中。
Service相关的属性:
className: 用于实现service的类名,一般都是org.apache.catalina.core.StandardService。
name:此服务的名称,默认为Catalina;
3、Connector组件:
进入Tomcat的请求可以根据Tomcat的工作模式分为如下两类:
Tomcat作为应用程序服务器:请求来自于前端的web服务器,这可能是Apache, IIS, Nginx等;
Tomcat作为独立服务器:请求来自于web浏览器;
Tomcat应该考虑工作情形并为相应情形下的请求分别定义好需要的连接器才能正确接收来自于客户端的请求。一个引擎可以有一个或多个连接器,以适应多种请求方式。
定义连接器可以使用多种属性,有些属性也只适用于某特定的连接器类型。一般说来,常见于server.xml中的连接器类型通常有4种:
1) HTTP连接器
2) SSL连接器
3) AJP 1.3连接器
4) proxy连接器
如上面示例server.xml中定义的HTTP连接器:
定义连接器时可以配置的属性非常多,但通常定义HTTP连接器时必须定义的属性只有“port”,定义AJP连接器时必须定义的属性只有"protocol",因为默认的协议为HTTP。以下为常用属性的说明:
1) address:指定连接器监听的地址,默认为所有地址,即0.0.0.0;
2) maxThreads:支持的最大并发连接数,默认为200;
3) port:监听的端口,默认为0;
4) protocol:连接器使用的协议,默认为HTTP/1.1,定义AJP协议时通常为AJP/1.3;
5) redirectPort:如果某连接器支持的协议是HTTP,当接收客户端发来的HTTPS请求时,则转发至此属性定义的端口;
6) connectionTimeout:等待客户端发送请求的超时时间,单位为毫秒,默认为60000,即1分钟;
7) enableLookups:是否通过request.getRemoteHost()进行DNS查询以获取客户端的主机名;默认为true;
8) acceptCount:设置等待队列的最大长度;通常在tomcat所有处理线程均处于繁忙状态时,新发来的请求将被放置于等待队列中;
下面是一个定义了多个属性的SSL连接器:
4、Engine组件:
Engine是Servlet处理器的一个实例,即servlet引擎,默认为定义在server.xml中的Catalina。Engine需要defaultHost属性来为其定义一个接收所有发往非明确定义虚拟主机的请求的host组件。如前面示例中定义的:
常用的属性定义:
defaultHost:Tomcat支持基于FQDN的虚拟主机,这些虚拟主机可以通过在Engine容器中定义多个不同的Host组件来实现;但如果此引擎的连接器收到一个发往非非明确定义虚拟主机的请求时则需要将此请求发往一个默认的虚拟主机进行处理,因此,在Engine中定义的多个虚拟主机的主机名称中至少要有一个跟defaultHost定义的主机名称同名;
name:Engine组件的名称,用于日志和错误信息记录时区别不同的引擎;
Engine容器中可以包含Realm、Host、Listener和Valve子容器。
5、Host组件:
位于Engine容器中用于接收请求并进行相应处理的主机或虚拟主机,如前面示例中的定义:
常用属性说明:
1) appBase:此Host的webapps目录,即存放非归档的web应用程序的目录或归档后的WAR文件的目录路径;可以使用基于$CATALINA_HOME的相对路径;
2) autoDeploy:在Tomcat处于运行状态时放置于appBase目录中的应用程序文件是否自动进行deploy;默认为true;
3) unpackWars:在启用此webapps时是否对WAR格式的归档文件先进行展开;默认为true;
1、创建webapp特有的目录结构;
mkdir -pv myapp/{classes,lib,WEB-INF,META-INF}
2、提供webapp的测试页面:
myapp/index.jsp <%@ page language="java" %> <%@ page import="java.util.*" %>JSP Test Page <% out.println("hello world"); %>
[root@localhost webapps]# mkdir myapp/{lib,classes,WEB-INF,META-INF} -pv mkdir: created directory `myapp' mkdir: created directory `myapp/lib' mkdir: created directory `myapp/classes' mkdir: created directory `myapp/WEB-INF' mkdir: created directory `myapp/META-INF' [root@localhost webapps]# tree myapp/ myapp/ ├── classes ├── lib ├── META-INF └── WEB-INF 4 directories, 0 files [root@localhost webapps]# [root@localhost webapps]# ls /usr/local/tomcat/conf/ # webapp默认继承配置文件路径,webapp参考文件 Catalina catalina.policy catalina.properties context.xml logging.properties server.xml tomcat-users.xml web.xml [root@localhost webapps]# [root@localhost tomcat]# tree work/ # 编译结果 work/ └── Catalina └── localhost # 虚拟主机 ├── _ ├── docs ├── examples ├── host-manager ├── manager └── myapp # 项目名 └── org └── apache └── jsp ├── index_jsp.class # 最后转换为.class文件 └── index_jsp.java # jsp转换为java文件 11 directories, 2 files [root@localhost tomcat]#
部署(deploy)webapp的相关操作:
deploy:将webapp的源文件放置于目标目录、配置tomcat服务器能够基于context.xml文件中定义的路径来访问此webapp;将其特有的类通过class loader装载至tomcat:
有两种方式:
自动部署:auto deploy
手动部署:
(1) 冷部署:把webapp复制到tomcat/webapps/,而后才启动tomcat,即可;
(2) 热部署:在不停止tomcat的前提下进行的部署:
部署工具:manager app、ant脚本、tcd(Tomcat Client Deployer)等;
undeploy:反部署,停止webapp,并从tomcat实例上拆除其部署文件和部署名;
stop:停止,不再向用户提供服务;
start:启动处于“停止”状态的webapp;
redeploy:重新部署;
tomcat自带的应用程序:
manager app: webapp管理工具;
host manager: VHosts管理工具;
manager app: webapp管理工具
http://192.168.1.29:8080/manager/html
[root@localhost tomcat]# vim conf/tomcat-users.xml [root@localhost tomcat]# cat conf/tomcat-users.xml[root@localhost tomcat]# http://192.168.1.29:8080/manager/html " roles="manager-gui"/>