JAVA包含4个独立且相关的技术:

  1. JAVA程序设计语言(由sun公司的一个团队开发)

  2. JAVA API(一类是由sun公司定义的规范( 只维持了很少一段时间),一类是由JAVA的规范开放组织定义的规范(受欢迎的))



JVM的种类:

  1. Hotspot JVM(sun公司的)

    1. JRE     JVM+java+SE API(java 运行时环境,实现java的运行)

    2. JDK    java+API+JVM,还额外提供一些调试和监控工具等,是用于实现java开发的最小环境(java开发组件,实现java的开发编译及运行)

  2. Open JDK

    1. 开发+运行的开源实现


java应用领域的不同,java分为3类:

  1. JAVA SE(Standard Edition,java的标准版,为中小型应用提供的类库)

  2. JAVA EE(Enterprise  Edition,java的企业版)

  3. JAVA ME(Mobile Edition,企业中用到的很少,一般用android或object C)


java开发的程序要在每一个用户的计算机上都能运行,由于早前对动态网站的迫切需要, 在这种情况下,java在它的类库 当中引入了一个applet(小程序),它能够让html的程序员在他们开发的页面中直接提供一个编译好的applet小程序,这时,只要客户端只要在浏览器中安装了jre插件的话,就能实现让applet在客户端执行,根据客户端本地的运行环境,能将执行结果通过结果显示给用户,由此,动态网页成为了现实。这称为客户端动态网页

        缺点:

                需要客户端配置jre,下载applet插件。对客户端造成了麻烦,需要打开权限允许远程客户端执行一些程序 ,提供jre环境,允许远程用户执行,假如一个恶意的用户开发了一个恶意程序 ,在服务器上的jvm中执行。会对jvm和系统造成危害,后来被cgi技术取代。


CGI协议(通用网关接口):

能够让用户访问某一种特定资源的时候,触发web服务器,让web服务器根据这种协议调用额外的进程来执行这段程序,然后将执行结果格式化成html文档在返回给web服务器,由web服务器在返回给客户端,这就叫CGI。


java的cgi(以java技术实现了cgi。javaAPI的另一种特殊规范):

    servlet:

            能够让用户接受http 请求,能够理解http协议,并且能够将 程序的执行结果以http格式封装起来 通过前端响应给客户端,增加了对http协议的处理能力,这样一来,就能理解http协议和html协议了。

有一个问题是,如果修改了网页源代码,那么需要重新编译。后来用mvc框架对程序分层。并且为了将java代码嵌套在html代码中,在servlet基础上引入了一个新的特殊类jsp。


JSP(Java Server Page,能够让程序猿以嵌入式代码的方式在html中来潜入java代码,从而实现基于java技术的动态网站开发):

    是servlet上的一个特殊类,主要是为了实现网页开发的。虽然可以嵌入了,但实现MVC还需要一步,SSH(structs spring hebernate )模版,开发JSP的一个非常重要的框架。

JSP要执行必须要先通过jasper转换成servlet,最后通过JVM执行,JSP运行性能要比php好得多,而且java比php成熟很多。一般来讲,大型应用,或者对性能有要求的应用都会使用jsp。比如淘宝,早期是php,后来都移植成了JSP。 

 

jsp、servlet和jvm的关系:

jsp——>servlet——>jvm

jasper负责监控jsp内容的改变,并转换成servlet

JDK可以将servlet转换成.class



Servlet Container(包含了JDK又包含JDK本身所不具备的,又能让servlet本身工作起来的额外的组件)容器:

    负责接收CGI传递过来的请求,负责监控本地的java程序是否发生了修改。

    接受前端web服务器的交互,前端有一个web应用程序(负责接收用户的请求),一旦发现用户请求的是一个CGI的内容,开始执行servlet进程,在本地的JVM上执行。



Web Container(包含了web服务器、jasper,servlet相关技术的框架叫做web容器)



java虚拟机不像FastCGI一样为一个请求启动一个CGI进程,因为java启动一个CGI进程要比FastCGI的代价大很多,所以,java支持多线程,为每一个请求在JVM中启动一个线程来处理。


JVM的实现方式:

        1.一次性的解释器(解释字节码并执行,bytecode,解释的过程是将与平台无关的代码解释成与平台相关的代码)

                优点:节省内存,不对解释过的bytecode缓存。节省内存

                缺点:每一次执行都要重新解释一遍,速度慢

        2.即时编译器(将每一个运行的class文件解释成二进制文件,并缓存在内存中 )

                优点:运行速度快,只在第一次运行时解释。

                缺点:要牺牲更多的内存来缓存解释过的二进制。

        3.自适应编译器(内部有一个监控器,利用28原则来加速代码的执行。缓存20%左右的代码,提高80%左右的速度)


JDK的安装:


  1. 安装jdk

[root@localhost src]# tar -zxf jdk-8u60-linux-x64.tar.gz
[root@localhost src]# mkdir -p /usr/local/java/
[root@localhost src]# ln -s /usr/local/src/jdk1.8.0_60 /usr/local/java/jdk


2.设置环境变量

[root@localhost src]# echo -e 'export JAVA_HOME=/usr/local/java/jdk/\nexport PATH=$PATH:$JAVA_HOME/bin' >>/etc/profile.d/java.sh
[root@localhost src]# source /etc/profile.d/java.sh


3.验证

[root@localhost src]# java -version
java version "1.8.0_60"
Java(TM) SE Runtime Environment (build 1.8.0_60-b27)
Java HotSpot(TM) 64-Bit Server VM (build 25.60-b23, mixed mode)

如果出现上面的提示,表示jdk已经安装完成


jdk常用命令:


sun  JDK监控和故障处理工具:

    jps(JVM Process Status Tool),显示系统内所有的Hotspot虚拟机进程的列表信息。

    jstat(JVM Statistics  Monitoring Tool),收集并显示Hotspot虚拟机个方面的运行数据。

    jinfo,显示正在运行的某Hotspot虚拟机配置信息

    jmap,生成某Hotspot虚拟机的内存转储快照。

    

可视化工具:

    jconsole:java的监控与管理控制台

    jvisualm:可视化监控工具,可查看配置。

    


web container(web容器):

实现了java ee所有api的一个应用程序,只要用户在开发的时候基于java ee的api所开发的应用程序就能在 web容器中部署并运行起来,这么一个应用程序就称为web容器。

    

常见的web容器:

    1.websphere

    2.weblogic

    3.oc4j

    4.jboss

    5.jonas

    6.geronimo

    7.glassfish

    8.tomcat

    9.risen


tomcat容器的组成:

    1.tomcat实例(server),可以直接响应http请求,每一个server称为是一个tomcat实例,启动一个tomcat就是启动一个server

    2.tomcat的服务(service),将多个connector关联至一个引擎上去的,一个service内部只能有一个引擎

    3.tomcat的引擎(engine),就是一个servlet container的实现。

    4.tomcat的主机(一个引擎内主机可以有多个,主机内部还可以有contaxt),用来在引擎内部实现虚拟主机的

    5.tomcat的上下文(context),主要功能就是用于定义类似于apache的路径别名。


connector的类型:

  1. http

  2. https

  3. proxy

  4. ajp


tomcat的集群部署方案:

tomcat本身自带web服务器,因为tomcat又要负责http的请求,又需要处理jsp请求,压力很大。在这种情况下,可以使用nginx或apache处理http请求。将动态请求转发给tomcat处理。这样大大的减轻了tomcat的压力。


    1.nginx反向代理+tomcat应用服务器

                将后端的tomcat服务器组通过nginx的upstream模块组合起来,通过负载算法将http协议的方式发往后方的tomcat应用服务器,效率低于apache的apj(二进制的)协议。

 

    2.apache反向代理+tomcat应用服务器

                通过apache的mod_proxy模块的专用apj(apache jserv protocol)协议的方式发往后端的tomcat应用服务器。


tomcat的安装:

[root@localhost src]# tar -zxf apache-tomcat-8.0.27.tar.gz -C /usr/local/src/
[root@localhost src]# ln -s /usr/local/src/apache-tomcat-8.0.27 /usr/local/java/tomcat

配置catalina环境变量:

[root@localhost src]# echo -e 'export CATALINA_HOME=/usr/local/java/tomcat\nexport PATH=$PATH:$CATALINA_HOME/bin' >>/etc/profile.d/tomcat.sh
[root@localhost src]# source /etc/profile.d/tomcat.sh

启动tomcat:

[root@localhost src]# catalina.sh start


编辑tomcat的sysv的启动脚本:

vim /etc/init.d/tomcat
#!/bin/bash
# chkconfig 2345 96 14
# description:  The Apache Tomcat servlet/JSP container.
CATALINA_PID=/usr/local/java/tomcat/logs/tomcat.pid
JAVA_HOME=/usr/local/java/jdk
CATALINA_HOME=/usr/local/java/tomcat
export JAVA_HOME CATALINA_HOME

function restart()
{
    exec $CATALINA_HOME/bin/catalina.sh stop
    sleep 2
    exec $CATALINA_HOME/bin/catalina.sh start
}

case $1 in
restart)
    restart
    ;;
start)
    exec $CATALINA_HOME/bin/catalina.sh $*
    ;;
stop)
    exec $CATALINA_HOME/bin/catalina.sh $*
    ;;
*)
    echo "Usage: $0 |stop|start|restart"
    ;;
esac
chmod +x /etc/init.d/tomcat
chkconfig --add tomcat

tomcat的配置文件:

    1.server.xml:核心配置文件,遵循tomcat的组成部分配置

    2.tomcat-user.xml:定义用户认证的账号密码,基于realm用户认证的配置文件。

    3.web.xml:默认的应用程序部署(将一个web应用程序所依赖到的类装载进JVM)描述符。

    4.context.xml:为上下文提供的配置

    5.catalina.properties:定义应用程序自身属性的配置文件,比如:使用的内存大小,字符串缓冲池大小等等。

    6.logging.properties:定义日志相关的属性,比如:日志级别,日志路径等

    7.catalina.policy:定义tomcat自身的安全策略的,比如:哪些资源能被用户访问,哪些资源不能被用户访问,哪些可以被装载,哪些不能被装载等。