struts 2またはwebworkネストセットタイプ変換

8236 ワード

例コードを与える

   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"/>

ユーザーが複数のグループグループグループに属していると仮定すると、ユーザーは

 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  />

struts 2またはwebworkは以上のサポートを提供し,集合中のオブジェクトを明確にするには変数が属するクラスの同パッケージの下で対応する***-conversionを確立する.properties、ファイルにElement_を指定するxxxで結構です
集合中の要素も集合である必要があると仮定すると、struts 2または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//2 Dコレクション構成
Element_users_i=com.xxx.User//2 Dコレクション構成
Element_users=java.util.ArrayList//3 Dコレクション構成
Element_users_i=java.util.ArrayList//3 Dコレクション構成
Element_users_i_i=com.xxx.User//3 Dコレクション構成