相信用过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的异常。下面对于这个问题,提供一些解决该问题的思路。
Java代码 复制代码 收藏代码
1.protected Method getMethod(String name)
2. throws NoSuchMethodException {
3.
4. synchronized(methods) {
5. Method method = (Method) methods.get(name);
6. if (method == null) {
7. method = clazz.getMethod(name, types);
8. methods.put(name, method);
9. }
10. return (method);
11. }
12.
13. }
通过阅读DispatchAction的源码,其中里面有这么一段代码,抛出了上述提及的异常,其实,我们可以对DispatchAction这个类进行下改造方可解决问题。
Java代码 复制代码 收藏代码
1.protected Method getMethod(String name)
2. {
3. synchronized(methods) {
4. Method method = (Method) methods.get(name);
5. if (method == null) {
6. try {
7. method = clazz.getMethod(name, types);
8. } catch (SecurityException e) {
9. e.printStackTrace();
10. } catch (NoSuchMethodException e) {
11. <span style="color: rgb(0, 0, 0);">//当出现异常时,抛出一个自定义的异常,同时跳转错误提示页码,并显示错误信息!</span>
12.
13.
14.
15. throw new AppException("操作错误,请检查操作!");
16. }
17. methods.put(name, method);
18. }
19. return (method);
20. }
21. }
通过以上的改造,那么对于method参数,不管它的值怎么修改都不会直接抛出一堆普通用户所看不懂的错误信息了,而是跳转到了相应的错误提示页面,增强了系统的友好性。其实,这个方面也并没什么技术含量,无非就是稍微改造了下源代码。
对于DispatchAction如果参数method省略的话,可以重写它的unspecified()方法
|