相信用过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是否可解决问题,本人还没研究过……