从一个servlet内部通过运用javaxservletRequestDispatcher类的forward方法你就可以将控制流程引导到一个目的资源在login应用程序的action类中该代码形式如下
RequestDispatcherrd=requestgetRequestDispatcher(destination);
rdforward(requestresponse);
其中destination就是到一个目的资源的路径
但是在一个典型的Struts应用程序中你可以用ActionForward类作为替代运用这个类的好处就是你不再需要创建一个RequestDispatcher对象并调用它的forward方法了
你可以将ActionForward类用于一个Action类的execute方法中注意其中一个重载的execute方法有如下的定义它返回一个ActionForward对象
publicActionForwardexecute(
ActionMappingmapping
ActionFormformHttpServletRequestrequest
HttpServletResponseresponse)
throwsException
因为当时我们还没有讲到ActionForward类所以在本系列的第一部分和第二部分中所有Action类的execute方法都只返回了空值现在在一个Action类的execute方法中你就可以用ActionForward类来代替下面这个RequestDispatcher对象实例了
RequestDispatcherrd=requestgetRequestDispatcher(destination);
rdforward(requestresponse);
新的代码变成return (new ActionForward(destination));
构建ActionForward对象
ActionForward类提供了下面五种构造器
publicActionForward()
publicActionForward(Stringpath)
publicActionForward(Stringpathbooleanredirect)
publicActionForward(StringnameStringpathbooleanredirect)
publicActionForward(StringnameStringpathbooleanredirectbooleancontextRelative)
虽然这些构造器是不需要说明的但我们应该注意下面几点在这些构造器中第二种可能是最常用的后四种构造器中的path参数表示的是到目的资源的路径后三种构造器中的redirect布尔值表示的是是否执行了一个重定向(redirect)(缺省情况下这个值设置为false因为redirect比forward慢)最后第五个构造器中的contextRelative布尔值表示该路径是否应该是contextrelative的而不是modulerelative的
同样一个ActionForward实例也可以有一个逻辑名称你可以用这个名称来查找与一个特殊的ActionMapping对象相关的实例(参见本系列第四部分关于ActionMapping的讲述)
学习ActionForward类的方法
ActionForward类定义了三个保护字段——namepath和redirect——它们构成了ActionForward的三个属性ActionForward类提供getter和setter方法来从这些字段读值给这些字段赋值这些方法是不需要说明的定义如下
publicbooleangetContextRelative()
publicvoidsetContextRelative(booleancontextRelative)
publicStringgetName()
publicvoidsetName(Stringname)
publicStringgetPath()
publicvoidsetPath(Stringpath)
publicbooleangetRedirect()
publicvoidsetRedirect(booleanredirect)
除此之外ActionForward类还重载了toString方法并返回ActionForward[ + name + ]其中name是名称字段
最后还有一个freeze方法它固定了一个组件的配置
再次运用Login应用程序
要完全了解ActionForward类我们需要再次运用在本系列第一部分和第二部分构建的login应用程序你可以下载完整的应用程序把它重命名为myStrutsApp它的webxml和strutsconfigxml文件同myStrutsApp中的文件是一样的JSP页面也没有改变只有action类同以前不同
注意下面这行代码是新的return (new ActionForward(/mainMenujsp));
它替代了下面这些代码现在它们都被注释出来了
RequestDispatcherrd=requestgetRequestDispatcher(/mainMenujsp);
rdforward(requestresponse);
同样下面这些代码也都被重写了
//RequestDispatcherrd=requestgetRequestDispatcher(/loginjsp);
//rdforward(requestresponse);
新的代码变成return (new ActionForward(/loginjsp));
ViewSecretAction类
ViewSecretAction也变得更好了execute方法最后的这三行代码现在由一行来处理了返回(new ActionForward (/viewSecretjsp)):
//RequestDispatcherrd=requestgetRequestDispatcher(/viewSecretjsp);
//rdforward(requestresponse);
//returnnull;
接下来我们来重新查看LogoutAction类(见列表)注意execute方法中下面这些代码已经被替代了
//RequestDispatcherrd=requestgetRequestDispatcher(/loginjsp);
//rdforward(requestresponse);
//returnnull;
你只需要用下面这一行代码来取代它就行了return (new ActionForward(/loginjsp));
ActionForward是个很有用功能很多的类它可以让你更简单更快更直接地完成许多事情这可能就是它很受欢迎的原因在本系列的第四部分你可以了解另一个重要的类orgapachestrutsactionActionMapping它可以使你的代码更有效更漂亮