给出例子代码
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对webwork的改进struts2对webwork的改进
WEB2.0相关技术,深入浅出Struts2,Webwork2开发指南,DWR中文文档
Struts 2是Struts的下一代产品,是在 struts 1和WebWork的技术基础上进行了合并的全新的Struts 2框架。其全新的Struts 2的体系结构与Struts 1的体系结构差别巨大。Struts 2以WebWork为核心,采用拦截器的机制来处理...
struts1,struts2,webwork,线程安全问题,easy518网 http://www.easy518.com/
struts2的教程,struts2整合了struts1+webwork.基于MVC的Framework struts2的教程,struts2整合了struts1+webwork.基于MVC的Framework
struts2+webwork+spring.rarstruts2+webwork+spring.rar
第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 ...
Struts 2以WebWork为核心,采用拦截器的机制来处理用户的请求,这样的设计也使得业务逻辑控制器能够与Servlet API完全脱离开,所以Struts 2可以理解为WebWork的更新产品
Struts 2 技术详解:基于WebWork核心的MVC开发与实践
Struts 2是Struts的下一代产品,是在 struts 1和WebWork的技术基础上进行了合并的全新的Struts 2框架。其全新的Struts 2的体系结构与Struts 1的体系结构差别巨大。Struts 2以WebWork为核心,采用拦截器的机制来处理...
Struts 2中文参考手册,Struts 2是Struts的下一代产品,是在 struts 1和WebWork的技术基础上进行了合并的全新的Struts 2框架。其全新的Struts 2的体系结构与Struts 1的体系结构差别巨大。Struts 2以WebWork为核心,...
或者说,WebWork衍生出了Struts2,而不是Struts 1衍生了Struts2。因为Struts2是WebWork的升级,而不是一个全新的框架,因此稳定性、性能等各方面都有很好的保证:而且吸收了Struts 1和WebWork两者的优势,因此,是一...
Struts 2是Struts的下一代产品,是在 struts 1和WebWork的技术基础上进行了合并的全新的Struts 2框架。其全新的Struts 2的体系结构与Struts 1的体系结构差别巨大。Struts 2以WebWork为核心,采用拦截器的机制来处理...
Struts 2是Struts的下一代产品,是在 struts 1和WebWork的技术基础上进行了合并的全新的Struts 2框架。其全新的Struts 2的体系结构与Struts 1的体系结构差别巨大。Struts 2以WebWork为核心,采用拦截器的机制来处理...
是学习struts 2很好的资料,这是原代码,分成两个压缩包.
Struts 2是Struts的下一代产品,是在 struts 和WebWork的技术基础上进行了合并的全新的Struts 2框架。其全新的Struts 2的体系结构与Struts 1的体系结构的差别巨大。Struts2以WebWork为核心,采用拦截器的机制来处理...
Struts 2是Struts的下一代产品,是在 struts 和WebWork的技术基础上进行了合并的全新的Struts 2框架。其全新的Struts 2的体系结构与Struts 1的体系结构的差别巨大。Struts 2以WebWork为核心,采用拦截器的机制来处理...
Struts 2 began as WebWork.
Struts 2是Struts的下一代产品,是在 struts 和WebWork的技术基础上进行了合并的全新的Struts 2框架。其全新的Struts 2的体系结构与Struts 1的体系结构的差别巨大。Struts 2以WebWork为核心,采用拦截器的机制来处理...