1. 问题
Struts2 的 Action 我们将它定义为一个控制器,但是由于在 Action 中也可以来编写一些业务逻辑,也有人会在 Action 输入业务逻辑层。
但是在企业开发中,我们一般会将业务逻辑层单独编写,而不是将它与 action 层写到一起。
之前的练习中,我们一直将属性如 username 、 password 等保存在了 action 中。
这样做了以后导致我们在调用业务逻辑层时可能需要将Action的对象传过去。
但是这样做无异于直接将 Servlet 传给 Service,导致两层之间的耦合,而且我们也不希望其他对象可以直接使用Action对象。
要解决这个问题,我们可以采用的一种方式是,专门在Action中定义一个属性,用来封装信息。然后只需要将这个对象传个service即可。
但是这样又带来了一个新问题,谁来将属性封装进对象呢?答案就是ModelDriven拦截器
拦截器:
拦截器的作用和过滤器类似。
拦截器可以在请求到达Action之前进行拦截,希望在请求到达Action之前通过拦截器做一些准备工作。
Struts2 简单的运行流程:
根据配置信息创建ActionProxy代理类。
判断:如果ActionMapping为null,不是Struts请求,直接放行
如果ActionMapping不为null,是Struts请求,继续处理
请求首先到达StrutsPrepareAndExecuteFilter.doFilter()
在doFilter方法中,先获取ActionMapping
通过configurationManager加载Struts的配置信息,找到请求对应的Action对象
在StrutsActionProxy.execute()方法中调用DefaultActionInvocation.invoke()方法
对所有的拦截器进行迭代在去分别调用拦截器intercept方法,进行拦截请求
intercept方法我们对请求进行一些处理,处理完毕以后继续DefaultActionInvocation.invoke()方法
如此反复直到所有的拦截器都被调用
最后才去执行Action的方法。
2. 请求参数在哪封装的:
请求参数在到达Action之前,会先经过ParametersInterceptor拦截器,
在该拦截器中会自动对将请求参数封装进值栈的栈顶对象,
