浅谈struts1与struts2

我想大家对于struts框架是绝对不会陌生的,最近刚刚学习了struts框架,这里我想谈一下自己对该框架的理解。首先,我要讲到的是struts1框架,该框架是对mvc模式思想的一种应用。为了对该框架的整体思想有个比较好的把握,个人认为必须要理解一下该框架的原理及具体的业务流程。这里,我们来模拟一下struts1的工作现场:首先假设有一个用户在客户端提交了一个请求,然后该请求会提交给struts1中做为控制层的servlet,称之为主控servlet(也就是ActionServlet,该servlet是由struts1框架提供的,类似于一般的servlet,只是struts1框架对其进行了功能上的包装和扩展。对于该主控servlet,我们只需要去配置它,然后用它就可以了),然后,主控servlet会根据web.xml配置文件中所配置的struts-config.xml(即struts配置文件)来寻找客户端所请求的具体的action对象。若找到,则将客户端的请求参数打包到struts-config.xml中所配置的与客户端所请求的action对象对应的formBean对象中(也就是说一个具体的action对象,一定会对应一个formBean对象,或者称之为actionForm对象)。接着,主控servlet会将打包好的formBean对象转发给刚刚找到的action对象,并由action对象进行业务逻辑的处理(实际上,个人认为action对象并不进行具体业务的处理,而只是调用了具体的业务逻辑处理模型来进行处理,也就是说调用了模型层中的对象,例如dao类对象),处理完毕之后,action对象会返回一个forward对象(也就是包装了所要跳转的目标url地址的对象,该对象可以事先在struts-config.xml中配置好,也可以直接创建),并将该forward对象交给主控servlet,由主控servlet来执行具体的跳转动作。换句话说,action对象决定了跳转的目的地址,而具体的跳转动作则是由主控servlet来执行。这里,有必要总结一下主控servlet的职责。大体上来讲,主控servlet负责接收客户端提交的业务请求(有些人称之为拦截请求),然后转发给具体的action对象来处理。而实际上action对象也是通过调用具体的业务处理模型对象来处理业务请求的,所以可以将action对象理解为是主控servlet的功能的延续,并可以把action对象归为控制层。总之,对于主控servlet,我们要记住的是两个核心动作:接收请求和转发请求。其次,我们来总结一下使用struts1框架的具体步骤:1. 在web.xml中配置ActionServlet(主要配置的是ActionServlet类存放的路径,以及ActionServlet的映射路径,还有就是struts-config.xml的存放路径。2. 根据具体的业务功能编写相应的jsp文件、actionForm和action。3. 在struts-config.xml中配置具体的actionForm和action对象(如有必要,还可以配置一下forward对象)。好了,大体上struts1框架的使用就是这三大步骤了。

下面,我们接着来谈一下struts2框架。虽然称之为struts2框架,但是其工作原理跟struts1框架却有着很大的差异。从某种程度上来讲,struts2框架并不是在struts1框架的基础上发展起来的,而是继承了WebWork的血统。接着,我们先来分析一下struts2框架的工作原理,为了跟struts1框架有鲜明的比较,我们还是使用上面使用的那个模拟情景:客户端提交了一个业务请求,该请求被web.xml中配置的FilterDispatcher对象截获(FilterDispatcher类是一个过滤器,该类是struts2的核心类,它充当了Struts1中的ActionServlet中的角色),然后由该对象将请求转发给具体的action对象(这一点跟struts1框架类似,毕竟它们都是使用了mvc设计模式。但是,值得注意的一点是,struts2框架中的具体action类并非继承自Action,而是继承了ActionSupport类),最后action对象处理完毕之后会返回一个目标url给FilterDispatcher对象,由FilterDispatcher对象执行跳转的动作。仔细看了这个业务流程的朋友,是否会注意到这里我没有提到actionForm?是的,在struts2框架中并不存在actionForm对象。那struts2是如何实现struts1中的actionForm功能的呢?实际上,可以这样理解,struts2框架中把struts1中的actionForm的职责合并到了继承了ActionSupport类的action对象中去了。那该如何合并呢?好了,这个问题的答案就是,将客户端请求的参数封装为action对象的属性,并提供set、get方法,以便于注入和提取客户端的请求参数。这因为这样,所以action对象中定义的属性名必须与客户端的请求参数的名称一致。此外,在struts2框架中也用result配置代替了struts1中的forward配置。此外,需要提到的一点是,struts2中对于防重复提交以及文件上传等功能的实现也与struts1框架有所差异,有兴趣的朋友可以研究一下。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值