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

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

阅读更多

本文为原创,如需转载,请注明作者和出处,谢谢!

上一篇:Struts1.x系列教程(17):使用IncludeAction和ForwardAction类包含和转入Web资源

在使用Struts动作时,每一个Action都需要编写一个类,并且要在struts-config.xml进行配置。这对于一个拥有很多ActionWeb程序来说,工作量是非常大的。为此,Struts提供了DispatchAction类,这个类允许将一个Action作为一个方法来调用。在Web浏览器中通过请求参数来指定要调用的动作。
虽然
DispatchAction类是一个抽象类,但其中却没有一个抽象方法。因此,DisplatchAction的子类不用实现任何DisplatchAction类中的方法。但如果要处理Action代码,就必须根据相应的Action来编写Action方法。一个Action方法除了方法名和execute方法不一样外,其他的都和execute方法完全一样。但编写Action方法时要注意,Action方法名必须和用于指定动作的请求参数值一致(大小写也必须一致)。在下面的例子中演示了通过DispatchAction类实现方法和Action的对应。在这个例子中,有三个方法:frenunspecificed。其中fren是两个Action方法,分别用于将当前页面转发到法文和英文页面,而当用于指定Action的请求参数不存在时,则调用unspecificed方法(在这个方法中将当前页面转发到中文页面)。在这个程序中使用的用于指定Action的请求参数为language(读者可以指定自己的请求参数)。
<samples工程目录>\src\action目录建立一个MyDispatchAction.java文件,代码如下:

<!--<br /> <br /> Code highlighting produced by Actipro CodeHighlighter (freeware)<br /> http://www.CodeHighlighter.com/<br /> <br /> -->packageaction;

importjavax.servlet.RequestDispatcher;
importjavax.servlet.http.*;
importorg.apache.struts.action.*;
importorg.apache.struts.actions.*;

publicclassMyDispatchActionextendsDispatchAction
{
//forward到法文页面
publicActionForwardfr(ActionMappingmapping,ActionFormform,
HttpServletRequestrequest,HttpServletResponseresponse)
{
try
{
RequestDispatcherrd
=request.getRequestDispatcher("/newGlobal.jsp?language=fr");
rd.forward(request,response);
}
catch(Exceptione)
{
}
returnnull;
}
//forward到英文页面
publicActionForwarden(ActionMappingmapping,ActionFormform,
HttpServletRequestrequest,HttpServletResponseresponse)
{
try
{
RequestDispatcherrd
=request.getRequestDispatcher("/newGlobal.jsp?language=en");
rd.forward(request,response);
}
catch(Exceptione)
{
}
returnnull;
}
//在未使用language=fr和language=en作为访问参数的情况时调用这个方法
protectedActionForwardunspecified(ActionMappingmapping,ActionFormform,
HttpServletRequestrequest,HttpServletResponseresponse)
throwsException
{
try
{
//forward到中文页面
RequestDispatcherrd=request.getRequestDispatcher("/newGlobal.jsp?language=zh");
rd.forward(request,response);
}
catch(Exceptione)
{
}
returnnull;
}
}

struts-config.xml文件中加入如下的配置代码来配置MyDispatchAction

<!--<br /> <br /> Code highlighting produced by Actipro CodeHighlighter (freeware)<br /> http://www.CodeHighlighter.com/<br /> <br /> --><actionpath="/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类的源代码后,可找到如下的代码片段:

<!--<br /> <br /> Code highlighting produced by Actipro CodeHighlighter (freeware)<br /> http://www.CodeHighlighter.com/<br /> <br /> -->if(name==null)//name表示Action方法名
{
returnthis.unspecified(mapping,form,request,response);
}

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

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

<!--<br /> <br /> Code highlighting produced by Actipro CodeHighlighter (freeware)<br /> http://www.CodeHighlighter.com/<br /> <br /> -->protectedActionForwarddispatchMethod(ActionMappingmapping,
ActionFormform,HttpServletRequestrequest,
HttpServletResponseresponse,Stringname)
throwsException
{
ActionForwardaf
=null;
//在language参数值为空串的情况下,将方法名赋为null
if(name!=null)//name表示Action方法名,也是language的参数值
if(name.equals(""))
name
=null;
try
{
af
=super.dispatchMethod(mapping,form,request,response,name);
}
catch(NoSuchMethodExceptione)//处理Action方法未找到的情况
{
//在language的参数值没有对应的Action方法时,将方法名赋为null
name=null;
af
=super.dispatchMethod(mapping,form,request,response,name);
}
returnaf;
}
//当language的参数值为execute或perfore时,必须将方法名赋为null,否则会出现递归调用
protectedStringgetMethodName(ActionMappingmapping,ActionFormform,
HttpServletRequestrequest,HttpServletResponseresponse,
Stringparameter)
throwsException
{
StringmethodName
=super.getMethodName(mapping,form,request,response,parameter);
if("execute".equals(methodName)||"perform".equals(methodName))
returnnull;//如果访问的是execute和perform,直接将方法名设为null
returnmethodName;
}

现在我们可以用任何请求参数来访问locale动作,只要未找到Action方法,就会调用默认的unspecified方法。读者可以使用如下的URL来实验一下:

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

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


下一篇:Struts1.x系列教程(19):LookupDispatchAction类处理一个form多个submit



国内最棒的Google Android技术社区(eoeandroid),欢迎访问!

《银河系列原创教程》发布

《Java Web开发速学宝典》出版,欢迎定购

分享到:
评论

相关推荐

    Struts中等同于DispatchAction类方法

    在页面中用js传递执行方法参数,传递到后台执行, 在你用的Action类中的方法名前加“run“及可被调用。

    搞定J2EE:STRUTS+SPRING+HIBERNATE整合详解与典型案例 (1)

    14.9.4 发布控制器类EditAction.java 14.9.5 内容控制器类ContentAction.java 14.9.6 浏览内容的控制器类IndexAction.java 14.10 编写Struts的配置文件struts-config.xml 14.11 编写Spring和Hibernate的配置文件...

    搞定J2EE:STRUTS+SPRING+HIBERNATE整合详解与典型案例 (2)

    14.9.4 发布控制器类EditAction.java 14.9.5 内容控制器类ContentAction.java 14.9.6 浏览内容的控制器类IndexAction.java 14.10 编写Struts的配置文件struts-config.xml 14.11 编写Spring和Hibernate的配置文件...

    搞定J2EE:STRUTS+SPRING+HIBERNATE整合详解与典型案例 (3)

    14.9.4 发布控制器类EditAction.java 14.9.5 内容控制器类ContentAction.java 14.9.6 浏览内容的控制器类IndexAction.java 14.10 编写Struts的配置文件struts-config.xml 14.11 编写Spring和Hibernate的配置文件...

    ssh(structs,spring,hibernate)框架中的上传下载

    如果有多个映射文件需要声明,使用类路径映射方式显然比直接单独指定映射文件名的方式要简便。  第27~30行定义了Spring代理Hibernate数据操作的HibernateTemplate模板,而第32~34行将该模板注入到tfileDAO中。  ...

    李兴华Java Web开发实战经典(高清版) Part2

    15.3、开发第一个Struts程序 15.4、Struts工作原理 15.5、深入Struts应用 15.6、本章摘要 15.7、开发实战讲解(基于Oracle数据库) 第16章 Struts常用标签库 16.1、Struts标签库简介 16.2、Bean标签 ...

    李兴华Java Web开发实战经典.pdf (高清版) Part1

    15.3、开发第一个Struts程序 15.4、Struts工作原理 15.5、深入Struts应用 15.6、本章摘要 15.7、开发实战讲解(基于Oracle数据库) 第16章 Struts常用标签库 16.1、Struts标签库简介 16.2、Bean标签 ...

    MLDN+李兴华+Java+Web开发实战经典.part3.rar )

    15.3、开发第一个Struts程序 15.4、Struts工作原理 15.5、深入Struts应用 15.6、本章摘要 15.7、开发实战讲解(基于Oracle数据库) 第16章 Struts常用标签库 16.1、Struts标签库简介 16.2、Bean标签 ...

    java面试题

    71.18.1. Assigned 63 71.18.2. Hilo 63 71.18.3. Increment 64 71.18.4. Identity 64 71.18.5. Sequence 64 71.18.6. Native 64 71.18.7. UUID 64 71.18.8. Foreign GUID 65 71.19. Hibernate源码中几个包的作用...

    李兴华 Java Web 开发实战经典_带源码_高清pdf 带书签 上

    第1章 JAVA WEB开发简介 1.1、WEB发展历程 1.2、企业开发架构 1.3、JAVA EE架构 1.4、JAVA EE核心设计模式 1.5、Struts开发框架 1.6、本章摘要 1.7、开发实战讲解 第2章 HTML、JavaScript简介 2.1、服务器...

    java web 视频、电子书、源码(李兴华老师出版)

    15.3、开发第一个Struts程序 15.4、Struts工作原理 15.5、深入Struts应用 15.6、本章摘要 15.7、开发实战讲解(基于Oracle数据库) 第16章 Struts常用标签库 16.1、Struts标签库简介 16.2、Bean标签 ...

    李兴华 java_web开发实战经典 源码 完整版收集共享

    第1章 JAVA WEB开发简介 1.1、WEB发展历程 1.2、企业开发架构 1.3、JAVA EE架构 1.4、JAVA EE核心设计模式 1.5、Struts开发框架 1.6、本章摘要 1.7、开发实战讲解 第2章 HTML、JavaScript简介 2.1、服务器...

    李兴华 Java Web 开发实战经典_带源码_高清pdf 带书签 下

    第1章 JAVA WEB开发简介 1.1、WEB发展历程 1.2、企业开发架构 1.3、JAVA EE架构 1.4、JAVA EE核心设计模式 1.5、Struts开发框架 1.6、本章摘要 1.7、开发实战讲解 第2章 HTML、JavaScript简介 2.1、服务器...

    李兴华 Java Web 开发实战经典 高清扫描版Part3

    第1章 JAVA WEB开发简介 1.1、WEB发展历程 1.2、企业开发架构 1.3、JAVA EE架构 1.4、JAVA EE核心设计模式 1.5、Struts开发框架 1.6、本章摘要 1.7、开发实战讲解 第2章 HTML、JavaScript简介 2.1、服务器...

    《程序天下:J2EE整合详解与典型案例》光盘源码

    14.9.4 发布控制器类EditAction.java 14.9.5 内容控制器类ContentAction.java 14.9.6 浏览内容的控制器类IndexAction.java 14.10 编写Struts的配置文件struts-config.xml 14.11 编写Spring和Hibernate的配置文件...

    java面试资料

    客户端请求被ActionServlet接收,然后... 请求转交给Action或者DispatchAction,然后由Action或者DispatchAction调用模 型处理当前用户的请求,最后处理的结果再由ActionServlet调用JSP将处理结果回 复给客户端。

Global site tag (gtag.js) - Google Analytics