`
dylan0514sina.cn
  • 浏览: 94902 次
  • 性别: 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的联系与区别的过程中,我们不得不提到它们的历史渊源以及在Java Web开发领域中的地位。Struts2框架实际上可以视为WebWork2框架的继承者,两者之间的关系紧密而复杂,下面将从多个角度深入...

    Struts2-Webwork2-DWR

    **Webwork2** 是 Struts2 的前身,它解决了 Struts1 在处理动态方法调用和类型安全等方面的问题。Webwork2 引入了动作和结果的概念,使模型和视图之间的交互更为清晰。它还支持OGNL(Object-Graph Navigation ...

    struts2+webwork+spring.rar

    2. **WebWork**:WebWork是Struts2的前身,它引入了一些创新特性,如Action和Result的分离、强大的类型安全的表达式语言等。WebWork的许多设计理念后来被Struts2采纳,使得Struts2在功能和性能上都有显著提升。 3. ...

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

    ### Struts1、Struts2、WebWork框架中的线程安全问题分析 #### 一、Struts1与线程安全问题 在Struts1中,每个`Action`类实例是被多个请求重用的,这使得它在多线程环境下存在潜在的线程安全问题。当多个线程同时...

    struts2建立流程

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

    struts2对webwork的改进

    Struts2是对WebWork框架的重大升级和改进,它在保留WebWork强大特性的基础上,引入了更多优化和新特性,使得整个框架更加灵活且易于使用。以下将详细阐述Struts2对WebWork的改进点: 1. **配置文件的多样化**: 在...

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

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

    [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开发入门文档

    - `webwork2开发指南.pdf`则是针对WebWork框架的指导手册,帮助理解WebWork的设计原理和用法。 通过以上文档,你可以系统地学习Struts2和WebWork的基本概念、核心组件以及实际应用。在掌握这两个框架的基础上,...

    Struts2和Webwork远程命令执行漏洞分析1

    Struts2和Webwork远程命令执行漏洞主要源于Apache Struts2框架中的一个设计缺陷,该框架使用OGNL(Object-Graph Navigation Language)表达式来处理用户输入,这为恶意攻击者提供了可乘之机。该漏洞发生在Struts2的...

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

    WebWork的这些特性被集成到Struts 2中,使得Struts 2成为了一个高效且易用的MVC框架。 **Struts 2的生命周期**: 1. 用户发起HTTP请求。 2. Struts 2 框架接收到请求,解析请求参数。 3. 拦截器链开始执行,按照...

    struts2中文学习文档

    从给定的文件信息来看,标题“struts2中文学习文档”和描述“struts2的根本webwork2”表明这是一份关于Struts2框架的学习资料,特别强调了Struts2与WebWork2的关系。Struts2是Apache Struts的一个版本,它是一个用于...

    Struts2 WebWork的更新产品

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

    webwork类型转换入门一

    在WebWork01这个压缩包中,可能包含了一些示例代码或配置文件,用于演示如何自定义TypeConverter或者配置WebWork的类型转换行为。这可能包括Action类、ActionForm类、配置文件(如`struts-config.xml`或`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很好的资料,这是原代码,分成两个压缩包.

Global site tag (gtag.js) - Google Analytics