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. 请求参数在哪封装的: