精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
|
|
---|---|
作者 | 正文 |
发表时间:2012-05-31
最后修改:2012-06-01
本文由flym发布,博客地址为:http://www.iflym.com/index.php/code/201205300001.html(转载请注明) 本文基于xwork 2.1.6.1,struts2版本2.1.8.1。
众所周知,在使用struts2时,所写的逻辑方法都是无参数的,所以的参数都是写在action内部的。如果一个action方法过多,而每个方法所使用的参数都不尽相同时,就会造成一个action内参数过多,且每个参数都有get/set,造成程序混乱,并且在可读性和使用上都不太方便。因为,你不知道你所调用的方法使用了哪些参数,而这个方法会返回哪些结果,在界面上哪些get对象是可以使用的。
那么,能否直接在方法上使用参数呢,就像在action里面一样,直接注入,直接使用,并且没有副作用呢?你想像使用spring mvc甚至更好的方式(无注解)使用struts2吗?这种想法是可以滴,当然现有的struts2是不支持滴。不过,我们可以修改之,让其支持。 本篇所使用以及参考的相关技术前提(可google之)
本篇所提供内容工作前提
本篇技术内容索引
获取方法信息
首先我们需要能够获取所调用的方法信息。方法信息即包括方法名称,同样包括方法的参数信息;而参数信息包括参数名和参数类型以及参数泛型(后面会用到)。 如我们的方法为: public void login(User user, Map<String, String> other)
我们期望获取的方法信息有 方法名:login 方法参数信息(按顺序): 参数名:user 类型:User 泛型:无 参数名:other 类型:Map 泛型:<String,String>
所以提供一个数据结构Map<Method, MethodParam[]> methodParamCache来保存这些信息,MethodParam构造信息如下所示:
public static class MethodParam { public final Class type;//参数类型 public final String name;//参数名称 public final Class parameterizedType0;//泛型参数0,用于描述List<XXX>类泛型,以及Map<XXX,YYY>中XXX泛型 public final Class parameterizedType1;//用于描述Map<XXX,YYY>中的YYY泛型 }而Method对象,可以根据由界面传递过来的action以及method名称进行获取,我们提供一个类似findByMethodName的方法即可,方法实现简单如下所示: public static Method getUniquePublicMethod(Class<?> clazz, String methodName) throws NoSuchMethodException { Map<String, List<Method>> m = methodCache.get(clazz); if(m == null) { m = resolveClass(clazz);//使用class.getMethods()迭代方法信息,只需要公共方法即可 methodCache.put(clazz, m); } List<Method> mList = m.get(methodName); //空方法判断以及多个方法判断 return mList.get(0); } 声明:ITeye文章版权属于作者,受法律保护。没有作者书面许可不得转载。
推荐链接
|
|
返回顶楼 | |
发表时间:2012-05-31
最后修改:2012-06-01
删除.................. |
|
返回顶楼 | |
发表时间:2012-05-31
最后修改:2012-06-01
........................ |
|
返回顶楼 | |
发表时间:2012-05-31
最后修改:2012-06-01
....................................... |
|
返回顶楼 | |
浏览 2277 次