论坛首页 Java企业应用论坛

在struts2(xwork)方法上直接使用参数进行逻辑处理(忘掉无参数方法,忘掉setter/getter)

浏览 2277 次
精华帖 (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之)

 

  • struts2(xwork)中valueStack中的工作原理
  • 在valueStack中CompoundRoot对象如何使用
  • OGNL的propertyAccessor以及扩展
  • struts2(xwork)所提供的ognl扩展
  • 使用spring中所提供的localVariable访问方法参数信息
  • java编译保存方法变量信息

本篇所提供内容工作前提

 

  • action中每个方法名称惟一(不支持方法重载)
  • java文件编译时保存了调试信息中的方法变量信息

 

本篇技术内容索引

 

  1. 获取方法信息
  2. 方法参数注入
  3. 方法调用调整
  4. Map及List泛型参数注入修正
  5. 方法内数据返回

 

获取方法信息

 

首先我们需要能够获取所调用的方法信息。方法信息即包括方法名称,同样包括方法的参数信息;而参数信息包括参数名和参数类型以及参数泛型(后面会用到)。

如我们的方法为:

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);
    }
 
   发表时间:2012-05-31   最后修改:2012-06-01

删除..................

0 请登录后投票
   发表时间:2012-05-31   最后修改:2012-06-01

........................

0 请登录后投票
   发表时间:2012-05-31   最后修改:2012-06-01

.......................................

0 请登录后投票
论坛首页 Java企业应用版

跳转论坛:
Global site tag (gtag.js) - Google Analytics