|
马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
恰恰证明了java的简单,要不怎么没有通过c/c++来搞个这种框架?
J2ee的开源框架良多,笔者只能先容本人熟习的几个,其他的今朝在中国IT行业使用得不是良多。但愿人人对新出的框架不要自觉的推许,起首必定要熟习它比旧的究竟幸亏那里,新的理念和特征是甚么?然后再决意是不是要利用它。
这期的主题是Struts,直译过去是支架。Struts的第一个版本是在2001年5月公布的,它供应了一个Web使用的办理计划,怎样让Jsp和servlet共存往供应明晰的分别视图和营业使用逻辑的架构。在Struts之前,一般的做法是在Jsp中到场营业逻辑,大概在Servlet中天生视图转发到前台往。Struts带着MVC的新理念事先加入几近成为业界公认的Web使用尺度,因而今世IT市场上也呈现了浩瀚熟习Struts的程序员。即便有新的框架再出来不必,而持续用Struts的来由也加上了一条低风险,由于半途假如开辟职员变化,很简单的招进新的会Struts的IT平易近工啊,^_^!
笔者之前说的都是Struts-1,由于新出了Struts-2,使得每次谈到Struts都必需说明它是Struts-1仍是2.笔者先谈对照熟习的Struts-1,下次再先容一下与Struts-2的区分:
1.Struts框架全体布局
Struts-1的中心功效是前端把持器,程序员必要存眷的是后端把持器。前端把持器是是一个Servlet,在Web.xml两头设置一切Request都必需经由前端把持器,它的名字是ActionServlet,由框架来完成和办理。一切的视图和营业逻辑断绝都是应为这个ActionServlet,它就像一个交通差人,一切过往的车辆必需经由它的高眼,然后被送往特定的通道。一切,对它的了解就是分发器,我们也能够叫做Dispatcher,实在懂得Servlet编程的人本人也能够写一个分发器,加上拦阻request的Filter,实在本人完成一个struts框架并非很坚苦。次要目标就是让编写视图的和背景逻辑的能够离开紧耦合,各自同步的完成本人的事情。
那末有了ActionServlet在两头卖力转发,前真个视图好比说是Jsp,只必要把一切的数据Submit,这些数据就会抵达合适处置它的后端把持器Action,然后在内里举行处置,处置终了以后转发到前台的统一个大概分歧的视图Jsp两头,前往前台使用的也是Servlet内里的forward和redirect两种体例。以是到今朝为止,统统都只是借用了Servlet的API搭建起了一个便利的框架罢了。这也是Struts最明显的特征??把持器。
那末别的一个特征,能够说也是Struts-1带来的一个对照乐成的理念,就是以xml设置取代硬编码设置信息。以往决意Jsp往哪一个servlet提交,是要写进Jsp代码中的,也就是说一旦这个提交路径要改,我们必需改写代码再从头编译。而Struts提出来的思绪是,编码的只是一个逻辑名字,它对应哪一个class文件写进了xml设置文件中,这个设置文件纪录着一切的映照干系,一旦必要改动路径,改动xml文件比改动代码要简单很多。这个理念能够说相称乐成,乃至于厥后的框架都持续着这个思绪,xml所起的感化也愈来愈年夜。
大抵下去说Struts现在给我们带来的奇怪感就这么多了,其他的一切特征都是基于便利的把持转发和可扩大的xml设置的基本之下去完成它们的功效的。
上面将分离先容Action和FormBean,这两个是Struts中最中心的两个组件。
2.后端把持器Action
Action就是我们说的后端把持器,它必需承继自一个Action父类,Struts计划了良多种Action,比方DispatchAction、DynaValidationAction.它们都有一个处置营业逻辑的办法execute(),传进的request,response,formBean和actionMapping四个对象,前往actionForward对象。抵达Action之前先会经由一个RequestProcessor来初始化设置文件的映照干系,这里必要人人注重几点:
1)为了确保线程平安,在一个使用的性命周期中,Struts框架只会为每一个Action类创立一个Action实例,一切的客户哀求共享统一个Action实例,而且一切线程能够同时实行它的execute()办法。
以是当你承继父类Action,并增加了private成员变量的时分,请记着这个变量能够被多个线程会见,它的同步必需由程序员卖力。(一切我们不保举如许做)。在利用Action的时分,包管线程平安的主要准绳是在Action类中仅仅利用部分变量,审慎的利用实例变量。部分变量是对每一个线程来讲公有的,execute办法停止就被烧毁,而实例变量相称于被一切线程共享。
2)当ActionServlet实例吸收到Http哀求后,在doGet()大概doPost()办法中城市挪用process()办法来处置哀求。RequestProcessor类包括一个HashMap,作为寄存一切Action实例的缓存,每一个Action实例在缓存中寄存的属性key为Action类名。在RequestProcessor类的processActionCreate()办法中,起首反省在HashMap中是不是存在Action实例。创立Action实例的代码位于同步代码块中,以包管只要一个线程创立Action实例。一旦线程创立了Action实例并把它寄存到HashMap中,今后一切的线程会间接利用这个缓存中的实例。
3)<action>元素的<roles>属性指定会见这个Action用户必需具有的平安脚色,多个脚色之间逗号离隔。RequestProcessor类在预处置哀求时会挪用本身的processRoles()办法,反省设置文件中是不是为Action设置了平安脚色,假如有,就挪用HttpServletRequest的isUserInRole()办法来判别用户是不是具有了需要的平安性脚色,假如不具有,就间接向客户端前往毛病。(前往的视图经由过程<input>属性来指定)
<p>
为什么外国人还要写那些框架进行代码封装,他们不就是为了别人使用时可以更简单么!如果要达到一个企业级项目的不用框架是很难的。小一些的项目还行,大的光是MVC模式的设计的编码量就够大的了。还有性能方面,单轮windows,这个工具是微软写的,。 |
|