Struts2

一,Struts2做什么的?
二,Struts2怎么处理一个用户请求的?
三,Struts2与Struts1有什么区别?
四,Struts2的拦截器?


一,Struts2做什么的?
Struts2是属于MVC框架中的视图层,它是在webwork的基础上发展起来的,也可以说Struts2是webwork的升级版,因此Struts2的稳定性,性能等各方面都有很好的保证。

二,Struts2怎么处理一个用户请求的?
1,
首先用户发出一个请求,通过filterDispatcher拦截器拦截下来。

2, filterDispatcher会询问ActionMapper来决定这个请求是否需要调用某个Action。

3, 这个ActionMapper封装了请求的信息。如果ActionMapper决定需要调用某个Action,FilterDispatcher会按信息(action的名字,调用的方法名)创建一个Action的代理对象。实际上对Action的调用就是通过这个代理对象来实现的。

4,
把请求交给这个代理,如果用户提交的请求没有指定方法,那么Struts2则默认excute方法。这个代理会创建一个调度器的实例。
这个调度器里面定义了一个invoke方法,这个方法就实现了拦截器的交互和执行Action里的excute方法。

5, 拦截器是以value栈的形式调用。
Struts2默认的有18个拦截器。第一个拦截器是一个异常拦截器,这样的话,我第一个拦截器把异常捕获到,那么以后就不用捕获其他拦截器出现的异常了。

6, 当Action执行完以后,调度器就会负责根据struts.xml中的配置找到对应的返回结果。

7, 然后调度器就返回所有的拦截器,通过response把结果集返回给客户。


三,Struts2与Struts1有什么区别?
Struts1是一个老牌的框架,比较稳定,拥有的客户也比较多,减小开发的风险。
Struts2是一个基于webWork开发的一个框架,相对于Struts1来说,还不够成熟,使用Struts2来开发项目风险比较的打。
Struts1的前台控制器是一个servlet,名字叫ActionServlet。
Struts2的前台控制器是一个filter,名字叫FilterDispatcher。
Struts1对所有在同一路径下发出的请求值创建一个Action实例,所以这个Action需要同步。
Struts2对用户的每一个处理请求都会创建一个Action实例,所以Struts2就不用关心同步的问题了。
Struts1是通过formBean来封装数据的。
Struts2是通过action里的属性来封装数据的。
Struts1进行验证的时候,会对action里所有的方法都进行验证。
Struts2进行验证的时候,可以只对单个方法进行验证。比如说当一个Action继承了ActionSupport,在Action类里写validateXxx方法名,这样Struts2验证的时候就只验证Xxx方法。
Struts1的action必须要继承Action类。
Struts2可以不继承任何类,只需要写个execute方法就行了。


四,Struts2的拦截器?
拦截器主要用于在某个方法或字段被访问之前,进行拦截,然后在访问之前或之后加入某些操作。它也算是AOP的一种实现策略。我们一般做的权限管理就是通过拦截器来实现的,比如说一个用户要访问方法时,则
判断这个用户是否登录,然后还要判断这个是否有权限进入这个方法,这些一般都是拦截器来完成的。


strusts2的拦截器底层采用的是动态代理机制实现的。而我们只是需要在struts.xml配置文件中配置拦截器就可以实现了。
谈到拦截器,就要说一下拦截器栈了,拦截器栈就是将拦截器按一定的顺序组成的一条链,在访问被拦截的方法或字段时,拦截器栈中的拦截器会按之前定义好的顺序被调用。像Struts2里就有一个拦截器栈,它里面有18个拦截器,第一个拦截器是处理异常的。

Struts2的拦截器实现原理:当请求到达Struts2的ServletDispatcher时,Struts2会查找配置文件(struts.xml),并根据这个配置文件的配置实例化相对的拦截器对象,然后生成一个列表,最后一个一个的调用列表中的拦截器。

自定一个拦截器:在Struts2里面,自定义一个拦截器是很简单的,写一个普通的java类直接或间接实现
Interceptor接口,然后再重写里面的三个方法:
init():这个方法在该拦截器被初始化之后,该拦截器执行拦截之前,系统调用该方法,这个方法只执行一次。
destroy():这个方法在拦截器实例被销毁之前,系统调用该方法。
intercept(ActionInvocation invocation):这个方法里面写我们要实现的拦截动作。

然后就是在struts.xml里的interceptors节点里通过interceptor元素配置拦截器名字和指定该拦截器的路径。再在action节点里通过interceptor-ref元素来使用拦截器。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值