欢迎各位兄弟 发布技术文章

这里的技术是共享的

You are here

马哥 46_01 _Tomcat系列之java技术详解 有大用

varnish, harproxy, httpd, nginx, mysql, php, tomcat, keepalived, corosync/heartbeat, shell


haproxy+keepalivedy

varnish: 


4w1h: 


Cache: HTTP/1.1

Expire

Cache-Control:

public, private, no-cache, no-store, max-age, s-maxage

Etag

Last-Modified

If-Modified-Since

Vary

If-None-Match


Expire: 

Cache-Control: max-age=


cache_hit rate: 、30/100


cache missing reate: 缓存未命中率


Expire: 10


Cache-Control: max-age=600s


10s: 


600:

Last-Modified: 

304, Not Modified


200, 


Vary: 


auth, private, cookie

a.jpg: 

1: a.jpg 

2: 


if (req.request ~ "\.(jpeg)$") {

unset 

}


varnish: 

vcl_recv

  vcl_hash

  vcl_hit

  vcl_deliver

  vcl_miss

  vcl_fetch

  vcl_pass

  vcl_pipe

  vcl_error




tomcat:

        PHP:

                开发语言:脚本语言,动态语言

                运行环境:解释器解释执行

                        php4时,两个以色列学员为php引入了Zend Engine,使得php变成了两段式,先编译成Opcode,然后再执行,,,因此在同一个php的进程内,同一段代码执行了两次,第一次编译,第二次不用编译的话,速度会大大加快的,,,,但是像apache这种运行方式,每一个用户的请求,它使用一个独立的进程来响应,说明它有自己的进程空间,因此第一个进程编译的结果,第二个进程无法使用,,,,为了提高这个速度,引入了opcode缓存(即Xcache,APC,eAccelerator等)来进行加速,在生产环境中用得较多的是Xcache,

,,,,,,,,,,,,,,,,,但是php本身为了能够实现MVC,(大规模开发,将应用程序的开发分成三层,data layer数据层  Model, bussiness layer 业务层 Controller,presentation layer表示层 View)(分层好处,某一层改了,其它层不必动了)(每一层通过服务的方式向上层提供,上层通过调用接口,调用下层的功能)

                php有很多框架,来实现3层,比如smarty等,

                结合这种框架的语言,尤其适合开发web应用,


C语言: 开发网页坏处,为C引入一个模板,让业务,数据与展示能分开,后端让业务和数据分开是很困难的,另外C语言跨平台性不好,

C/C++与硬件架构,与OS架构, 与CPU,结合得非常紧密,32位编译的程序在64位上无法运行,AMD的CPU换成了PPC的CPU还得重写,最大缺陷是移植困难,,,虽然比汇编语言方便移植多了,但是对于互联网应用来讲,它的架构,操作系统各不相同,所以移植困难,,,,,,,C/C++维护困难(维护成本高),比如某字符写错了,一修改,还得重新编译

C语言的优势,高速,,,,虽然比汇编语言慢,,,,但是比php,java快许多,,,所以C/C++适合开发驱动程序,大规模底层应用,比如开发操作系统,开发数据库,,,,,,很多大型软件都是结合多开种语言来发的,在C中可以嵌入别的程序,在java中可以嵌入C,java中可以嵌入python,python可以嵌入java,可以互相调用,


C/C++刚诞生时,那时成熟的高级语言不多,那时C语言非常流行,(现在C也流行),除了java以外,被程序采用的最多的一种,,,

C比起C++要简单很多,

    C:面向过程

    C++:面向对象


C  program  language,C的作者介绍C使用的基本要点,一两百页,足以介绍C的所有特性,

C++ 类似于指南一样的书,一千页都说不清楚,


面向对象比面向过程更容易构建大型应用程序,

linux内核仍然是C写的,

没有任何语言在任何场景都适合开发的,每种语言都有它适用的场景,


任何一种语言为了开发程序简单,快捷,我们的操作系统都给它提供了API: (Application Programming Interface,应用程序接口,应用编程接口),,,,应用编程接口就是将我们的系统调用 System Call 给它二次封装起来,做成程序员比较便捷的使用函数,可以直接拿来调用,比如有些驱动,不用自己再写了,

操作系统本身就是一个虚拟机OS,它把底层硬件的不同之处,通过一个软件层给我们做了一次抽象,并把这个抽象的结果通过比较容易调用的方式(  System Call ),输出给程序员,程序员借助于 System Call 就能编程了,但是 System Call 过于底层,而且功能过于简陋,(之所以简陋,是由于设计哲学所限定,功能越简陋,它的数目就越少,数目越少,程序员所需要记的东西就越少,,,,,但是由于过于简陋,所以用它来开发,太困难),,,,,所以有了System Call的二次封装API,并不是每一个API中都包括System Call,有些API是纯粹的API,完成一些功能的,里面一个System Call都没有,,,,有些API的库,一个调用了n个System Call,,,,,,


如果操作系统不一样,比如一个底层是windows,另一个是linux,它们的API,是不一样的,所以windows上开发的程序拿到linux上是不能编译的,,,,(利用windows的API开发的程序拿到linux上去编译,是不能编译出来的,,,,编译的过程有个重要的前提是链接,编译必须要检查我们的程序开发中所依赖的调用的每一个库是否存在的,调用的库所遵循的语法是否相同的,,,,所以windows上实现的API与linux上所实现的API是不一样的,,,用windows上API所开发的程序在linux上是不能运行的,是编译不通过的)

为了便于程序的移植性,有了POSIX,(Portable Operating System Interface 可移植操作系统接口),(为了兼容Unix叫法的风格,后面加了个IX)这是一种操作系统编程接口规范,,,只要双方都遵循POSIX规范,在另外一个系统上就能够实现跨平台编译运行了,此时在windows上开发的程序,在linux上编译就能够通过了,就能运行了,,,因为我们的编程接口是一样的,

规范是执行互操作的前提,所以才有了标准组织,如,IEE,IOS,ANSI

Linux API,在Linux上编译compiling,能不能到windows上去运行,它们都是遵循POSIX的,,,,,,是不能在windows上运行的,,,尽管大家都遵循同一种标准的API,但是windows上的动态库都是.dll的,linux上动态库是共享对象.so,所以在windows上编译的进程,是要依赖于.dll的,所以到linux上运行的时候,找.dll是找不到的,,,,,更重要的是,它们的二进制程序格式都不一样,,,,,

例如image.png这里linux上二进制格式是ELF格式,这其实就是可执行程序的格式,,,windows上显然不是这种格式的,

尽管大家的API都一样,但是ABI未必一样, (Application Binary Interface 应用二进制程序接口),windows的二进制程序接口类似于使用.dll这种格式向外输出,而且它的执行格式与linux的执行格式不相同,,,,,,,,,,,所以尽管可以跨平台编译,但是仍然不能跨操作系统运行的,,,,,,,,,,,,除非再引入一种磨合ABI的机制,,,,,如果既实现了跨平台的编译,又提供了一种接口,让它俩的ABI的不同也使用一种标准给它弥合了,给它磨合了二者的不同之处,这时跨平台运行才能成为一种现实的,,,,,,,,java就是这么一种语言



java早期时不叫java,叫oak,橡树,sun公司在上个世界八十年代末九十年代初,为当时实现智能电视(在互联网上能使有的电视)而专门研发的一种语言,智能电视的主要需求是这种语言所开发的程序能够在各种不同硬件的电视平台上都能跑起来,而这个程序的作者,办公室的窗外有一颗高大的橡树,所以定下了oak这个名字,,,oak之外还有一个名字green,可能是橡树很绿,,,先叫green,后叫oak,后来程序员没事坐在咖啡厅里面讨论程序的改进,优化,更好用,咖啡都是盛产在印尼爪哇岛的咖啡,所以叫做java,,,,,,,,,

java最初的目的就是为了实现能够在不同的硬件平台上运行同一种语言所开发的程序的,它的基本着眼点就是跨平台性,,,不同的操作系统就是API兼容,ABI也不兼容,(sun公司的智能电视计划太超前了,java这种语言在智能电视上没有太大的发挥,但是随着http协议的出现,互联网爆炸式发展,使得web开发,web应用,特别需要一种能够跨平台的语言,,,当时html页面都是静态网页,要开发动态站点的话,你的程序得在任何一个客户端(服务器端)运行,必须得跨平台,因为不同的用户使用不同的操作系统,即使同一操作系统,也很可能不同的硬件平台,,,,,,java在这种情景下无心插柳柳成荫)

此后不久,java语言被广泛应用到开发动态小程序上,

java程序重要的几个组件,包含四个独立却又相关的技术

                    Java:是一种程序设计语言

                    Java API:  为了能够让java语言得到更快更高效的开发(C语言为了加速C语言的开发,有了C库),java官方提供了许多的java库,这就叫做java应用程序编程接口

                    Java Class                    程序员使用java开发的源程序编译出来之后,就是字节码格式,被称为java类文件格式(Java Class),,,程序语言所编译出来的二进制格式应该遵循哪种规范,就是由java class文件格式所定义的,java class需要运行在JVM上

                    JVM:  java早期本身得编译成bytecode字节码(类似于php的opcode),,,bytecode与opcode一样,不是真正意义上的二进制,不能直接在操作系统上运行,而必须由java的解释器解释执行,它叫做java的虚拟机,JVM(java virtul machine)

                   

Java程序设计语言,结合java api,开发出来源程序,然后编译后类文件,在JVM上去运行


java执行的流程,如下图,首先是java源程序文件(.java结尾),比如1.java,2.java,这些源程序要想能够执行,必须依赖于java的编译器,(要开发java源代码,要依赖于api和java程序设计语言),,,,java源程序需要编译的(像Zend Engine去编译php一样,),编译器叫做 Java complier(Java C),,,编译完后,就要保存为类文件了,所以1.java,变成了1.class,2.java,变成了2.class,(理解这些东西,是能够理解tomcat运行的基本前提),,,,这些类必须要在JVM中运行,,,(比如我们在linux上开发了一个C程序,C想完全跑起来,是依赖于共享库的,如果缺少共享库,它是跑不起来的,,,以前马哥教的小linux系统,想跑起来,得移植共享库)比如1.class,编译的时候是针对于某个API进行编译的,意味着编译完成以后,是要依赖于这个API对应的二进制格式才能跑起来的,,,因此还需要装载额外的库( API本身所提供的库)才能运行起来,(C库也是一个道理,C库在开发的时候,表现为头文件,运行的时候表现为库文件,,,,开发的时候老是找头文件,头文件里有库的名称,函数,参数的格式,参数类型,参数调用方法,返回值的类型,返回多少值等规范,,,,既然叫库了,意味着里面有很多很多函数,一堆的函数,我们这个程序倒底要用哪个函数,这个函数名叫什么,,,就像shell脚本中写的一样,函数多来没有写过,当然不能调用了,,像我们shell脚本中写的配置文件一样,配置文件必须要导入到当前程序中来,才能用的,source命令,source一个文件,这个文件里面如果有变量,当前这个shell脚本就可以用了),,,,引入公共类库的过程可以称为source过来的过程,只不过我们对于脚本来讲,它本来就是源码的,,但是对于二进制程序来讲,它是库,,这些库必须在运行之前要进行装载,在内存中必得有,否则二进制程序是运行不了的,所以1.class,和2.class也是一个道理,它所依赖的这些库(公共类库,公共类)也必须要装载进来,,,除了公共类以外,我们所开发的程序可能依赖于一些私有类,,,,(写shell脚本的时候,可以直接调用系统提供的库的函数,,我们还可以自己开发函数了,,,,,自己开发的函数,可以认为是私有函数,别人不能调用的),,,,公共类和1.class的私有类必须得装载入JVM中,1.cass这个程序才能运行起来,,,,,,,,,,JVM是专门为某个程序运行所准备的运行环境,,,JVM虽然提供了为每一个class程序运行的平台,但是并不能保证任何一个程序都能运行起来,因为每个class运行所需的库(公共类和私有类)必须得装载入JVM才能运行,,,,,,,,,(就像linux一样,提供给我们一个平台,能够让我们运行程序,但是至于它所依赖的库,你自己能不能加载上,操作系统可不管的,你得自己去负责加载),,,,,,,,,,,,同样的道理,1.class在JVM上运行,1.class自己得明白自己需要依赖哪些库,1.class得手动的自己想办法把这些库加载到JVM上来,如果让程序自己完成加载功能的话比较头疼,,,(linux中就有一个独特的库, 有一个独特的程序,它如果依赖于某个其它库的话,我们的程序可以自动通过一个组件把这个库调用进来,而不是程序自身去完成的,),,,,,,,,,,,,,,,,,,,,,(有个 linux-gate?????从来没有复制过的那个库文件,程序库的入口)

[root@slave ~]# ldd /bin/ls      

        linux-gate.so.1 =>  (0x00390000)      # 这个库从来没有复制过,我们依赖的任何库的时候总能看到它,可以认为这是一个调用库的入口,我们可以通过这个库来调用其它库的

        libselinux.so.1 => /lib/libselinux.so.1 (0x00db7000)

        librt.so.1 => /lib/librt.so.1 (0x00c4b000)

        libcap.so.2 => /lib/libcap.so.2 (0x0014a000)

        libacl.so.1 => /lib/libacl.so.1 (0x0016b000)

        libc.so.6 => /lib/libc.so.6 (0x00a8e000)

        libdl.so.2 => /lib/libdl.so.2 (0x00c27000)

        /lib/ld-linux.so.2 (0x80028000)

        libpthread.so.0 => /lib/libpthread.so.0 (0x00c2e000)

        libattr.so.1 => /lib/libattr.so.1 (0x00df4000)

同样的道理,我们要让JVM方便装载这些类库,也应该提供一些程序,所以java还提供了一个类加载器(因为java的库表现为类,所以称为类加载器) Class loader,,,,,,,,,,,,由此1.class,2.class就能够在JVM上跑起来了

image.png

如下图,最终这些代码都要放在cpu上运行的,在cpu上运行之前,都是由操作系统内核进行调度和理解的,我们的操作系统必须得能够理解这种程序才能运行,,,因此真正跑起来,还是得依赖于操作系统

JVM为什么能够实现将程序的开发语言在多种操作系统上能跑起来呢?比如三个操作系统linux,windows,unix,一个程序如何在三个操作系统上都能够跑起来?

java的最大特点是一次编译到处运行(Once for all),无论在哪个平台上进行编译,编译完之后,完全可以实现跨平台运行,,,,,就是因为JVM的存在,JVM本身要磨合底层操作系统的不同,JVM本身有两段,(或者说JVM本身有不同平台的版本, 有专门跑在windows上的JVM,也有专门跑在linux上的JVM),跑在linux上的JVM,它有一段针对linux的代码,另一段是与linux无关的JVM运行环境,,,它将与linux无关的运行环境转化成与linux相关的代码在linux上运行,,,同理,windows也是同样的道理,,,,,,,,,,JVM就是通过这种机制在各种平台上让这些有关段通过无关的方式输出出来,,,,,,,,,,,,,,针对每一种平台都有其独有的代码,但最终向上是跟平台无关的代码,所以java编译好以后,编译成类以后,装载好依赖的其它类,就能够在JVM上运行起来了,,,,,,,,JVM最终还是要将程序转换为与平台相关的代码才能跑起来,,,看似是无关,真正跑起来,还是跟平台相关的,,,,,,,,,,,,,,,,正是由于不同版本的JVM的存在,才使得java能够一次编译,到处运行的,,,,java为了能够运行,JVM至关重要

image.png




JVM的实现方式:三种

       1,一次解释器,,,,它解释的是字节码并执行,(字节码本身不是真正意义上的二进制的,无法独立执行,仍然需要解释器),(第一次执行完之后,第二次执行还得再解释,,, 解释的过程是字节码真正转换成二进制的过程,,,,跟平台无关的字节码转换成跟平台相关的二进制程序,如上图,,,,,,,,,,,,,,,解释一次,执行一次,每一次执行都是重新解释一遍,,,),在解释之前已经编译过了,.java要编译成.class (bytecode)了, 类似于shell的解释器一样,解释一句,执行一句

       2,即时编译器,(just-in-time complier),,,,,,每一个class类在运行的前解释,,解释的内容要缓存下来,第二次执行的时候,就直接从缓存中取了,,,即时编译器要依赖于更多内存来缓存解释结果,,,,如果程序非常大,每一次解释完之后(每一个代码都执行完一次),都要缓存下来,对我们的内存占用量过大,更何况,很多解释器解释之后的程序里面还包括有数据,所以内存占用量更大,,,,,所以如果都缓存到内存里面,会占据大量内存,,,,,,,,,,,,,,,(运行的非常快)

       2,自适应编译器,,这个编译器能监控所有类当中,所有代码当中哪些代码执行频率高,哪些代码执行频率低,它能够自动的仅缓存哪些执行执行频率比较高的代码,二八法规,,( 一个程序里面执行最多的通常都是80%的活都是由20%的人完成的 )(20%的代码完成80%的任务,所以只缓存这20%的代码)(缓存20%的代码,提高80%的速度,,,真正运用时,值没有这么精确吧),,,,,,,,,,,,,,,,,,,,(就是将第1种和第2种结合起来的折衷的方式)


Sun本身将java语言开源了,它又给予了拥抱开源,Sun没运营好,,,,技术好,还得市场好,

Java设计语言: Sun某个团队研发的,

Java API:     1)Sun定义Java API,定义好规范??????,Sun 很多开源的,它自己定义的API只存活了一年,就维持不下去了,

                   2)Java的规范开放组织定义的,,越来越受欢迎

Java Class文件格式: Sun自己定义的,字节码遵循的规范,

JVM: 有很多种,    1)Sun有自己的JVM (Hotspot JVM),

                                          软件程序的名称叫  

                                                  JRE: java runngin environment(java运行时环境),,仅仅是让编译好的类能够运行的,,如果是终端用户用JRE,,,,早期JRE是开源的,JDK是收费的,现在JDK也是开源的

                                                  JDK: java development kit (Java开发工具包) ,,,是能够让你开发(加编译)并运行的,,如果是程序员,用JDK

                                                           JDK包含JRE,是JRE的超集,比JRE东西更多

                            2) 开源界自己的JVM (OpenJDK)  ,,,(当然JDK本身包括的不仅仅是JVM)    开发加运行的开源实现



java是全球的语言,近十年来,一直是程序员采用最多的一种语言,

JAVA API类库

第三方类库: 第三方组织也提供了JAVA API类库

JDK=Java+API+JVM            后面马哥说到JDK时,可能不仅仅包含这三个组件

JRE=JVM+java SE API                        #java SE API是java标准版本的api,,,,,,,java SE API  是API的一个子集,因为我们API用来开发的那些就不用了,(像库一样,开发的时候,用到头文件,运行时用不到头文件,)


JDK是用于Java程序开发的最小环境



为了完成java程序开发,在jdk当中,除了java,api,jvm之外, 还提供了一些专门的调试工具,监控工具等,

安装完java后,给我们提供了一些命令行工具,比如编译器,还有jar的一些打包工具(可以将类文件压缩的,然后我们可以直接使用压缩格式,压缩格式仍然能够被JVM所识别和使用)


根据JAVA应用领域的不同,java技术可分为三类,

JAVA SE: Standard Edition,,,,,J2SE(这里2是版本),,,,,java标准版,为了中小型应用而提供的类库

JAVA EE: Enterprise Edition,,,,,J2EE,,,,java企业版

JAVA ME: Moblie Edition,,,,,J2ME,,,,java移动版,专门用来开发手持设备上的应用程序的,,,它没有怎么流行过,,,,,学移动开发,一般学安卓,或者Object C,(安卓本身也无非是一个java程序,安卓本身后端无非是一个专门优化用于移动平台上的JRE(JDK),,属于google公司??????)



1995年,java1.0正式面世,项目的领导者叫James Gosing,项目名称叫Green Project(Green改名 Oak,再改名 java),,主要目的是实现一次编译,到处运行(write once ,run any where ),,,,,,,1999年,Hotspot  JVM 才真正发布,是Sun公司购买的一个小公司开发的,,,,,,,,,,,,2006年sun公司把它的大多数技术在sun公司的java one 大会上都开源了,基本上都是GPL的协定下进行了开源,,,,,,,,,,,,,,2009年,Oracle以74亿美元收购Sun公司,java也被Oracle收入囊中,Oracle以封闭性著称,所以很多人认为Sun也像MySQL一样,前途未卜,就在前不久,Oracle公司因为java的某些技术方面的原因(专利方面的原因),与google打了一场官司,最后打输了,.......


1995年,互联网方兴未艾,还未蓬勃发展,,,,此后不几年,人们对动态网站的需求,越来越迫切,,,在这种情况下,java在它的类库当中引入了一下很有意思的小类applet(小程序),applet是一种特殊的类,这种类所研发的小程序能够让用户,让html的开发者在网页页面当中直接提供一个编译好的applet小程序,这个时候,只要客户端在他的浏览器上安装了JRE插件,就能够实现让applet程序在客户端JVM上跑起来,跑起来之后,根据客户端本地的运行环境,它能够将执行结果通过网页显示给用户,由此,动态网页变成了现实......(applet小程序要先编译好,然后将它嵌入到html当中,客户端浏览网页的时候,它要一并将html和小程序都要下载到本地,这个程序要在本地执行,所以我们称作客户端动态网站,它类似于我们windows当中active-x的机制,需要在客户端执行)(我们为了打开动态网站的动态效果,就要允许远程用户在我们计算机上执行一些程序,至少JRE环境要提供,并且要允许执行,,,,,,,如果恶意的程序,在你的电脑上跑起来,有可能侵害我们的系统,,,,当然java公司一直在不遗余力的让java程序最多只能跑在JVM当中,也就意味着只能危害到JVM本身,但是事实上是很难保证的,再精心设计的程序总然会有漏洞的,,,,,因此这种网站技术给客户端带来的极大的麻烦,,首先客户端必须要配置JRE,未必每个用户都会,,,其次,下载applet,在当年网络带宽尚且不大的情况下,效果不甚理想,更何况还有安全隐患,,所以后来CGI技术就诞生了)


CGI:全称是 Common Gate Intergace  通用网关接口

    CGI是一种协议,一种规范,能够让用户访问某一种特定资源的时候,触发web服务器,让web服务器根据这种协议,能够调用额外的程序来执行这一段程序, 如下图,web服务器通常只能服务于静态页面的,用户请求的资源可能不是纯静态或纯文本的,本来web服务器只能解析html文档,但是后来能解析更多的文档,借助于mime来实现的,mime这种机制之所以能够得以实现,就是因为我们的客户端浏览器中(还是服务器端)??????能够支持各种mime的插件,只不过有了mime技术,我们能够通过html或者说能够通过http协议将所有内容都转换成文本格式,传输过去之后,对方再还原成原来的类型,,,,,,,,,,如果用户请求了a.cgi文件,由此我们只需要配置我们的web服务器,发现用户的请求是a.cgi,而a.cgi本身又作为了一个处理器,这个处理器能够基于cgi协议,调用某一个应用程序,额外再启动一个进程,让这个进程把这个程序执行一下,并且把结果返回给web服务器,web服务器再返回给客户端,,,,这是让web服务器额外调用其它程序(或者启用其它进程)来执行用户所请求的动态程序类的资源,在服务器端执行以后,格式化成html文档,再返回给客户端的一种技术.

image.png


bash shell其实也能写cgi脚本,在cgi的技术框架下,每一个内容,都是由cgi生成的,包括静态内容,比如 <html><title></title><body></body></html>,,,,,,,,,,如下图,在cgi当中,如果用户请求的是静态内容,web服务器自己就可以直接返回了,如果用户请求的是动态内容,就用cgi程序交给后面的进程执行,cgi进程执行以后,如果是纯文本信息,那么最终返回给客户端的是一点规范都没有,而我们的网页都是通过某种格式来显示的,,,比如 <html><body><a>等,,,,cgi中没办法实现,我们的标签是由web服务器提供的,我们的数据,或者说动态结果是由cgi程序提供的,,,,所以所有的内容都要由后端的cgi程序来生成

image.png

因此html文档都必须通过php(或任何一种程序设计开发语言)给它echo(或print)出来,,,,比如php为了能够执行,要编译成opcode字节码来执行的,,假如我们开发了一个站点,里面有很多的html代码,也有很多的php代码,,,这些内容很可能需要编译的,,,如果我们发现我们的html中的<title>写成了<ttle>,我们要改源文件,那么源文件得重新编译一次,(照道理,静态文件是不需要编译的,但是作为php的源文件,是需要重新编译一次),,,,,,,通过这种方式开发的站点,任何一点点的修改,都必须得重新编译整个页面,我们缓存的opcode可能都会失效的,,,,,,,,,,

所以后来出现了MVC框架,,前面的所有静态内容都不需要改,php生成的纯是动态程序,所以改了程序后,必须要重新编译,,,,


cgi出现以后,java为了能够实现不仅仅能支持applet这种机制,也能够支持像cgi(port cgi????)这种方式来开发动态网站,java提供了另外一种特殊类(API中的另外一种特殊规范),叫Servlet

Servlet:以java语言实现了cgi的技术,我们使用java代码来开发网站,开发完以后你必须要遵循servlet规范,servlet本身能够接受用户http的请求,能够理解http协议,并且能够将程序的执行结果以http报文格式封装起来,再通过前端响应给客户端的,,,它增加进来了对http协议的处理能力,,,这样的话,就能够理解http协议,也能够理解html的规范了,,,,,,,使用servlet也可以开发动态站点了,但是因为servlet也是cgi技术,java所有程序的运行必须要编译成字节码的,只要里面包含了java代码,就必须要编译成字节码之后才能运行的,,,,,,,,,,,如果我们的字节码源文件发生了改变,比如<title>写成了<ttle>,那么字节码也要重新编译,,所以这种运行机制对维护起来不方便,,更重要的是servlet使得任何一个内容仍然逃脱不了整个网页框架cgi技术的限定,任何一个静态内容也都得在网页中生成,在java程序中生成,这使得java程序员必须得懂html,,,,,懂html,还得懂java,才能开发动态站点的,,,这大大限定了java技术的流行,,,,如果能实现写java的只管写java,写前台的只管写前台,就好了,,,,后来实现了MVC框架(实现数据,业务和展示的分离,php的就是smarty,java的是hibenate,spring, string SSH框架???),怎么能够让数据,业务和展示分离???怎么能够让java代码嵌入到html中去,(php中去 不必echo整个html,而是在html中<?php echo $变量 ?>,这样php就嵌入了html页面了),,,,在servlet中有JSP技术,JSP (Java Server Page)是servlet上的一种特殊类,有了JSP,在html中嵌入java很简单,比如<%language="java">就能够说明在整个html文档中嵌入java程序,html就不必让java语言本身来处理了,基于这种标签的方式来开发servlet,JSP只不过是在servlet的基础上进行了升级的,改造的,能够实现嵌入到html文档中的一种网页开发技术,,,,,,所以JSP主要是为了实现网页开发的,虽然能够嵌入,但真正能够实现MVC还有一步????????有了这种技术以后,我们为MVC的实现打下了基础,(就像php一样,真正能够实现MVC还得依赖于额外的模板),JSP也有相关的技术模板,比如SSH(structs,spring,hibenate),这是开源的开发JSP程序的一个非常著名的框架,而其中structs就是MVC的框架??????学java开发通常这是必学的技术,,,,,,,,,,,尽管JSP让我们开发动态网页的方式已经变得非常简便了,JSP在运行的时候,仍然必须要转化成(虽然程序员在开发的时候,按照JSP的规范去开发网页就好,但是真正要运行的时候,得先转换成Servlet,只不过,这不需要程序员的参与,java提供的JSP环境本身,就有一个JSP的编译器Jsper,Jsper本身负责将JSP转换成Servlet,而后再使用java的编译器,将Servlet编译成类,才能执行,)尽管JSP摆脱了Servlet的束缚,但是它最终还得转换成Servlet,,,,,有了Struct框架后,也能实现MVC的分离了,尤其它的技术是JSP的技术,,,,,,,,但是,要想实现展示和数据分开,有了JSP后,有人说也可以不转换成Servlet,完全使用JSP来进行处理,,,,但是JSP本身不负责展示(JSP只是动态语言,只处理动态内容的,),要展示还得需要Beans来完成(java bean,,,eg bean(企业级bean技术)??????),java早期是靠这些技术来赚钱的,面向企业级Bean来赚钱,Beans是向前端进行展示的技术,称为presentation layer,,,跟运维离得远,马哥不解释了,,,,,,,,,,,,,,,,,,,JSP,Servlet,Applet彼此间的关系,Servlet和Applet没关系,Servlet是CGI技术,Applet是需要客户端执行的动态站点技术,Applet很少看到了,现在看到的是JSP所研发的转换成Servlet以后生成的页面,,,,,,,,,,,,,,,,,,,,,,

JSP实现的功能与php近似,为什么有了php还得有个JSP,因为它们是不同公司的不同技术,更重要的是JSP性能比php要好得多,而且java语言比php要成熟,规范得多,,,,,一般大型应用,对性能有要求的应用,通常使用JSP,,,,,,,,,,淘宝站点,早期是php的,后来移植向了JSP(绝大部分功能在JSP上),但是尽管如此,不是说php不能用,,,,,,,,facebook用得php,只不过php转换成了C++,php本身是无法提供应用的,facebook通过了一种折衷办法,通过php开发程序,然后将php代码转换为C++代码,然后再编译C++程序,所以facebook的很多官方站点,所运行的程序都是C++代码,而且是编译好的C++程序,它每一次升级都得重新完成布署的,当然为了性能,布署时带来些麻烦,是有必要的,












普通分类: