Struts 2.x权威指南
上QQ阅读APP看本书,新人免费读10天
设备和账号都新为新人

1.2.2 与ServletAPI严重耦合

因为Struts 1框架是在Model 2的基础上发展起来的,因此它完全是基于Servlet API的,所以在Struts 1的业务逻辑控制器内充满了大量的Servlet API,从而导致Struts 1的Action难于测试。

看下面的Action代码片段。

// 业务逻辑控制器必须继承Struts 1提供的Action类
public class LoginAction extends Action
{
    // 处理用户请求的execute方法
    public ActionForward execute(ActionMapping mapping, ActionForm form,
          HttpServletRequest request, HttpServletResponse response)
          throws AuctionException
    {
          // 获取封装用户请求参数的ActionForm对象
          // 将其强制类型转换为登录用的LoginForm
          LoginForm loginForm = (LoginForm)form;
          // 当用户名为crazyit,密码为leegang时返回成功
          if ("crazyit".equals(loginForm.getUsername()
                && "leegang".equals(loginForm.getPassword())
          {
                // 处理成功,返回一个ActionForward对象
                return mapping.findForward("success");
          }
          else
          {
                // 处理失败,返回一个ActionForward对象
                return mapping.findForward("error");
          }
    }
}

当我们需要测试上面Action类的execute方法时,该方法有4个参数:ActionMapping、ActionForm、HttpServletRequest和HttpServletResponse,初始化这4个参数比较困难,尤其是HttpServletRequest和HttpServletResponse两个参数,通常由Web容器负责实例化。

因为HttpServletRequest和HttpServletResponse两个参数是Servlet API,严重依赖于Web服务器。因此,一旦脱离了Web服务器,Action的测试将变得非常困难。