`
alex8946
  • 浏览: 359156 次
  • 性别: Icon_minigender_1
  • 来自: 广东广州
社区版块
存档分类
最新评论

用ActionForward优化你的Struts应用程序

    博客分类:
  • J2EE
阅读更多
 简单之中也蕴涵着复杂性,我们在本系列第一部分和第二部分创建、研究一个简单的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,它可以使你的代码更有效、更漂亮。
分享到:
评论

相关推荐

    Spring面试题

    所以,用 Spring AOP 编写的应用程序代码是松散耦合的。 AOP 的功能完全集成到了 Spring 事务管理、日志和其他各种特性的上下文中。 IOC 容器 Spring 设计的核心是 org.springframework.beans 包,它的设计目标是...

    超级有影响力霸气的Java面试题大全文档

    当应用程序在对象上调用了一个需要花费很长时间来执行的方法,并且不希望让程序等待方法的返回时,就应该使用异步编程,在很多情况下采用异步途径往往更有效率。 20、abstract class和interface有什么区别? ...

    Java面试宝典2010版

    5、说说你用过那些ajax技术和框架,说说它们的区别 四. Java web部分 1、Tomcat的优化经验 2、HTTP请求的GET与POST方式的区别 3、解释一下什么是servlet; 4、说一说Servlet的生命周期? 5、Servlet的基本架构 ...

    最新Java面试宝典pdf版

    5、说说你用过那些ajax技术和框架,说说它们的区别 85 四. Java web部分 85 1、Tomcat的优化经验 85 2、HTTP请求的GET与POST方式的区别 85 3、解释一下什么是servlet; 85 4、说一说Servlet的生命周期? 86 5、Servlet...

    Java面试笔试资料大全

    5、说说你用过那些ajax技术和框架,说说它们的区别 85 四. Java web部分 85 1、Tomcat的优化经验 85 2、HTTP请求的GET与POST方式的区别 85 3、解释一下什么是servlet; 85 4、说一说Servlet的生命周期? 86 5、Servlet...

    JAVA面试宝典2010

    5、说说你用过那些ajax技术和框架,说说它们的区别 85 四. Java web部分 85 1、Tomcat的优化经验 85 2、HTTP请求的GET与POST方式的区别 85 3、解释一下什么是servlet; 85 4、说一说Servlet的生命周期? 86 5、Servlet...

    Java面试宝典-经典

    5、说说你用过那些ajax技术和框架,说说它们的区别 85 四. Java web部分 85 1、Tomcat的优化经验 85 2、HTTP请求的GET与POST方式的区别 85 3、解释一下什么是servlet; 85 4、说一说Servlet的生命周期? 86 5、Servlet...

    java面试题大全(2012版)

    5、说说你用过那些ajax技术和框架,说说它们的区别 85 四. Java web部分 85 1、Tomcat的优化经验 85 2、HTTP请求的GET与POST方式的区别 85 3、解释一下什么是servlet; 85 4、说一说Servlet的生命周期? 86 5、Servlet...

    Java面试宝典2012版

    5、说说你用过那些ajax技术和框架,说说它们的区别 85 四. Java web部分 85 1、Tomcat的优化经验 85 2、HTTP请求的GET与POST方式的区别 85 3、解释一下什么是servlet; 85 4、说一说Servlet的生命周期? 86 5、...

    java面试宝典2012

    5、说说你用过那些ajax技术和框架,说说它们的区别 92 四. Java web部分 93 1、Tomcat的优化经验 93 2、HTTP请求的GET与POST方式的区别 93 3、解释一下什么是servlet; 93 4、说一说Servlet的生命周期? 93 5、Servlet...

    Java面试宝典2012新版

    5、说说你用过那些ajax技术和框架,说说它们的区别 85 四. Java web部分 85 1、Tomcat的优化经验 85 2、HTTP请求的GET与POST方式的区别 85 3、解释一下什么是servlet; 85 4、说一说Servlet的生命周期? 86 5、Servlet...

    java面试题

    72.2. STRUTS的应用(如STRUTS架构) 66 72.3. 请写出Struts的工作原理、工作机制 67 72.4. struts的处理流程。 67 72.5. Struts 2框架的大致处理流程如下: 68 72.6. Struts体系结构中的组件 69 72.7. struts如何实现...

    java 面试题 总结

    当应用程序在对象上调用了一个需要花费很长时间来执行的方法,并且不希望让程序等待方法的返回时,就应该使用异步编程,在很多情况下采用异步途径往往更有效率。 17、abstract class和interface有什么区别? 声明方法...

    Java 面试宝典

    8、用最有效率的方法算出 2 乘以 8 等於几? ............................................................. 10 9、请设计一个一百亿的计算器 ....................................................................

Global site tag (gtag.js) - Google Analytics