JAVA包含4个独立且相关的技术:
JAVA程序设计语言(由sun公司的一个团队开发)
JAVA API(一类是由sun公司定义的规范( 只维持了很少一段时间),一类是由JAVA的规范开放组织定义的规范(受欢迎的))
JVM的种类:
Hotspot JVM(sun公司的)
JRE JVM+java+SE API(java 运行时环境,实现java的运行)
JDK java+API+JVM,还额外提供一些调试和监控工具等,是用于实现java开发的最小环境(java开发组件,实现java的开发编译及运行)
Open JDK
开发+运行的开源实现
java应用领域的不同,java分为3类:
JAVA SE(Standard Edition,java的标准版,为中小型应用提供的类库)
JAVA EE(Enterprise Edition,java的企业版)
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的安装:
安装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的类型:
http
https
proxy
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自身的安全策略的,比如:哪些资源能被用户访问,哪些资源不能被用户访问,哪些可以被装载,哪些不能被装载等。