struts 2またはwebworkネストセットタイプ変換
8236 ワード
例コードを与える
以上のコードにおいて、usersの集合がUserクラスのインスタンスであると仮定すると、TestAction同パッケージの下にTestAction-conversionが確立される.propertiesファイル:
ページに次のスクリプトのユーザー名を入力します.
ユーザーが複数のグループグループグループに属していると仮定すると、ユーザーは
groupsに保存されているのはcomです.yyy.Groupクラスインスタンス
Userの同パッケージの下で、User-conversionを確立する.properties:
Element_groups= com.yyy.Group
ページに入力したグループ名は次のとおりです.
struts 2またはwebworkは以上のサポートを提供し,集合中のオブジェクトを明確にするには変数が属するクラスの同パッケージの下で対応する***-conversionを確立する.properties、ファイルにElement_を指定するxxxで結構です
集合中の要素も集合である必要があると仮定すると、struts 2またはwebworkはサポートされていません.この問題を解決するために、まずXworkListPropertyAccessorを書き換えます.
注意getPropertyがresultを返す場合、resultがListタイプであるか否かを判断する
ブロックを作成し、MoreXWorkListPropertyAccessorを設定します.ブロッキングはstatic-paramsの前に配置する必要があります
今は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コレクション構成
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コレクション構成