`
showmystage
  • 浏览: 55034 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
最近访客 更多访客>>
社区版块
存档分类
最新评论

用ActionForward优化你的Struts应用程序

阅读更多

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

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

java 代码
  1. RequestDispatcher rd =    
  2.     request.getRequestDispatcher(destination);   
  3. rd.forward(request, response);   
  4.   

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

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

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

java 代码
  1. public ActionForward execute(   
  2.     ActionMapping mapping,   
  3.     ActionForm form, HttpServletRequest request,    
  4.         HttpServletResponse response)   
  5.     throws Exception  
因为当时我们还没有讲到ActionForward类,所以在本系列的第一部分和第二部分中所有Action类的execute方法都只返回了空值。现在,在一个Action类的execute方法中,你就可以用ActionForward类来代替下面这个RequestDispatcher对象实例了:
java 代码
  1. RequestDispatcher rd =    
  2.     request.getRequestDispatcher(destination);   
  3. rd.forward(request, response);   
  4.   
新的代码变成:
java 代码
  1. return (new ActionForward(destination));   
构建ActionForward对象
ActionForward类提供了下面五种构造器:
java 代码
  1. public ActionForward()   
  2. public ActionForward(String path)   
  3. public ActionForward(String path, boolean redirect)   
  4. public ActionForward(String name, String path, boolean redirect)   
  5. public ActionForward(String name, String path, boolean redirect, boolean contextRelative)   
  6.     
  7.   

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

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

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

java 代码
  1. public boolean getContextRelative()   
  2. public void setContextRelative(boolean    
  3.     contextRelative)   
  4. public String getName()    
  5. public void setName(String name)    
  6. public String getPath()    
  7. public void setPath(String path)    
  8. public boolean getRedirect()    
  9. public void setRedirect(boolean redirect)    
除此之外,ActionForward类还重载了toString方法并返回:
java 代码
  1. "ActionForward[" + name + "]"  

其中name是名称字段。

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

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

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

java 代码
  1. return (new ActionForward("/mainMenu.jsp"));  
它替代了下面这些代码,现在它们都被注释出来了:
java 代码
  1. RequestDispatcher rd =    
  2.     request.getRequestDispatcher("/mainMenu.jsp");   
  3. rd.forward(request, response);   
同样,下面这些代码也都被重写了:
java 代码
  1. // RequestDispatcher rd = request.getRequestDispatcher("/login.jsp");   
  2. // rd.forward(request, response);   
新的代码变成:
java 代码
  1. return (new ActionForward("/login.jsp"));   

 

ActionForward是个很有用、功能很多的类,它可以让你更简单、更快、更直接地完成许多事情,这可能就是它很受欢迎的原因。

分享到:
评论
1 楼 huangshengchao 2007-12-10  
ActionForward forward = mapping.findForward("addSuccess");
StringBuffer path = new StringBuffer(forward.getPath());
path.append("?tenterpriseOID=").append(vo.getTentoid()).append("&entname=").append(request.getParameter("entname"));
forward = new ActionForward(path.toString());
forward.setRedirect(true);//调用了这个方法后后面的中文参数变成了乱码 不调用却是正常的
return forward;


为什么 能否解释一下
谢谢

相关推荐

    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