Struts1.x系列教程(18):使用DispatchAction类调用多个Action方法 - 编程入门网
配置代码来配置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类的源代码后,可找到如下的代码片段:
从上面的代码可知,只有当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 为了给广大客户了解更多的技术信息,本技术文章收集来源于网络,凌众科技尊重文章作者的版权,如果有涉及你的版权有必要删除你的文章,请和我们联系。以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢! |