• Struts框架:ActionForward详细介绍


    首先,什么是"ActionForward"?

      ActionForward是 Struts1的核心类之一,其基类仅有4个属性:name / path / redirect / classname。在基于Struts1的Web应用程序开发过程中,Action操作完毕后程序会通过Struts1的配置文件struts-config.xml链接到指定的ActionForward,传到Struts1的核心类ActionServlet,ActionServlet使用 ActionForward提供的路径,将控制传递给下一个步骤。ActionForward控制接下来程序的走向。ActionForward代表一个应用的URI,它包括路径和参数,例如:path=“/modify.do?method=edit&id=10”
      ActionForward的参数除了在struts-config.xml和页面中设置外,还可以通过在Action类中添加参数,或重新在Action中创建一个ActionForward。
    然后,ActionForward的“作用”是什么?
      封装转发路径,通俗点说就是说完成页面的跳转和转向。那它既然是转向,到底是转发还是重定向呢?默认的情况下,actionForward采用的是转发的方式进行页面跳转的。
      我在这里再啰嗦一下吧,也给自己加深下印象,说一下转发和重定向的区别。最大的区别就是转发的时候,页面的url地址不变,而重定向的时候页面的url地址会发生变化。简单说明一下原因,因为转发的时候是采用的一个request(请求),既然页面跳转前后是同一个request,页面url当然不会变了;而重定向采用的是2个request,页面跳转前后的url当然会不同了。对转发与重定向还有问题或者想要详细了解的请点击:http://www.cnblogs.com/shenliang123/archive/2011/10/27/2226892.html
      好,说到这,大家会问,既然actionForward跳转的方式默认的是转发,那如果我非要用重定向的方式,该如何设置呢?恩,这很简单,大家都在struts-config.xml坐过actionForward的配置吧,比如这句<forward name="login" path="/login.jsp" redirect="true"/>

      其实通常我们都没写redirect属性,而是采取的是它的默认值false,表示的是转发,如果设置为true,即为重定向。

      下面再说一下全局和局部ActionForward的概念。在编程的时候,我们有时候会遇到这种情况,当增加一条记录成功时,跳转到成功页面,在struts-config.xml我们做对“增加”这个action加一个<forward name="success" path="/login_success.jsp"/>;在修改一条记录成功时,我们也会跳转到成功页面,在struts-config.xml我们做对“修改”这个action加一个<forward name="success" path="/login_success.jsp"/>;而同样当删除一条记录成功时,跳转到成功页面,在struts-config.xml我们又对“删除”这个action加一个同样的<forward name="success" path="/login_success.jsp"/>;相信大家会对同样的代码重复的写干到反感吧,那有没有办法解决呢?有,那就是全局ActionForward,针对上面这种情况,我们在<action-mappings>标签的上面加上

    1 <global-forwards>  
    2     <forward name="success" path="/login_success.jsp"/>  
    3 </global-forwards> 

      上面就是对全局ActionForward的一种配置,而我们之前写的那些就是局部ActionForward。那么如果局部ActionForward和全局ActionForward同时出现,到底是按照哪个配置进行页面跳转呢?规则很简单,采用的是就近原则,就是说如果有局部ActionForward,就按照局部ActionForward就行跳转,如果没有就按照全局的跳转。

      相信有的朋友会说,我怎么不早说,ActionForward还可以设置重定向的跳转方式,然后他还不想对原来的struts-config.xml文件进行修改,想在写的Java文件的action中改,如下

    1 ActionForward af = mapping.findForward("login");  
    2 af.setRedirect(false); 

      这样当然也是可以的啦,不过记住要重启服务器,因为struts-config.xml文件不允许动态修改。

      我还想说明一点的是,我们也可以不依赖struts的ActionForward进行转向,不要学了一样,忘了之前学的,之前我们都是通过response进行转向的,在struts中,我们当然也可以,在action中覆写execute方法,如下:

     1 @Override  
     2     public ActionForward execute(ActionMapping mapping, ActionForm form,  
     3             HttpServletRequest request, HttpServletResponse response)  
     4             throws Exception {  
     5           
     6             //重定向  
     7             response.sendRedirect(request.getContextPath() + "/login.jsp");  
     8             return null;  
    9
        }  

      注意:return null是必须的。

      下面在介绍下动态ActionForward,动态的ActionForward是可以运行期修改的。有这么个场景:页面有一个输入域,我输入1的时候,跳转到1的页面,输入2跳转到2的页面,我们利用之前学过的知识来实现下,先配置下XML:

     1 <action-mappings>
     2     ······
     3     <action path="/dynaactionforward"  
     4             type="com.bjsxt.struts.DynaActionForwardTestAction" >  
     5   
     6         <forward name="page1" path="/page1.jsp"/>  
     7         <forward name="page2" path="/page2.jsp"/>  
     8       
     9     </action>  
    10 </action-mappings>  

      Jsp页面如下:

    1 <form action="dynaactionforward.do" method="post">  
    2         页面:<input type="text" name="page"><br>  
    3         <input type="submit" value="提交">   
    4 </form>  

      Java action如下:

     1 public class DynaActionForwardTestAction extends Action {  
     2     @Override  
     3     public ActionForward execute(ActionMapping mapping, ActionForm form,  
     4             HttpServletRequest request, HttpServletResponse response)  
     5             throws Exception {  
     6           
     7         String page = request.getParameter("page");  
     8         ActionForward af = null;  
     9         if ("1".equals(page)) {  
    10             af = mapping.findForward("page1");  
    11         }else if ("2".equals(page)) {  
    12             af = mapping.findForward("page2");  
    13         }  
    14         return af;  
    15       
    16     }  
    17

      相信这对大家来说是小菜一碟啦,但是如果我想在此基础上实现当我输入3,跳转到3的页面,输入4,5,。。。以此类推下去,怎么办呢,如果还是采用这种方式,很麻烦吧,改动的太多啦。此时我们可以考虑采用动态ActionForward,说白了就是我们自己构造一个ActionForward,通过new的方式,看一下改后的action

     1 public class DynaActionForwardTestAction extends Action {  
     2     @Override  
     3     public ActionForward execute(ActionMapping mapping, ActionForm form,  
     4             HttpServletRequest request, HttpServletResponse response)  
     5             throws Exception {  
     6           
     7         String page = request.getParameter("page");  
     8         ActionForward af = new ActionForward();  
     9         af.setPath("/page" + page + ".jsp?name=Tom");  
    10         return af;  
    11     }  
    12

      之后,再把XML中的<forward name="page1" path="/page1.jsp"/>,<forward name="page2" path="/page2.jsp"/>删除即可。大家还会发现动态ActionForward还有个好处,就是可以跟参数,此例中传递了name=tom的参数。

      本文非原创,引用于:http://blog.csdn.net/fengg5241/article/details/6539641

      支持原创!

  • 相关阅读:
    C# HTTP请求返回内容为乱码解决办法
    C# WinForm点击按钮后有黑色边框的解决办法
    C# WinForm 拖动无边框窗体
    C# 解决panel或者其他控件叠加时,此控件背景透明,显示的背景色为窗体背景色问题
    C# Winform的panel控件添加背景图片后窗体闪烁问题解决办法
    C# webBrower空间跨域问题处理办法
    C# Winform 点击TreeView控件节点的CheckBox不触发NodeMouseClick事件的做法
    C# Winform 快速点击TreeView控件的CheckBox导致显示不同步
    【转】input file标签限制上传文件类型
    使用node.js仿写Apache
  • 原文地址:https://www.cnblogs.com/oablog/p/6850845.html
Copyright © 2020-2023  润新知