其execute()方法定义如下:
PublicActionForwardexecute(ActionMappingmapping,
ActionFormform,
HttpServletRequestrequest,
HttpServletResponseresponse)throwsException;
可见,方法中包含参数HttpServletRequest和HttpServletResponse都是ServletAPI提供的接口,也就是说,继承了Action基类的Action类依赖于ServletAPI,这使得Action的测试必须依赖于Web容器,造成其单元测试很不方便。还有ActionMapping和ActionForm都属于Struts1API,这说明Strutsl框架封装请求数据和创建控制类的代码严重StrutslAPI,而且execute方法也是固定的模式,返回的也是ActionForward类型的参数。这样太受规则的束缚,一虽需求有所改变,代码将要做很大的改变。不符合代码重用的要求。
而Struts2的Action类不需要继承任何基类,通常只需要实现Action接口,在JAVA语法中,继承基类和实现接口的意义是不一样的,因为任何一个类只能继承一个基类,但是可以实现多个接口,所以相对于Struts1来说,Struts2的Action类更为灵活。Action接口的execute()方法定义如下:
PublicStringexecute()throwsException;
而且,Struts2的Action类也可以不实现Action接口,只需要在类中提供一个返回类型为String的无参的public方法就行,如:
PublicStringxxx();
可见Action类的方法中不包含任何参数,也就是说Struts2框架的业务逻辑组件不依赖于Web容器,所以这就允许Action类脱离Web容器进行测试,使得单元测试更为简单。
(三)捕获请求参数方式的比较
Struts1使用ActionForm对象来捕获请求参数。与Action类似,所有的ActionForm需要继承ActionForm基类,这样普通的JavaBean就不能被用作ActionFrom,开发者常常创建许多冗余的类来捕获输入,或者使用动态Form来代替创建通常的ActionFrom类。
如果要实现登陆操作,那么为了使Action类能捕获表单的数据,需要创建一个ActionForm对象如下:
publicclassLoginFormextendsActionForm
{
privateStringusername;//定义用户名
privateStringpassword;//定义密码
publicStringgetUsername()
{
returnusername;//获取用户名
}
publicvoidSetUsername(Stringusername)
{
this.username=username;//设置用户名
}
……//省略实现获取和设置密码的getter和setter方法同上
}
然后才能让Action类捕获,如下:
PublicclassLoginActionextendsAction
{
PublicActionForwardexecute(ActionMappingmapping,
ActionFormform,
HttpServletRequestrequest,
HttpServletResponseresponse)throwsException
{
LoginFormuser=LoginForm(form);
……//省略数据验证代码
}
}
Struts2直接使用Action的属性来封装请求参数,避免了使用另外的输入对象。如:
PublicclassLoginActionimplementsAction
{
privateStringusername;//定义用户名
privateStringpassword;//定义密码
PublicStringexecute()throwsException
{
……//省略数据验证代码
}
privateStringusername;//定义用户名
privateStringpassword;//定义密码
publicStringgetUsername()
{
returnusername;//获取用户名
}
publicvoidSetUsername(Stringusername)
{
this.username=username;//设置用户名
}
……//省略实现获取和设置密码的getter和setter方法同上
}
从以上内容可以看出,在Struts1中,业务逻辑层想要捕获表单的数据,就需要创建一个ActionForm对象,而表单的数据有时候也需要传到数据访问层,所以为了避免业务逻辑层和数据访问层依赖于框架,就需要一个和ActionForm类具有相同属性的普通JavaBean类。 2/3 首页 上一页 1 2 3 下一页 尾页 |