`
dylan0514sina.cn
  • 浏览: 92333 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

struts2或webwork嵌套集合类型转换

    博客分类:
  • any
 
阅读更多
给出例子代码
   public class TestAction{
   
        private List users;

      //////  getter setter

   }
  ....
  public class User{

      private  String username;

    ////getter setter
  }

在以上代码中,假设users集合装的是User类实例,则在于TestAction同包下建立一个TestAction-conversion.properties文件:
  Element_users = com.xxxx.User(早期用Collection_)

页面上输入用户名如下脚本
  <input name="users[0].username"/>

假设User用户有属于多个组group,那User变为
 public class User{

      private  String username;
      private  List groups;

    ////getter setter
  }

groups中存放的是com.yyy.Group类实例
   public class Group{

     private String gname;
   
    ////getter setter
 }

在于User同包下,建立User-conversion.properties:
Element_groups= com.yyy.Group
页面上输入组名如下
    <input name=users[0][0].gname  />

struts2或webwork给我们提供了以上支持,若是想明确集合中的对象,就在变量所属的类的同包下建立对应的***-conversion.properties,在文件中指定Element_xxx即可

假设有需求是集合中的元素也是集合,那struts2或webwork是不支持的,为了解决这个问题,首先重写XworkListPropertyAccessor
public class XWorkListPropertyAccessor extends ListPropertyAccessor
{

    public XWorkListPropertyAccessor()
    {
        _sAcc = new XWorkCollectionPropertyAccessor();
    }

    public Object getProperty(Map context, Object target, Object name)
        throws OgnlException
    {
        if(OgnlContextState.isGettingByKeyProperty(context) || name.equals("makeNew"))
            return _sAcc.getProperty(context, target, name);
        if(name instanceof String)
            return super.getProperty(context, target, name);
        OgnlContextState.updateCurrentPropertyPath(context, name);
        Class lastClass = (Class)context.get("last.bean.accessed");
        String lastProperty = (String)context.get("last.property.accessed");
        if((name instanceof Number) && OgnlContextState.isCreatingNullObjects(context) && XWorkConverter.getInstance().getObjectTypeDeterminer().shouldCreateIfNew(lastClass, lastProperty, target, null, true))
        {
            List list = (List)target;
            int index = ((Number)name).intValue();
            int listSize = list.size();
            if(lastClass == null || lastProperty == null)
                return super.getProperty(context, target, name);
            Class beanClass = XWorkConverter.getInstance().getObjectTypeDeterminer().getElementClass(lastClass, lastProperty, name);
            if(listSize <= index)
            {
                Object result = null;
                for(int i = listSize; i < index; i++)
                    list.add(null);

                try
                {
                    list.add(index, result = ObjectFactory.getObjectFactory().buildBean(beanClass, context));
                }
                catch(Exception exc)
                {
                    throw new XworkException(exc);
                }
                return result;
            }
            if(list.get(index) == null)
            {
                Object result = null;
                try
                {
                    list.set(index, result = ObjectFactory.getObjectFactory().buildBean(beanClass, context));
                }
                catch(Exception exc)
                {
                    throw new XworkException(exc);
                }
                return result;
            }
        }
        return super.getProperty(context, target, name);
    }
   //////////setProperty
    private XWorkCollectionPropertyAccessor _sAcc;
}

注意在getProperty返回result时,判断result是否List类型
public class MoreXWorkListPropertyAccessor extends XWorkListPropertyAccessor
{
    public Object getProperty(Map context, Object target, Object name)
        throws OgnlException
    {
        if(OgnlContextState.isGettingByKeyProperty(context) || name.equals("makeNew"))
            return _sAcc.getProperty(context, target, name);
        if(name instanceof String)
            return super.getProperty(context, target, name);
        OgnlContextState.updateCurrentPropertyPath(context, name);
        Class lastClass = (Class)context.get("last.bean.accessed");
        String lastProperty = (String)context.get("last.property.accessed");
        if((name instanceof Number) && OgnlContextState.isCreatingNullObjects(context) && XWorkConverter.getInstance().getObjectTypeDeterminer().shouldCreateIfNew(lastClass, lastProperty, target, null, true))
        {
            List list = (List)target;
            int index = ((Number)name).intValue();
            int listSize = list.size();
            if(lastClass == null || lastProperty == null)
                return super.getProperty(context, target, name);
            Class beanClass = XWorkConverter.getInstance().getObjectTypeDeterminer().getElementClass(lastClass, lastProperty, name);
            if(listSize <= index)
            {
                Object result = null;
                for(int i = listSize; i < index; i++)
                    list.add(null);

                try
                {
                    list.add(index, result = ObjectFactory.getObjectFactory().buildBean(beanClass, context));
                }
                catch(Exception exc)
                {
                    throw new XworkException(exc);
                }
                if(result instanceof List){
                  OgnlContextState.setLastBeanPropertyAccessed(context,lastProperty+"_i");
                  }
                return result;
            }
            if(list.get(index) == null)
            {
                Object result = null;
                try
                {
                    list.set(index, result = ObjectFactory.getObjectFactory().buildBean(beanClass, context));
                }
                catch(Exception exc)
                {
                    throw new XworkException(exc);
                }
    if(result instanceof List){
                  OgnlContextState.setLastBeanPropertyAccessed(context,lastProperty+"_i");
                  }

                return result;
            }
        }
        return super.getProperty(context, target, name);

   // 单例
   instance = new MoreXWorkListPropertyAccessor();
  private MoreXWorkListPropertyAccessor{}
   public MoreXWorkListPropertyAccessor getInstance(){return instance;}
    }  

编写拦截器,设置MoreXWorkListPropertyAccessor;拦截器一定要配置在static-params之前
  public class MoreDimensesSupportInterceptor extends AroundInterceptor{

    public void before(ActionInvocation invocation)throws Exception{
      OgnlRuntime.setPropertyAccessor(List.class,MoreXWorkListPropertyAccessor.getInstance());
 }
}

现在只需在TestAction.properties中指定
Element_users=java.util.ArrayList //二维集合配置
Element_users_i=com.xxx.User //二维集合配置

Element_users=java.util.ArrayList //三维集合配置
Element_users_i=java.util.ArrayList //三维集合配置
Element_users_i_i=com.xxx.User //三维集合配置
分享到:
评论

相关推荐

    struts2与webwork2

    struts2与webwork2之间的联系与区别

    struts2对webwork的改进

    struts2对webwork的改进struts2对webwork的改进

    Struts2-Webwork2-DWR

    WEB2.0相关技术,深入浅出Struts2,Webwork2开发指南,DWR中文文档

    struts2建立流程

    Struts 2是Struts的下一代产品,是在 struts 1和WebWork的技术基础上进行了合并的全新的Struts 2框架。其全新的Struts 2的体系结构与Struts 1的体系结构差别巨大。Struts 2以WebWork为核心,采用拦截器的机制来处理...

    struts1,struts2,webwork,线程安全问题

    struts1,struts2,webwork,线程安全问题,easy518网 http://www.easy518.com/

    struts2的教程,struts2整合了struts1+webwork.基于MVC的Framework

    struts2的教程,struts2整合了struts1+webwork.基于MVC的Framework struts2的教程,struts2整合了struts1+webwork.基于MVC的Framework

    struts2+webwork+spring.rar

    struts2+webwork+spring.rarstruts2+webwork+spring.rar

    [Struts 2权威指南--基于WebWork核心的MVC开发(高清完整版) 1/12

    第1章 Struts 2概述,第2章 Struts 2下的HelloWorld,第3章 Struts 2基础,第4章 深入Struts 2,第5章 Struts 2的类型转换,第6章 文件的上传和下载.,第7章 Struts 2的拦截器,第8章 Struts 2的输入校验,9.2 ...

    Struts2 WebWork的更新产品

    Struts 2以WebWork为核心,采用拦截器的机制来处理用户的请求,这样的设计也使得业务逻辑控制器能够与Servlet API完全脱离开,所以Struts 2可以理解为WebWork的更新产品

    Struts 2 技术详解:基于WebWork核心的MVC开发与实践

    Struts 2 技术详解:基于WebWork核心的MVC开发与实践

    完美版(适合自学)struts2

    Struts 2是Struts的下一代产品,是在 struts 1和WebWork的技术基础上进行了合并的全新的Struts 2框架。其全新的Struts 2的体系结构与Struts 1的体系结构差别巨大。Struts 2以WebWork为核心,采用拦截器的机制来处理...

    Struts2V3.0-(中文)参考手册

    Struts 2中文参考手册,Struts 2是Struts的下一代产品,是在 struts 1和WebWork的技术基础上进行了合并的全新的Struts 2框架。其全新的Struts 2的体系结构与Struts 1的体系结构差别巨大。Struts 2以WebWork为核心,...

    Struts2工作流程图

    或者说,WebWork衍生出了Struts2,而不是Struts 1衍生了Struts2。因为Struts2是WebWork的升级,而不是一个全新的框架,因此稳定性、性能等各方面都有很好的保证:而且吸收了Struts 1和WebWork两者的优势,因此,是一...

    struts2JAR包

    Struts 2是Struts的下一代产品,是在 struts 1和WebWork的技术基础上进行了合并的全新的Struts 2框架。其全新的Struts 2的体系结构与Struts 1的体系结构差别巨大。Struts 2以WebWork为核心,采用拦截器的机制来处理...

    struts2必须jar包

    Struts 2是Struts的下一代产品,是在 struts 1和WebWork的技术基础上进行了合并的全新的Struts 2框架。其全新的Struts 2的体系结构与Struts 1的体系结构差别巨大。Struts 2以WebWork为核心,采用拦截器的机制来处理...

    程序天下-Struts 2技术详解:基于WebWork核心的MVC开发与实践(原代码2)

    是学习struts 2很好的资料,这是原代码,分成两个压缩包.

    struts2学习文档

    Struts 2是Struts的下一代产品,是在 struts 和WebWork的技术基础上进行了合并的全新的Struts 2框架。其全新的Struts 2的体系结构与Struts 1的体系结构的差别巨大。Struts2以WebWork为核心,采用拦截器的机制来处理...

    Struts 2中文帮助文档

    Struts 2是Struts的下一代产品,是在 struts 和WebWork的技术基础上进行了合并的全新的Struts 2框架。其全新的Struts 2的体系结构与Struts 1的体系结构的差别巨大。Struts 2以WebWork为核心,采用拦截器的机制来处理...

    Struts 2 began as WebWork.

    Struts 2 began as WebWork.

    03解决struts2配置文件无提示问题

    Struts 2是Struts的下一代产品,是在 struts 和WebWork的技术基础上进行了合并的全新的Struts 2框架。其全新的Struts 2的体系结构与Struts 1的体系结构的差别巨大。Struts 2以WebWork为核心,采用拦截器的机制来处理...

Global site tag (gtag.js) - Google Analytics