服务热线:13616026886

技术文档 欢迎使用技术文档,我们为你提供从新手到专业开发者的所有资源,你也可以通过它日益精进

位置:首页 > 技术文档 > JAVA > 新手入门 > 基础入门 > 查看文档

使用actionforward优化struts应用程序

从一个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类同以前不同。

注意下面这行代码是新的: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也变得更好了。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,它可以使你的代码更有效、更漂亮。

扫描关注微信公众号