从浅谈servlet及tomcat到品味spring家族

兄弟们好!

这些日子博主一直在精进spring的一些框架,所以很久没上博客了..不过今天呢突然想回忆一下以前的servlet编程的小故事。

闲话不扯了。。

回忆起来貌似servlet是个控制器,没错,的确它内部可以通过获取请求的url来调用对应的方法来提供服务,所以它是控制器,可能这就是springmvc为什么带有@Controller的类也有这个功能吧哈哈哈哈哈哈!!!!额那么我们用servlet干什么啊? 其实吧也就是去拼接一个动态的网页,因为jsp就是servlet呀!只要我们用servlet把一些信息绑定到页面上就可以实现动态网页了,想想只不过是把servlet看作view和model的中转站,博主常常说的一句话就是:我们编写项目很重要,但是更重要的是我们去理解这个项目。

那么我站在开发者的角度是如何理解一个web项目的呢?其实蛮有意思的,我觉得mvc这种常用的设计模式在web项目中好比一个平面,它是二维的,它可以清晰地合理地疯狂地为我们提供一些服务,不知道你试没试把所有项目的代码写到一个java类中(呵呵)。。。那么web项目是二维的对吗? 那肯定对啊,除非你推翻了mvc设计模式! 不过随着时代的发展或是人类大脑的发展、经验的积累,我说web项目是三维的,这有错吗? 不知道你用没用过一些web框架开发一个项目,例如我们用springmvc这个不错的框架,当然它也包括mvc这个二维的平面啦!这个平面在mvc框架中就不是很简单了!


看看springmvc中比较重要的五个组建组成了mvc的二维平面,首先请求要发给前端控制器来处理哦,在那之前该过滤的过滤,然后前端控制器通过映射处理器的配置来决定调用哪一个控制器来处理,而控制器呢就差不多是servlet啦,它返回了结果和视图给前端控制器,最后前端控制器通过视图解析器的配置来决定前端用什么技术展现!是不是听上去比传统的servlet高级一点? 其实嘛,我之前讲得都是二维平面啦!那么我说的三维平面是什么呢?就是我们在开发的过程中,在控制器里我们要建立一个“z轴”方便我们对代码的排列,这个z轴也可以说成分层,简单的分层我们分为表示层(Controller)、服务层(Service)、持久层(Repository),那么我们为什么要分层?因为我们的项目是要维护的!开发者不是代码猿而是艺术家,我们考虑的是如何把代码写成一个逻辑性很强的文章。可能你没听过“高内聚,低耦合”这个说法,意思是我们要遵守单一功能准则,而且类与类之间耦合度要尽量的低,那么我们这个分层就是这句话的实现。我们一个controller就处理一类业务,其中包含了一类业务的服务,那么服务中涉及到访问数据持久化的部分,我们要把它单独设置到持久层去,业务层只留业务逻辑,而低耦合体现在我们要用注入的方式来控制对象,也就是spring的一个特别重要的特性——spring容器。我记得有个叫外观模式的设计模式说的貌似是这个特性吧,是有n个组件类和一个整合类,整合类中包含了每个组件的对象,然后组件的构架和联系都在整合类中实现,而组件类仅仅是我们熟悉的javabean。。。


好啦,我现在说web项目是三维的有错吗?不过每个人理解不同的啦!等等等等!!!哎兄弟!我又说web项目是四维的!你服不服???别以为我是喝醉了!那么我来谈谈我个人对四维这个概念的理解!

我们先扯点tomcat是怎么工作的吧,首先呢你发个请求是吧,tomcat先解析你的域名通过dns(dns我就不详细说了,rfc2181上有规范说明)映射到一个ip地址,然后要访问这个ip地址我们用tcp的方式进行三次握手(握手也不说了),然后连接建立成功后我们便开始进入核心的步骤——tomcat内部处理请求。这个步骤我可以详细说说,哎你说这个servlet处理那么多请求,是不是每个请求都由一个servlet实例来处理啊??? 那肯定不是啊! 你在想什么,如果有一万个请求就有一万个实例,那服务器还不炸了? 事实上servlet是单例的,它随着服务器上的项目发布而诞生,随着服务器关机而死亡,当有多请求访问服务器的时候,每个请求依据自己所在的游览器而被tomcat分配一个线程,所有线程来共享这个servlet实例,tomcat中有个线程池,池子大小可以配置,当一个请求发来的时候就从池子中拿一个线程来执行servlet中对应方法,再请求再拿,一直拿到池子没线程了,就开始等吧等到有请求处理完。哎你别跟我说组件要修改临界资源的事哈!因为那个的去参考线程同步的解决方案,博主能力有限只能谈谈浅显操作。。tomcat依据url的虚拟目录来在发布的项目中寻找指定的项目,找到之后再接着往下找web.xml文件,找到之后再找里面你配置的servlet网名,并调用与其对应的servlet类里面的service方法,所以有时候我们看到访问出错,错误码500是怎么回事?

其实就是:

try{

new Servlet().service();

}catch(Exception){

Request.getRequestDispatcher(“500.html”).forward();

}

看见没,你的service方法或者servlet类崩了就报500,而你service方法生命错了就报405,有意思吧?

待更新下一篇...



评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值