快速业务通道

Struts1.x系列教程(18):使用DispatchAction类调用多个Action方法 - 编程入门网

作者 佚名技术 来源 NET编程 浏览 发布时间 2012-06-21
配置代码来配置MyDispatchAction:

<action path="/locale" type="action.MyDispatchAction" parameter="language"/>

其中parameter参数表示用于指定Action的请求参数名。

在启动Tomcat后,可通过如下的URL进行测试:

显示英文页面:

http://localhost:8080/samples/locale.do?language=en

显示法文页面:

http://localhost:8080/samples/locale.do?language=fr

显示中文页面(默认页面):

http://localhost:8080/samples/locale.do

虽然上面的代码可以很好地调用相应的Action方法,但在一些情况时,如请求参数language指定的Action方法不存在时,就会抛出异常。那么如果我们想在非正常情况下都调用默认的处理Action动作的方法(也就是unspecificed方法)该怎么办呢?

实现上,实现这个功能也非常简单,只要我们知道在什么条件下调用unspecified方法,然后在非正常情况下,都将条件设为调用unspecified方法的条件就可实现这个功能。在查看DispatchAction类的源代码后,可找到如下的代码片段:

if(name == null) //name表示Action方法名 {    return this.unspecified(mapping,form,request,response); }

从上面的代码可知,只有当name为null时才会调用unspecified方法。这个name值实际上也就是language参数的值。也就是说,只有当language参数不存在时,name才会为null。如果在language的参数值所指的Action方法不存在时或者name为空串的情况下都将name设为null,那么就可以达到我们的目的。

在DispatchAction类中有一个dispatchMethod方法,可以在这个方法中处理请求参数值为空串(也就是当“language=”时将方法名设为null)和Action方法未找到的情况。在Action类中有两个特殊方法:execute和perform。如果调用了这两个方法,将会出现递归调用的情况。因此,在调用这两个方法时也需要将方法名设为null。这个工作可以在DispatchAction类的getMethodName方法中实现。为了完成这个功能,需要将上面的代码放到MyDispatchAction类中。 

protected ActionForward dispatchMethod(ActionMapping mapping,            ActionForm form, HttpServletRequest request,            HttpServletResponse response, String name) throws Exception{      ActionForward af = null;      // 在language参数值为空串的情况下,将方法名赋为null      if (name != null)  // name表示Action方法名,也是language的参数值          if (name.equals(""))              name = null;      try      {             af = super.dispatchMethod(mapping, form, request, response, name);      }      catch(NoSuchMethodException e)  // 处理Action方法未找到的情况      {           // 在language的参数值没有对应的Action方法时,将方法名赋为null          name = null;          af = super.dispatchMethod(mapping, form, request, response, name);      }      return af;}  // 当language的参数值为execute或perfore时,必须将方法名赋为null,否则会出现递归调用protected String getMethodName(ActionMapping mapping, ActionForm form,          HttpServletRequest request, HttpServletResponse response,          String parameter) throws Exception{      String methodName = super.getMethodName(mapping, form, request, response, parameter);      if ("execute".equals(methodName) || "perform".equals(methodName))           return null;  // 如果访问的是execute和perform,直接将方法名设为null      return methodName;}

凌众科技专业提供服务器租用、服务器托管、企业邮局、虚拟主机等服务,公司网站:http://www.lingzhong.cn 为了给广大客户了解更多的技术信息,本技术文章收集来源于网络,凌众科技尊重文章作者的版权,如果有涉及你的版权有必要删除你的文章,请和我们联系。以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢!

分享到: 更多

Copyright ©1999-2011 厦门凌众科技有限公司 厦门优通互联科技开发有限公司 All rights reserved

地址(ADD):厦门软件园二期望海路63号701E(东南融通旁) 邮编(ZIP):361008

电话:0592-5908028 传真:0592-5908039 咨询信箱:web@lingzhong.cn 咨询OICQ:173723134

《中华人民共和国增值电信业务经营许可证》闽B2-20100024  ICP备案:闽ICP备05037997号