<b>Java学习杂谈(九)--Struts</b>[Java编程]
本文“<b>Java学习杂谈(九)--Struts</b>[Java编程]”是由七道奇为您精心收集,来源于网络转载,文章版权归文章作者所有,本站不对其观点以及内容做任何评价,请读者自行判断,以下是其具体内容:
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>属性来指定)
以上是“<b>Java学习杂谈(九)--Struts</b>[Java编程]”的内容,如果你对以上该文章内容感兴趣,你可以看看七道奇为您推荐以下文章:
本文地址: | 与您的QQ/BBS好友分享! |