仓酷云

 找回密码
 立即注册
搜索
热搜: 活动 交友 discuz
查看: 1548|回复: 20
打印 上一主题 下一主题

[学习教程] JAVA网站制作之Tomcat研讨之组件布局

[复制链接]
分手快乐 该用户已被删除
跳转到指定楼层
楼主
发表于 2015-1-18 11:51:03 | 只看该作者 回帖奖励 |正序浏览 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
首先第一点:jsp,servlet,javabean这些最基本的,嘿嘿,就算你是高手的话,在大行的企业级应用的话还是需要框架的,一个好的框架确实能构解决许多问题。
Tomcat研讨之组件布局















人人好,上篇先容了《Tomcat研讨之ClassLoader》,这篇我们先容组件布局



在没有任何本色性材料的条件下研讨Tomcat的内核将长短常坚苦的事变,但不管怎样另有opensource,我们最少能够跟踪Tomcat成百上千的类,为了我们能完全解开Tomcat的面纱,我们仍是要持续勉力.



经由过程UML类图不丢脸出,Core包内里最主要的一个类是ContainerBase,而这个笼统类完成了Container,Lifecycle,Pipeline,MBeanRegistration,Serializable接口,Serializable接口人人都已很熟习,我们重在研讨前几个接口,由于我们料想全部Tomcat的部分构架多是创建在这几个基本接口上.







在进进剖析之前我们先回想一下config.xml(server.xml)文件,从这个文件及apache的文档我们大致能够懂得到Tomcat微观上是有上面几个部分构成:



-Serverserver元素是JVM的出口点,全部设置文件只要一个,由于server不是容器(container),因而不克不及嵌套子组件.server在某一指定的端口监听shutdown命令.server能够包括一个或多个service实。







-Serviceservice有共享统一个Container的一个或多个Connectors构成,一样平常Service就是一个Engine,但没有明白标准请求云云.由于Service不是一个Container,因而不克不及在内里嵌套子组件(好比Loggers/Valves)。







-Connector connector就是一个Tomcat与客户真个毗连,Tomcat有两种典范的Connector:http,JK2.httpconnector监听来自Browser的毗连(一般在我们熟习的8080端口),JK2.来自其他WebServer的哀求(默许在8009端口监听)。Connector会把取得的哀求交给Engine处置。







-EngineEngine下能够设置多个假造主机VirtualHost,每一个假造主机都有一个域名当Engine取得一个哀求时,它把该哀求婚配到某个Host上,然后把该哀求交给该Host来处置Engine有一个默许假造主机,当哀求没法婚配就任何一个Host上的时分,将交给该默许Host来处置







-Hosthost代表一个假造主机,默许是localhost,host下能够部署多个webapplication,在我们实践使用中一样平常要思索成绩的对象就是host















1.org.apache.catalina.Lifecycle







通用的组件声明周期接口,一样平常Tomcat的组件都要完成这个接口(但不是必需的),这个接口是为一切组件供应不异的start和stop。次要办法有:







//增添一个监听器







publicvoidaddLifecycleListener(LifecycleListenerlistener);















/**







*这个办法应当在任何public办法被挪用前被挪用







*该办法发送一个START_EVENT事务到一切注册到







*该组件的监听器







*/







publicvoidstart()throwsLifecycleException;















/**







*这个办法应当在一切public办法被挪用以后被挪用







*该办法发送一个STOP_EVENT事务到一切注册到







*该组件的监听器







*/







publicvoidstop()throwsLifecycleException;















2.org.apache.catalina.LifecycleListener







该接口用于监听一些主要事务(包含完成了Lifecycle接口组件发生的start,stop事务)







次要办法是:







//处置监听到的事务







publicvoidlifecycleEvent(LifecycleEventevent);























3.org.apache.catalina.Container







容器是用于从客户端获得哀求(request)而且处置哀求并复兴给客户端(response)的对象。容器能够撑持(可选)pipeline,以便能在运转时按设置的按次处置哀求。







在Tomcat内里,容器在观点上存在以下及层:







Engine哀求处置出口点,能够包括多个Host和Context







Host代表一个假造主机







Context代表单个ServletContext,能够包括多个Wrappers







Wrapper代表单个Servlet,假如Servlet完成了SingleThreadModel,能够代表单个Servlet的多个实例。







容器为了完成本人的功效常常要绑定一些其他组件,这些组件的功效大概被共享,也能够被独自定制,上面是被利用的组件:







LoaderClassLoader,装载JavaClasses







Logger完成了ServletContext的log办法,用于纪录日记







Manager办理与容器绑定的session池







Realm用户平安办理







ResourcesJNDI资本会见







次要的办法:















//增添容器监听器







publicvoidaddContainerListener(ContainerListenerlistener);















//增添property监听器







publicvoidaddPropertyChangeListener(PropertyChangeListenerlistener);















/**







*处置Request,并发生响应地Response







*paramrequest处置的哀求







*paramresponse发生的response







*/







publicvoidinvoke(Requestrequest,Responseresponse)throwsIOException,ServletException;















4.org.apache.catalina.ContainerListener







容器事务监听器,注重的是start,stop是一般的性命周期事务(LiftcycleEvent)不是容器事务。次要办法:















//处置容器事务







publicvoidcontainerEvent(ContainerEventevent);







5.org.apache.catalina.Pipeline







Pipleline是Valve的汇合,当invoke办法被挪用时,它会按指定的按次挪用Valve,它老是请求有一个Valve必需处置传送的request(通常为最初一个)并发生response,不然就把request传送到下一个Valve。







一样平常一个容器仅绑定一个Pipleline实例,一样平常说来容器会把处置request的功效封装到一个容器绑定的Valve里(这个Valve应当在Pipleline最初被实行)。为了完成这个功效,Pipleline供应了setBasic()办法以包管Valve被最初实行,而其他Valve按按次被挪用。







6.org.apache.catalina.Valve







Valve是被绑定在一个Container上的哀求处置组件,一组Valve被按按次绑定在一个Pipleline上。Valve最主要的一个办法是:















/**







*一个Valve大概依照必定的按次实行上面的举措







*1.反省而且(大概)修正指定的Request和Response属性







*2.反省Request属性,天生响应的Response并前往把持权到挪用者







*3.反省Request和Reponse属性,包装这些对象并加强它们的功效,然后把它们传







到下一个组件







*4.假如响应的Response没有被发生(而且把持权也没有被前往)挪用Pipleline







上的下一个Valve(假如有)经由过程办法context.invokeNext()







*5.反省(但不修正)Response属性(挪用前面的Valve或Container发生的)







*Valve必定不克不及作上面的事变







*1.改动Request的一些属性(Changerequestpropertiesthathave







alreadybeenusedtodirecttheflowofprocessingcontrol







forthisrequest)







*2.创立一个已被创立而且已被传送的Response







*3.在挪用invokeNext()办法并前往后修正包括Response的HTTPHeader信息







*4.在invokeNext()挪用前往后在绑定Response上的输入流上作任何挪用







*@paramrequest将被处置的Request







*@paramresponse将被创立的Response







*@paramcontext被用来挪用下一个Valve的ValveContext







publicvoidinvoke(Requestrequest,Responseresponse,







ValveContextcontext)







throwsIOException,ServletException;







7.org.apache.catalina.ValveContext







一个ValveContext是如许一种机制:一个Valve能够触发下一个Valve的挪用,而不用晓得机制的内涵完成。







8.org.apache.catalina.Engine







Engine是一个容器,是Cataline的Servlet的出口点。







当公布一个毗连到WebServer的Cataline时大概不利用Engine,由于Connectior将利用WebServer的资本决意利用哪一个Context处置Request。







从属于Engine的子容器依据Engine完成的分歧多是Host或Context(单个ServletContext)。







假如利用了Engine,在Cataline的条理中它就是顶层容器,因而setParent()应改抛出IllegalArgumentException非常。从Engine上面几个办法我们能够看出其的布局:















/**







*设定Engine从属的Service







*@paramserviceTheservicethatownsthisEngine







*/







publicvoidsetService(Serviceservice);















/**







*SetthedefaulthostnameforthisEngine.







*







*@paramdefaultHostThenewdefaulthost







*/







publicvoidsetDefaultHost(StringdefaultHost);















/**







*SettheDefaultContext







*fornewwebapplications.







*







*@paramdefaultContextThenewDefaultContext







*/







publicvoidaddDefaultContext(DefaultContextdefaultContext);















9.org.apache.catalina.Host







Host是一个容器,它代表一个假造主机。







当公布一个毗连到WebServer的Cataline时大概不利用Host,由于Connectior将利用WebServer的资本决意利用哪一个Context处置Request。







Host所从属的父容器一般是Engine,从属于Host的子容器一般是Context(单个ServletContext)。







Host接口内里的办法多半都是关于修正Host属性及设定默许的Context。这里我们不再逐一枚举。







10.org.apache.catalin.Context







Context是一个容器,它代表一个ServletContext,一个CatalineEngline中的单个的WebApplication。Context所从属的父容器是Host,从属于Context的子容器是Wrapper(代表单个Servlet)。Context接口内里多半是关于WebApplication的设置的办法,我们能够参考Web.xml文件研讨内里的办法,内里多半办法都是怎样读取Web.xml文件里的资本。







11.org.apache.catalina.Wrapper







Wrapper是一个容器,它代表单个Servlet。Wrapper办理Servlet的性命周期,包含挪用init()和destory()办法。







Wrapper所从属的父容器是Context,没有从属于Wrapper的子容器,办法addChild()应当抛出IllegalArgumentException非常。







Wrapper接口内里的办法都是关于读取Servlet的属性,能够参考Web.xml文件内里关于<servlet>标签的界说。







12.org.apache.catalina.Server







Server是全部Catalina容器的出口点,能够包括多个Service和顶层资本元素。一样平常说来完成Server接口的类也应当同时完成Lifecycle接口,当start()和stop()办法被挪用的时分挪用Service响应的办法。







Server卖力在指定的端口监听毗连,当有毗连被承受的时分,Server会剖析哀求的第一行信息,假如是SHUTDOWN则stop服务。能够参考Server.xml文件关于Server的界说。







13.org.apache.catalina.Service







Service是一个或多个共享同以Container的Connectiors的汇合。







JVM能够包括一个或多个Service实例,但它们互相之间是完整自力的,它们仅共享JVM的资本。







14.org.apache.catalina.Connector







Connector是一个从客户端承受哀求(request)并天生回应(reponse)的组件。一个Connection一般实行上面的逻辑:







1)从客户端程序承受哀求







2)创立Request和Response,并把上面这些属性设置到这些对象







(1)对一切的Request,connector,protocol,protocol,response,scheme,secure,serverName,serverPort,serverPort属性必需被设置。contentLength,contentType一般也被设置。







3)对一切的HttpRequests,method,queryString,requestedSessionCookie,requestedSessionId,requestedSessionURL,requestURI,secure属性必需被设置。别的一切addXxx办法也必需被挪用以纪录cookies,headers和locales信息。







4)对一切的Responses属性connector,request,stream属性必需被设置。







对HttpResponses来讲,connector不会为它设置分外headers信息。

1.Tomcat全体架构类图

























下篇将从Tomcat的各个组件动手先容Tomcat。

唉!都是钱闹的1.Swing和.net开发比较------从市场份额看.net开发主要占据大部分的中小型和中型的的桌面开发,原因是它封装了很多工具
精灵巫婆 该用户已被删除
21#
发表于 2015-4-23 09:48:43 | 只看该作者
多重继承(以接口取代)等特性,增加了垃圾回收器功能用于回收不再被引用的对象所占据的内存空间,使得程序员不用再为内存管理而担忧。在 Java 1.5 版本中,Java 又引入了泛型编程(Generic Programming)、类型安全的枚举、不定长参数和自动装/拆箱等语言特性。
因胸联盟 该用户已被删除
20#
发表于 2015-4-23 02:24:49 | 只看该作者
学Java必读的两个开源程序就是Jive和Pet Store.。 Jive是国外一个非常著名的BBS程序,完全开放源码。论坛的设计采用了很多先进的技术,如Cache、用户认证、Filter、XML等,而且论坛完全屏蔽了对数据库的访问,可以很轻易的在不同数据库中移植。论坛还有方便的安装和管理程序,这是我们平时编程时容易忽略的一部份(中国程序员一般只注重编程的技术含量,却完全不考虑用户的感受,这就是我们与国外软件的差距所在)。
19#
发表于 2015-4-21 15:51:45 | 只看该作者
你就该学一学Servlet了。Servlet就是服务器端小程序,他负责生成发送给客户端的HTML文件。JSP在执行时,也是先转换成Servlet再运行的。虽说JSP理论上可以完全取代Servlet,这也是SUN推出JSP的本意,可是Servlet用来控制流程跳转还是挺方便的,也令程序更清晰。接下来你应该学习一下Javabean了,可能你早就看不管JSP在HTML中嵌Java代码的混乱方式了,这种方式跟ASP又有什么区别呢?
只想知道 该用户已被删除
18#
发表于 2015-4-19 09:29:44 | 只看该作者
学Java必读的两个开源程序就是Jive和Pet Store.。 Jive是国外一个非常著名的BBS程序,完全开放源码。论坛的设计采用了很多先进的技术,如Cache、用户认证、Filter、XML等,而且论坛完全屏蔽了对数据库的访问,可以很轻易的在不同数据库中移植。论坛还有方便的安装和管理程序,这是我们平时编程时容易忽略的一部份(中国程序员一般只注重编程的技术含量,却完全不考虑用户的感受,这就是我们与国外软件的差距所在)。
活着的死人 该用户已被删除
17#
发表于 2015-4-12 22:49:24 | 只看该作者
你可以去承接一些项目做了,一开始可能有些困难,可是你有技术积累,又考虑周全,接下项目来可以迅速作完,相信大家以后都会来找你的,所以Money就哗啦啦的。。。。。。
乐观 该用户已被删除
16#
发表于 2015-4-11 00:16:21 | 只看该作者
另外编写和运行Java程序需要JDK(包括JRE),在sun的官方网站上有下载,thinking in java第三版用的JDK版本是1.4,现在流行的版本1.5(sun称作J2SE 5.0,汗),不过听说Bruce的TIJ第四版国外已经出来了,是专门为J2SE 5.0而写的。
莫相离 该用户已被删除
15#
发表于 2015-4-4 23:55:14 | 只看该作者
J2SE开发桌面应用软件比起 VC,VB,DEPHI这些传统开发语言来说,优势好象并不明显。J2ME对于初学者来说,好象又有点深奥,而且一般开发者很难有开发环境。
金色的骷髅 该用户已被删除
14#
发表于 2015-4-1 04:52:44 | 只看该作者
关于设计模式的资料,还是向大家推荐banq的网站 [url]http://www.jdon.com/[/url],他把GOF的23种模式以通俗易懂的方式诠释出来,纯Java描述,真是经典中的经典。
爱飞 该用户已被删除
13#
发表于 2015-3-22 19:09:36 | 只看该作者
Jive的资料在很多网站上都有,大家可以找来研究一下。相信你读完代码后,会有脱胎换骨的感觉。遗憾的是Jive从2.5以后就不再无条件的开放源代码,同时有licence限制。不过幸好还有中国一流的Java程序员关注它,外国人不开源了,中国人就不能开源吗?这里向大家推荐一个汉化的Jive版本—J道。Jive(J道版)是由中国Java界大名 鼎鼎的banq在Jive 2.1版本基础上改编而成, 全中文,增加了一些实用功能,如贴图,用户头像和用户资料查询等,而且有一个开发团队在不断升级。你可以访问banq的网站
admin 该用户已被删除
12#
发表于 2015-3-21 14:31:10 | 只看该作者
Java是一个纯的面向对象的程序设计语言,它继承了 C++语言面向对象技术的核心。Java舍弃了C ++语言中容易引起错误的指针(以引用取代)、运算符重载(operator overloading)
蒙在股里 该用户已被删除
11#
发表于 2015-3-14 22:27:12 | 只看该作者
Java语言支持Internet应用的开发,在基本的Java应用编程接口中有一个网络应用编程接口(java net),它提供了用于网络应用编程的类库,包括URL、URLConnection、Socket、ServerSocket等。Java的RMI(远程方法激活)机制也是开发分布式应用的重要手段。
第二个灵魂 该用户已被删除
10#
发表于 2015-3-11 05:49:29 | 只看该作者
你可以去承接一些项目做了,一开始可能有些困难,可是你有技术积累,又考虑周全,接下项目来可以迅速作完,相信大家以后都会来找你的,所以Money就哗啦啦的。。。。。。
深爱那片海 该用户已被删除
9#
发表于 2015-3-10 19:58:26 | 只看该作者
Java语言支持Internet应用的开发,在基本的Java应用编程接口中有一个网络应用编程接口(java net),它提供了用于网络应用编程的类库,包括URL、URLConnection、Socket、ServerSocket等。Java的RMI(远程方法激活)机制也是开发分布式应用的重要手段。
小魔女 该用户已被删除
8#
发表于 2015-3-1 16:43:56 | 只看该作者
那么我书也看了,程序也做了,别人问我的问题我都能解决了,是不是就成为高手了呢?当然没那么简单,这只是万里长征走完了第一步。不信?那你出去接一个项目,你知道怎么下手吗,你知道怎么设计吗,你知道怎么组织人员进行开发吗?你现在脑子里除了一些散乱的代码之外,可能再没有别的东西了吧!
分手快乐 该用户已被删除
7#
 楼主| 发表于 2015-2-10 22:29:05 | 只看该作者
《JAVA语言程序设计》或《JAVA从入门到精通》这两本书开始学,等你编程有感觉的时候也可以回看一下。《JAVA读书笔记》这本书,因为讲的代码很多,也很容易看懂,涉及到面也到位。是你学习技术巩固的好书,学完后就看看《JAVA编程思想》这本书,找找一个自己写的代码跟书上的代码有什么不一样。
冷月葬花魂 该用户已被删除
6#
发表于 2015-2-8 14:00:25 | 只看该作者
J2SE开发桌面应用软件比起 VC,VB,DEPHI这些传统开发语言来说,优势好象并不明显。J2ME对于初学者来说,好象又有点深奥,而且一般开发者很难有开发环境。
简单生活 该用户已被删除
5#
发表于 2015-2-2 22:20:48 来自手机 | 只看该作者
自从Sun推出Java以来,就力图使之无所不包,所以Java发展到现在,按应用来分主要分为三大块:J2SE,J2ME和J2EE,这也就是Sun ONE(Open Net Environment)体系。J2SE就是Java2的标准版,主要用于桌面应用软件的编程;J2ME主要应用于嵌入是系统开发,如手机和PDA的编程;J2EE是Java2的企业版,主要用于分布式的网络程序的开发,如电子商务网站和ERP系统。
海妖 该用户已被删除
地板
发表于 2015-2-1 15:32:55 来自手机 | 只看该作者
Java是一种计算机编程语言,拥有跨平台、面向对java
灵魂腐蚀 该用户已被删除
板凳
发表于 2015-1-24 13:26:26 来自手机 | 只看该作者
你一定会高兴地说,哈哈,原来成为Java高手就这么简单啊!记得Tomjava也曾碰到过一个项目经理,号称Java很简单,只要三个月就可以学会。
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|Archiver|手机版|仓酷云 鄂ICP备14007578号-2

GMT+8, 2024-12-23 13:54

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表