`

关于Struts中DispatchAction的一些分析

    博客分类:
  • Java
阅读更多

相信用过Struts框架的朋友应该都知道有个叫DispatchAction的东西,主要是用来解决因Action过多而导致代码文件膨胀的。

我在此首先假设有个自己写的Action类叫UserAction,并且继承自DispatchAction,同时,在UserAction写了saveUser()、deleteUser()、updateUser()三个方面,在Struts配置文件中对应的parameter参数配置为method,path参数配置为userAction。那么,对应与客户端调用UserAction中相应方法的方式为:

 

.../userAction.do?method=saveUser

.../userAction.do?method=deleteUser

.../userAction.do?method=updateUser

 

虽然,相比写三个普通的Action或者在一个Action通过request.getParameter()的方式去实现有一定的好处,但是,同时,也带来了一个问题。万一由于用户误操作修改了method之后的参数方法,且方法并未在UserAction中出现,那么则会抛出名为NoSuchMethodException的异常。下面对于这个问题,提供一些解决该问题的思路。

 protected Method getMethod(String name)
            throws NoSuchMethodException {

        synchronized(methods) {
            Method method = (Method) methods.get(name);
            if (method == null) {
                method = clazz.getMethod(name, types);
                methods.put(name, method);
            }
            return (method);
        }

    }

 通过阅读DispatchAction的源码,其中里面有这么一段代码,抛出了上述提及的异常,其实,我们可以对DispatchAction这个类进行下改造方可解决问题。

   protected Method getMethod(String name)
           {
        synchronized(methods) {
            Method method = (Method) methods.get(name);
            if (method == null) {
                try {
					method = clazz.getMethod(name, types);
				} catch (SecurityException e) {
					e.printStackTrace();
				} catch (NoSuchMethodException e) {
                                       //当出现异常时,抛出一个自定义的异常,同时跳转错误提示页码,并显示错误信息!



					throw new AppException("操作错误,请检查操作!");
				}
                methods.put(name, method);
            }
            return (method);
        }
    }

 通过以上的改造,那么对于method参数,不管它的值怎么修改都不会直接抛出一堆普通用户所看不懂的错误信息了,而是跳转到了相应的错误提示页面,增强了系统的友好性。其实,这个方面也并没什么技术含量,无非就是稍微改造了下源代码。

对于DispatchAction如果参数method省略的话,可以重写它的unspecified()方法。

以上是个人在使用DispatchAction过程中的一些心得。其实任何事物都是有两面性的,看你怎么权衡了。 DispatchAction的优点上面也有简要提及,对于它的缺点除了会产生上述问题,还有个问题就是后台代码的方法名会因此而暴露在地址栏。当然也有一些隐藏的方法,比如利用Javascript动态生成一个form采用post方式提交,但是如果存在参数的传递时,问题就会变得有些复杂。不知通过进一步改造 DispatchAction是否可解决问题,本人还没研究过……

分享到:
评论

相关推荐

    struts中dispatchAction用法

    Struts是Java Web开发中的一款经典MVC框架,它的核心组件之一是DispatchAction,这个组件在...通过学习和分析这些文件,初学者可以更深入地理解Struts中DispatchAction的使用和工作原理,从而更好地进行Java Web开发。

    利用struts标签,dispatchAction,实现增删改查

    在本教程中,我们将深入探讨如何利用Struts的标签库和DispatchAction来实现数据的增删改查操作,这对于初学者来说是一个非常实用的学习主题。 首先,`DispatchAction`是Struts中的一个特殊Action类,它允许我们根据...

    SSH整合继承DispatchAction的简单例子

    DispatchAction是Struts中的一个抽象类,它是Struts MVC模式中的Controller部分。当一个HTTP请求到达时,Struts会根据配置的ActionMapping找到对应的Action执行。DispatchAction允许我们在一个Action类中定义多个...

    struts从入门到精通.doc

    - 分析了Struts的优点,如易于维护、良好的扩展性等,同时也指出了其潜在的局限性和缺点。 - **2.5 Struts入门经验** - 分享了一些入门Struts时需要注意的经验和技巧。 - **2.6 用Struts制作登录页面** - 详细...

    张孝祥09年struts高级实战进阶PPT

    Struts请求处理过程的源码分析与digester** 理解Struts的内部工作原理,包括ActionServlet如何解析配置文件(struts-config.xml),以及digester如何解析XML文档生成相应的Java对象。 在实际开发中,遵循以上知识...

    struts高级实战进阶-传智播客

    在本文中,我们将深入探讨Struts高级实战进阶的一些关键知识点,包括MVC模式、Struts请求处理时序图、Struts的使用技巧以及实际案例分析。 首先,MVC模式是一种软件设计模式,它将应用程序分为三个主要部分:模型...

    struts1实现文件上传

    4. **DispatchAction**:Struts1中的一个特殊Action,支持方法调度。 5. **FormFile**:用于封装文件上传数据的对象。 6. **HttpServletRequest** 和 **HttpServletResponse**:分别代表HTTP请求和响应对象。 #### ...

    struts1.2.8源码包

    在 Struts 中,DispatchAction 或者.struts-config.xml 配置文件中的 ActionMapping 定义了控制器的行为。 在 Struts 1.2.8 版本中,以下是一些关键组件及其作用: 1. **ActionServlet**:这是 Struts 的核心 ...

    struts2范例教程

    - **struts.xml**:取代了Struts1.x中的Struts-config.xml,作为核心配置文件,配置了Action、Result等元素,支持更灵活的配置方式。 - **Result**:类似于Forward,但功能更强大,支持多种视图技术,如JSP、...

    09年struts高级实战进阶PPT.ppt

    此外,PPT还强调了在使用Struts开发时的一些注意事项,如Action应为单实例且线程安全,配置文件中的path属性需要以"/"开头,以及如何使用Struts标签库来优化代码。 通过这些内容的学习,开发者能够深入理解Struts的...

    struts1下图片上传下载

    Struts1框架作为Java Web应用开发中的一个重要工具,提供了丰富的功能支持来实现文件上传下载。本文将详细介绍如何在Struts1框架下实现图片的上传与下载功能。 #### 二、Struts1简介 Struts1是一个基于MVC(Model-...

    赖家材Struts 传智播客笔记下载

    以上是赖家材老师的 Struts 传智播客笔记中关于 Struts 的基础和高级知识点的详细介绍,涵盖了 Struts 的入门概念、工作原理以及高级功能等方面的内容。这些知识点对于初学者来说非常宝贵,能够帮助他们快速掌握 ...

    张孝祥广州讲座-struts高级实战进阶.ppt

    7. **文件上传**:Struts支持文件上传功能,通过使用FileUpload组件,可以在表单中添加文件域,然后在Action中处理文件上传请求。 8. **DispatchAction的应用**:DispatchAction允许一个Action处理多个请求,通过...

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

    11.2.6 DispatchAction(多动作控制器) 11.3 利用Struts实现用户登录的示例 11.6.1 编写实现登录的页面login.jsp 11.6.2 编写存储登录用户信息的类User.java 11.6.3 编写控制器LoginAction.java 11.6.4 配置Struts...

    搜索篇:Struts、Lucene的Web实例

    Struts通过ActionForm、Actions和DispatchAction等组件,实现了请求处理和业务逻辑的分离,降低了视图和模型之间的耦合度。 Lucene,另一方面,是一个高性能、全文本搜索库。它允许开发者在Java应用程序中实现复杂...

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

    11.2.6 DispatchAction(多动作控制器) 11.3 利用Struts实现用户登录的示例 11.6.1 编写实现登录的页面login.jsp 11.6.2 编写存储登录用户信息的类User.java 11.6.3 编写控制器LoginAction.java 11.6.4 配置Struts...

    非常好的struts2教程

    MVC模式的回顾 回顾Struts的请求处理时序图 使用超连接的技巧 封装Formbean数据时的问题 防止表单重复提交 使用复选框的技巧 使用下拉列表框的技巧 文件上传 ...Struts请求处理过程的源码分析与digester

Global site tag (gtag.js) - Google Analytics