第一章 JAVA

一、Java虚拟机的由来

常见编程语言(开发工具),系统级别的有常见的c、c++、go。而应用级别的有c#、ruby、java、python、php、Perl。而这些程序要运行有两种方式,一种是编译,一种是解释,而采用解释就需要有专门的解释器(运行环境)来逐条解释程序源码。但是针对java来说使用的就是虚拟机,称为JVM(c#使用的是CVM)。

在web应用场景中,由于客户端系统版本众多,对于服务器端程序的编译采用了两种方式:客户端编译(源码发送到客户端,有客户端安装编译程序进行编译,早期使用,现在淘汰),服务器端编译(通过CGI接口将前端web请求通过CGI接口发送到后端应用程序服务器,并有后端服务器计算出请求的结果后发送给前端web服务器,有其发送给客户端的形式)。

常见的源码(编程语言)对应的运行环境服务器有:

JSP:TOMCAT、JBOSS、

PHP:PHP-FPM

平台移植

开发工具开发一个程序,通常是在一个系统架构上来进行的比如windows或者linux平台,开发的时候需要调用库文件,而这需要API接口,它的作用就是连接开发工具和库文件。那么依据不同的平台开发的程序通常是不能够跨平台安装的,因为他们的库文件是不同的,那么如何实现跨平台呢,于是有了POSIX,一个标准,用于实现开发出来的程序可以跨平台安装的。

Java的四种技术

Java设计语言

JVM:解释器,虚拟机

Java class 文件格式,源程序编译完成后的程序文件名。*.class

屏幕快照 2017-06-15 上午10.33.21.png

JVM的实现方式:

1、一次性解释器,解释字节码(*.class)

2、即时编译期

3、自适应编译器

常见java虚拟机

Java公司

JDK:java开发组件,开发(编译),JDK包含JRE。

  java+API+JVM,是开发java的最小环境。

JRE:Java运行时环境,运行。

   JVM+Java SE AIP

OpenJDK:开发+运行

java的分类

按应用领域不同:

Java SE:标准版,包含了java二进制程序(字码解释器和JVM虚拟机)和Java的核心代码库(库文件)。它包括的API只有JNDI和JAXP。j2se,第二版,JDK+JAVA API 

Java EE:企业版,建立在Java SE基础之上,程序依赖于SE才能工作,适用于大型项目开发。包含了很多独立的API,其中最著名的就是servlet和jsp,还包括EJB,JMX,JTA等。

Java ME:移动版

Image.png

知识点:

早期java通过applet类程序完成web服务的动态页面功能,这是一种客户端解释程序,需要客户端解析的。后来出现了CGI,实现了服务器端解释动态请求的功能。

servlet技术实质上就是Java公司开发的实现CGI功能的一个技术,目的同样和CGI一样,用于编译执行动态请求。

JSP就是一种动态开发语言,可以像php一样直接将语言嵌套在HTML静态语言中。而解释则需要自己的servlet技术。

tomcat是sun公司将servlet卖给apache公司后,整合出来的程序,用于实现java的虚拟机功能。tomcat包含java se+servlet+jsp。

Java EE的实现:(不同厂家有不同的实现方式)

WebSphere:IBM公司

Weblogic:BEA公司

JBoss:redhat公司

开源实现方式:

Tomcat:apache公司

jetty:轻量级,小型架构

resin:

JSP技术

Java实现动态开发网页的语言,使用.jsp格式,需要转换成.java格式(需要servlet container (servlet 容器)),而.java格式需要转换成.class格式(需要JVM进行转换)。应用程序生成的代码文件存放在/usr/local/tomcat/work目录下以虚拟主机为名称创建目录,并且会先将JSP文件通过jasper翻译成.java文件,然后在通过编译器javac编译成.class文件才可以使用


第二章 Tomcat

一、安装Tomcat

官网下载地址:http://www.oracle.com/technetwork/java/javase/archive-139210.html

我这里使用的是 jdk-8u131-linux-x64.tar,首先需要解压缩,然后移动到/usr/java目录下,然后在/etc/profile.d/目录下创建java.sh文件,并执行。

[root@localhost ~]# tar xf jdk-8u131-linux-x64.tar 

[root@localhost ~]# mv jdk1.8.0_131/ /usr/java/ 

[root@localhost java]# ll

总用量 25884

drwxr-xr-x. 2 uucp 143     4096 3月  15 16:33 bin

-r--r--r--. 1 uucp 143     3244 3月  15 16:32 COPYRIGHT

drwxr-xr-x. 4 uucp 143     4096 3月  15 16:32 db

drwxr-xr-x. 3 uucp 143     4096 3月  15 16:32 include

-rwxr-xr-x. 1 uucp 143  5097105 3月  15 12:39 javafx-src.zip

drwxr-xr-x. 5 uucp 143     4096 3月  15 16:32 jre

drwxr-xr-x. 5 uucp 143     4096 3月  15 16:33 lib

-r--r--r--. 1 uucp 143       40 3月  15 16:32 LICENSE

drwxr-xr-x. 4 uucp 143     4096 3月  15 16:32 man

-r--r--r--. 1 uucp 143      159 3月  15 16:32 README.html

-rw-r--r--. 1 uucp 143      526 3月  15 16:32 release

-rw-r--r--. 1 uucp 143 21115141 3月  15 16:32 src.zip

-rwxr-xr-x. 1 uucp 143    63933 3月  15 12:39 THIRDPARTYLICENSEREADME-JAVAFX.txt

-r--r--r--. 1 uucp 143   177094 3月  15 16:32 THIRDPARTYLICENSEREADME.txt


[root@localhost java]# cat /etc/profile.d/java.sh 

export JAVA_HOME=/usr/java/

export PATH=$JAVA_HOME/bin:$PATH


[root@localhost java]# . /etc/profile.d/


查看java运行环境及虚拟机状态

[root@localhost java]# 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)


2、Tomcat环境部署

我这里下载使用的是apache-tomcat-8.5.15.tar版本,同样解压缩后移动到指定目录并通过profile.d目录创建配置文件并激活变量。

[root@localhost ~]# tar xf  apache-tomcat-8.5.15.tar 

[root@localhost apache-tomcat-8.5.15]# mv /root/apache-tomcat-8.5.15 /usr/local/tomcat

[root@localhost tomcat]# . /etc/profile.d/tomcat.sh 


配置文件内容:

[root@localhost tomcat]# cat /etc/profile.d/tomcat.sh 

export CATALINA_HOME=/usr/local/tomcat

export PATH=$CATALINA_HOME/bin:$PATH


启动tomcat,可以通过catalina.sh文件启动。实际生产环境要使用tomcat账户启动而不是root账户,安全考虑。

[root@localhost bin]# catalina.sh start

Using CATALINA_BASE:   /usr/local/tomcat

Using CATALINA_HOME:   /usr/local/tomcat

Using CATALINA_TMPDIR: /usr/local/tomcat/temp

Using JRE_HOME:        /usr/java/

Using CLASSPATH:       /usr/local/tomcat/bin/bootstrap.jar:/usr/local/tomcat/bin/tomcat-juli.jar 类加载器,tomcat同样是java的一种类。

Tomcat started.



创建开机启动脚本:/etc/rc.d/init.d/tomcat,并设置“执行”权限,建议不要使用管理员root启动

[root@localhost bin]# cat /etc/rc.d/init.d/tomcat 

#!bin/bash

#Tomcat init-script for linux

#

#

#chkconfig 2345: 96 14

JAVA_HOME=/usr/java/

CATALINA_HOME=/usr/local/tomcat/

export JAVA_HOME CATALINA_HOME

exec $CATALINA_HOME/bin/catalina.sh $*


查看启动项:

tcp        0      0 :::8080                     :::*                        LISTEN      19917/java          


更改监听端口/usr/local/tomcat/conf/server.xml

    <Connector port="80" protocol="HTTP/1.1"


远程管理端口8005,可以远程关闭tomcat服务

简单设置启动服务,并添加+x权限

[root@10 local]# vim /etc/init.d/tomcat


t init script for linux

chkconfig:2345 96 14

JAVA_HOM=/usr/java

CATALINA_HOME=/usr/local/tomcat

export JAVA_HOME CATALINA_HOME

exec $CATALINA_HOME/bin/catalina.sh $*



http://www.cnblogs.com/tinylittlebunny/archive/2012/08/24/2654705.html

二、tomcat架构

1、tomcat架构:

一个tomcat实例(进程)就表现为一个server,server称为”全局容器”。一个server内部要能够解释jsp代码,需要servletcontainer来编译,这个在tomcat中表现为engine(引擎),tomcat要实现客户端访问功能就需要开启监听端口,这个管理监听端口的组件就是connector,这里需要说明一下,如果一个server里面有多个engine,就需要识别connector到底和那个engine进行关联,而这个工作就有service来完成。

一个service里面包含一个engine,connector和service进行关联,而service 和engine进行关联,保证了正确的链接指向。

而引擎本身并不直接对外提供服务,需要引擎内部的host的来完成。一个engine可以有多个hosts,其实就是虚拟主机功能。

参考视频:http://edu.51cto.com/center/course/lesson/index?id=69779

屏幕快照 2017-09-12 下午2.17.10.png

2、各常见组件:

1、服务器(server):tomcat的一个实例,通常一个JVM只能包含一个tomcat实例,因此,一台物理服务器上可以在启动多个jvm的情况下,每个jvm启动一个tomcat实例,每个实例分属于一个独立的管理端口。

2、服务(service):一个服务组件通常包含一个引擎和与此关联的一个或多个连接器,给服务命令可以方便管理员在日志中识别不同服务产生的日志,一个server可以包含多个service组件,但通常只为一个service指派一个组件。

3、连接器(connector):负责链接客户端(浏览器或者web服务器)请求到servlet容器内的web应用程序,通常指的是接收客户发来请求的位置以及服务器端分配的端口。默认端口通常是http协议的8080,管理员可以根据自己的需要更改,一个引擎可以配置多个连接器,但这些连接器必须使用不同的端口,同时,tomcat也支持AJP/JSERV和jk2连接器

4、引擎(engine):引擎值处理请求的servlet引擎组件,即catalina servlet引擎,它检查每一个请求的http首部信息以识别此请求应该发送到那个host或者context,并将请求处理后的结果返回给相应的客户端,严格意义山说,容器不必非要通过引擎来实现,它也可以是一个容器,如果tomcat被配置为一个独立服务器,默认引擎就是可以同时处理web服务请求的功能,而如果tomcat的前端部署了一个独立的web服务器,那么这个引擎就是一个容器,没有处理web请求的功能了。因为web服务器自身就能确定将用户请求发往何处,一个引擎可以包含多个host组件。

5、主机(host):主机组件类似于apache的虚拟主机,但在tomcat中只支持FQDN的“虚拟主机”,一个引擎至少包含一个主机组件。

6、上下文(context):最内层的组件,它表示web应用程序本身,配置一个context最主要的是指web应用程序的根目录,以便servlet容器能够将用户请求发往正确的维护中,context组件也可以包含自定义的错误页,以实现用户访问发生错误时提供友好的提示信息。

7、阀门(valve):用来连接请求并在将其转至目的地之前进行某种操作,类似过滤器。

8、日志记录器(logger):用来记录组件内部的状态信息,可被用于除context之外的任何容器中,日志记录的功能可以被继承,因此,一个引擎级别的logger将会记录引擎内部所有组件的信息,除非某内部组件定义了自己的logger组件。

9、领域(realm):用于用户的认证和授权,在配置一个应用程序时,管理员可以为每个资源或资源组顶一个角色和权限,而这些访问控制功能的生效需要通过realm来实现,realm的认证基于文本文件,数据库、LDAP服务等实现,realm的效用会遍及整个引擎及顶级容器,因此,一个容器内所有的应用程序将共享用户资源,同时realm可以被其所在组件的子组件继承也可以被子组件中定义的realm所覆盖。

3、tomcat的运行方式:

1、独立运行(standalone):整合web功能的引擎

2、容器方式:前端是web服务器,自己作为容器只接受jsp请求


4、应用程序的目录结构

/WEB-INF/web.xml:包含当前webapp的deploy(部署)描述符,如所有的servlets和JSP等动态文件的详细信息,会话超时时间和数据源等,因此,其也通常用于定义当前webapp特有的资源

/WEB-INF/classes:包含所有服务器端类及当前应用程序相关的其他第三方类等。


/WEB-INF/lib:包含JSP所用到的JAR文件



用于tomcat的webapp即可以是由多个独立的文件组成,也可以是jar打包后的单个文件,这些打包后的文件的扩展名可用于判断其内容的类型,如:

EJB通常打包为.jar

webapp通常打包为.war

资源适配器(resource adapters)通常打包为.rar

企业级应用程序通常打包为.ear。它通常是整合的EJB、webapp及资源管理器文件


web服务通常会打包为.ear或.war


于是,到底应该使用展开后的格式还是打包为单个文件的格式呢?这就需要根据需要进行了,一般来说,如果条件满足的情况下,建议使用展开后的格式进行部署,原因有三:

1、需要在将来的某个时候更新应用程序中的某个部分内容时,使用展开后的格式可以避免重新deploy应用程序。

2、期望使用tomcat manager来动态编辑及选择deployment descriptor值


3、应用程序中包含静态文件,而这些文件需要定期更新。


5、项目部署

deploy应用程序所涉及到的操作有哪些?

1、向tomcat实例提供某应用程序源文件,并让服务器将类加载进类加载器中,这样应用程序才可以被用户所使用。

2、redeploy(更新):用于更新deployment后的某应用程序或应用程序的部分内容,当redeploy整个应用程序时,当前应用程序的所有模块都必须要redeploy成功,否则整个webap将会停止

3、stop:卸载当前应用程序的所有类,并停止向用户提供服务,不过,其仍然会保留所有已经deploy的文件及名称,并可用于后续的redeployment或starting

4、start:加载当前应用的类及类加载器,并启动服务

5、undeploy:停止某已经deploy的应用程序,并移除deploy产生的文件及名称配置文件讲解:


知识点:

apr:apache portable runtime

能够让apache工作在不同的平台上,而忽略底层结构的差异。

如果支持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.serer.jkcoyotehandler


6、配置参数说明

valve类组件:

valve类似过滤器,它可以工作在enginehost/context之间,hostcontext之间,以及contextweb应用程序的某资源之间,一个容器内可以建立多个valve,而且valve定义的次序也决定了他们生效的次序,tomcat6中实现了多种不同的valve:

accesslogvalve:访问日志valve

extendeaccessvalve:扩展功能的访问日志valve

JDBCAccesslogvalve:通过JDBC将访问日志信息发送到数据库中

requestDUMPERVALVE:请求转储valve

remoteaddrvalve:基于远程地址的访问控制

remotehostvalve:基于远程主机名称的访问控制

semaphorevalve:用于控制tomcat主机上任意容器上的并发请求数量

jvmroutebindervalve:在配置多个tomcat为以apache通过mod_proxy或者mod_jk作为前端的集群架构中,当期望停止某节点时,可以通过此valve将用此请求定向指备用节点,使用此valve,必须使用jvmroutesessionidbinderlistener。

replicationvalve:专用于tomcat集群架构中,可以在某个请求的session信息发送改变时触发session数据在各个节点间的复制。

singlesiginon:将两个或多个需要对用户进行认证webapp在认证用户时连接在一起,即一次认证即可访问所有连接在一起的webapp。

clustersingleon:对singlesignon的扩展,专用于tomcat集群中,需要结合clustersinglesignonlistener进行工作。


remotehostvalve和remoteaddrvalve可以分别实现基于主机名和ip地址的访问控制,控制本身可以通过allow和deny来进行定义,这有点类似apache的访问控制功能,如下实例:

<context path=“、probe” docbase=“probe”>

  <valve classname=“org.apache.catalina.valves.remoteaddrvalve”

  allow=“127\.0\.0\.1”/>

</context>