首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 其他教程 > 互联网 >

struts2中接收非基本门类的对象时必须有setter

2012-11-14 
struts2中接收非基本类型的对象时必须有setter今天重构以前代码过程中发现一个struts2设置参数的问题,前后

struts2中接收非基本类型的对象时必须有setter

今天重构以前代码过程中发现一个struts2设置参数的问题,前后足足追了半天,顺便看了OGNL的源码,在这里记录下原因和解决方案:

?

在struts2的action中接收参数时,通常我是不喜欢写getter,只写setter。这样可以更加清楚的表示这是一个输入参数,比如

?

public class XXAction{     private int size;     public viod setSize(int size){         this.size=size;           }}

?

?

当只接收普通类型时没有问题,可对于如下复杂类型

?

public class PageBean{         int pageSize;         int pageNo;         String orderBy;         // getter &setter         // ...}

?

?

?? 如果不写getter

?

public class XXAction{       private PageBean page;       public void setPage(PageBean page){              this.page=page;       }}

??

??? 前端传过来的参数 page.pageSize=10&page.pageNo=1&page.orderBy=name

????在execute()方法中会发现page对象只有 pageSize被赋值了(10),pageNo和orderBy都为null。而且无论怎么调整传入参数的顺序结果都是一样的。

?

??? 这个问题让我很费解,网上找了半天也没找到答案,老老实实的去跟OGNL的源码,最后发现原因是这样的:

?

????1) OGNL 首先收集所有需要赋值的属性( page.pageSize, page.pageNo, page.orderBy)

????2) 如果是复杂对象(如这里的PageBean),OGNL并不是首先构造好这个PageBean,赋上所有的值(pageSize,pageNo,orderBy),然后再把整个对象赋给action.page;而是通过一个循环依次往action.page这个对象上追加值。循环中每次执行时并不知道action.page对象是否已经执行过初始化,所以每次都要用以下方法测试action.page是否存在,若不存在则会初始化它 (action.page=new PageBean()), 然后完成本次赋值

?

??????????

if (OgnlRuntime.hasSetProperty(ognlContext, o, name)) {                    OgnlRuntime.setProperty(ognlContext, o, name, value);                    return;                }

?

???????????由于我没有在Action中对page属性写setter,所以.hasSetPropertyf方法每次都会返回false,然后OGNL就会傻傻的重新初始化并赋值, 对于以上三个属性,它一共会初始化page对象三遍,而只保留下最后赋值的属性pageSize。

?????????? 至于为什么每次都是pageSize排在最后呢? 这是因为OGNL在步骤1)中收集对象时用的是 TreeMap, 而前段穿过来的这三个key(page.pageSize, page.pageNo, page.orderBy) 按照String.compareTo()的实现总是page.pageSize排在最后一个。

?

?

??????? 知道了原因,解决方法当然很简单,只要加上 page属性的setter就行了。不过这里还是要对Struts的设计吐个槽,如果是我来设计,输入参数肯定不会要求实现者提供getter,而是用一个Map保存对象的中间状态,最后统一调用setter赋给action。 现在这种拿action当临时对象用的方法看起来简化了一些实现,但作为框架来说,强制要求使用者提供getter完全是过分的要求。

?

????????

?

?

?????

1 楼 onlylau 2012-10-30   struts2中接收非基本类型的对象时必须有setter

如果不写getter

由于我没有在Action中对page属性写setter

知道了原因,解决方法当然很简单,只要加上 page属性的setter就行了。

但作为框架来说,强制要求使用者提供getter完全是过分的要求。


请问LZ你这个到底是setter方法,还是getter方法。。。有些地方表述错误噢!会误导人 2 楼 kissau 2012-10-30   onlylau 写道struts2中接收非基本类型的对象时必须有setter

如果不写getter

由于我没有在Action中对page属性写setter

知道了原因,解决方法当然很简单,只要加上 page属性的setter就行了。

但作为框架来说,强制要求使用者提供getter完全是过分的要求。


请问LZ你这个到底是setter方法,还是getter方法。。。有些地方表述错误噢!会误导人
确实,
从描述来看这个好像和getter方法没什么关系。
但是setter方法肯定是需要的,不管是基本类型还是非基本类型对象。
所以你这文章让人。。。,就不说了。 3 楼 freezingsky 2012-10-30   文章表述,有很多前后不一致的地方。 4 楼 kjj 2012-10-30   标题说的是getter,结论归纳到setter,可见struts2的作者不是那么不屑
作为你一喷子,你也得知道,javaeye上的人大都有智商,而不是你这样的,
智商是硬伤!! 5 楼 if(i!=我){} 2012-10-30   汗,这……还被弄到首页…… 6 楼 Shen.Yiyang 2012-10-30   当然需要你写getter了,dupe。。。如果复杂类型有多层,比如PageBean里面有SortOption,SortOption里面有orderclomuns,ordertye(asc,desc) 你不get到最外面那个,怎么给里面的多个层次设置

热点排行