仓酷云

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

本版积分规则

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

GMT+8, 2024-9-30 01:40

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

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