用ActionForward优化你的Struts应用程序

本文介绍Struts中ActionForward类的运用。此前Struts入门应用未充分运用类库,现在讲解真正的Struts程序员如何使用ActionForward类。阐述其替代RequestDispatcher类的好处,介绍构造器、方法,还结合Login应用程序说明其使用,该类实用且受欢迎。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

简单之中也蕴涵着复杂性,我们在本系列第一部分和第二部分创建、研究一个简单的Struts login应用程序时,回避了许多这种复杂性。因为那两篇文章是给初学者的Struts入门读物,所以我们在应用程序中没有充分运用Struts类库。但现在,你已经做好准备学习更多的东西了。让我们先来看看真正的Struts程序员是如何运用ActionForward类的吧,它代表的是控制指令所导向的一个目的资源。

从一个servlet内部,通过运用javax.servlet.RequestDispatcher类的forward方法你就可以将控制流程引导到一个目的资源。在login应用程序的action类中,该代码形式如下:

RequestDispatcher rd = 
	request.getRequestDispatcher(destination);
rd.forward(request, response);

其中destination就是到一个目的资源的路径。

但是在一个典型的Struts应用程序中,你可以用ActionForward类作为替代。运用这个类的好处就是你不再需要创建一个RequestDispatcher对象并调用它的forward方法了。

你可以将ActionForward类用于一个Action类的execute方法中。注意,其中一个重载的execute方法有如下的定义,它返回一个ActionForward对象:

public ActionForward execute(
	ActionMapping mapping,
    ActionForm form, HttpServletRequest request, 
		HttpServletResponse response)
    throws Exception

因为当时我们还没有讲到ActionForward类,所以在本系列的第一部分和第二部分中所有Action类的execute方法都只返回了空值。现在,在一个Action类的execute方法中,你就可以用ActionForward类来代替下面这个RequestDispatcher对象实例了:

RequestDispatcher rd = 
	request.getRequestDispatcher(destination);
rd.forward(request, response);

新的代码变成:

return (new ActionForward(destination));


构建ActionForward对象
ActionForward类提供了下面五种构造器:

public ActionForward()
public ActionForward(String path)
public ActionForward(String path, boolean 
	redirect)
public ActionForward(String name, String path, 
	boolean redirect)
public ActionForward(String name, String path, 
	boolean redirect, boolean contextRelative)

虽然这些构造器是不需要说明的,但我们应该注意下面几点。在这些构造器中,第二种可能是最常用的。后四种构造器中的path参数表示的是到目的资源的路径。后三种构造器中的redirect布尔值表示的是是否执行了一个重定向(redirect)。(缺省情况下,这个值设置为false,因为redirect比forward慢。)最后,第五个构造器中的contextRelative布尔值表示该路径是否应该是context-relative的,而不是module-relative的。

同样,一个ActionForward实例也可以有一个逻辑名称,你可以用这个名称来查找与一个特殊的ActionMapping对象相关的实例。(参见本系列第四部分关于ActionMapping的讲述。)

学习ActionForward类的方法
ActionForward类定义了三个保护字段——name、path和redirect——它们构成了ActionForward的三个属性。ActionForward类提供getter和setter方法来从这些字段读值、给这些字段赋值。这些方法是不需要说明的,定义如下:

public boolean getContextRelative()
public void setContextRelative(boolean 
	contextRelative)
public String getName() 
public void setName(String name) 
public String getPath() 
public void setPath(String path) 
public boolean getRedirect() 
public void setRedirect(boolean redirect) 

除此之外,ActionForward类还重载了toString方法并返回:

"ActionForward[" + name + "]"

其中name是名称字段。

最后,还有一个freeze方法,它固定了一个组件的配置。

再次运用Login应用程序
要完全了解ActionForward类,我们需要再次运用在本系列第一部分和第二部分构建的login应用程序。你可以下载完整的应用程序,把它重命名为myStrutsApp2。它的web.xml和struts-config.xml文件同myStrutsApp1中的文件是一样的,JSP页面也没有改变。只有action类同以前不同(见列表1)。

注意下面这行代码是新的:

return (new ActionForward("/mainMenu.jsp"));

它替代了下面这些代码,现在它们都被注释出来了:

RequestDispatcher rd = 
	request.getRequestDispatcher("/mainMenu.jsp");
rd.forward(request, response);

同样,下面这些代码也都被重写了:

      // RequestDispatcher rd = 
			request.getRequestDispatcher(
			"/login.jsp");
      // rd.forward(request, response);

新的代码变成:

return (new ActionForward("/login.jsp"));

ViewSecretAction类
ViewSecretAction也变得更好了(见列表2)。execute方法最后的这三行代码现在由一行来处理了,返回(new ActionForward (“/viewSecret.jsp”)):

    //    RequestDispatcher rd = 
			request.getRequestDispatcher(
			"/viewSecret.jsp");
    //    rd.forward(request, response);
    //    return null;

接下来,我们来重新查看LogoutAction类(见列表3)。注意execute方法中下面这些代码已经被替代了:

    // RequestDispatcher rd = 
			request.getRequestDispatcher(
			"/login.jsp");
    // rd.forward(request, response);
    // return null;

你只需要用下面这一行代码来取代它就行了:

 return (new ActionForward("/login.jsp"));

ActionForward是个很有用、功能很多的类,它可以让你更简单、更快、更直接地完成许多事情,这可能就是它很受欢迎的原因。在本系列的第四部分,你可以了解另一个重要的类org.apache.struts.action.ActionMapping,它可以使你的代码更有效、更漂亮。


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值