给出例子代码
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的联系与区别的过程中,我们不得不提到它们的历史渊源以及在Java Web开发领域中的地位。Struts2框架实际上可以视为WebWork2框架的继承者,两者之间的关系紧密而复杂,下面将从多个角度深入...
**Webwork2** 是 Struts2 的前身,它解决了 Struts1 在处理动态方法调用和类型安全等方面的问题。Webwork2 引入了动作和结果的概念,使模型和视图之间的交互更为清晰。它还支持OGNL(Object-Graph Navigation ...
2. **WebWork**:WebWork是Struts2的前身,它引入了一些创新特性,如Action和Result的分离、强大的类型安全的表达式语言等。WebWork的许多设计理念后来被Struts2采纳,使得Struts2在功能和性能上都有显著提升。 3. ...
### Struts1、Struts2、WebWork框架中的线程安全问题分析 #### 一、Struts1与线程安全问题 在Struts1中,每个`Action`类实例是被多个请求重用的,这使得它在多线程环境下存在潜在的线程安全问题。当多个线程同时...
Struts 2是Struts的下一代产品,是在 struts 1和WebWork的技术基础上进行了合并的全新的Struts 2框架。其全新的Struts 2的体系结构与Struts 1的体系结构差别巨大。Struts 2以WebWork为核心,采用拦截器的机制来处理...
Struts2是对WebWork框架的重大升级和改进,它在保留WebWork强大特性的基础上,引入了更多优化和新特性,使得整个框架更加灵活且易于使用。以下将详细阐述Struts2对WebWork的改进点: 1. **配置文件的多样化**: 在...
struts2的教程,struts2整合了struts1+webwork.基于MVC的Framework struts2的教程,struts2整合了struts1+webwork.基于MVC的Framework
第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 ...
- `webwork2开发指南.pdf`则是针对WebWork框架的指导手册,帮助理解WebWork的设计原理和用法。 通过以上文档,你可以系统地学习Struts2和WebWork的基本概念、核心组件以及实际应用。在掌握这两个框架的基础上,...
Struts2和Webwork远程命令执行漏洞主要源于Apache Struts2框架中的一个设计缺陷,该框架使用OGNL(Object-Graph Navigation Language)表达式来处理用户输入,这为恶意攻击者提供了可乘之机。该漏洞发生在Struts2的...
WebWork的这些特性被集成到Struts 2中,使得Struts 2成为了一个高效且易用的MVC框架。 **Struts 2的生命周期**: 1. 用户发起HTTP请求。 2. Struts 2 框架接收到请求,解析请求参数。 3. 拦截器链开始执行,按照...
从给定的文件信息来看,标题“struts2中文学习文档”和描述“struts2的根本webwork2”表明这是一份关于Struts2框架的学习资料,特别强调了Struts2与WebWork2的关系。Struts2是Apache Struts的一个版本,它是一个用于...
Struts 2以WebWork为核心,采用拦截器的机制来处理用户的请求,这样的设计也使得业务逻辑控制器能够与Servlet API完全脱离开,所以Struts 2可以理解为WebWork的更新产品
在WebWork01这个压缩包中,可能包含了一些示例代码或配置文件,用于演示如何自定义TypeConverter或者配置WebWork的类型转换行为。这可能包括Action类、ActionForm类、配置文件(如`struts-config.xml`或`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很好的资料,这是原代码,分成两个压缩包.