我们爱分享----struts2的get和set方法

KingViker 2011-08-29 08:57:26
虽然很久没弄过java了 ,(没办法 需求访谈了半年了还没结束,一直用ext开发demo,悲剧中...)但是看见这个活动就想顶一下,所以想起来以前见过的一些问题,就再这里写写了,今天说说struts2的get和set的问题.因为我很久没开发java了 所以现在不方便贴测试代码(因为没有o(╯□╰)o).
以前做项目的时候我有一个同事在一个action类里定义了一个get开头的方法,这个方法是action的默认方法调用的,但是他在测试的时候这个方法老是先执行,也就是说还没调用就自己执行了 ,因为自己执行一些参数没有传进来,所以就报错了,怎么测试也不对,也没发现问题.他就纠结了,来找我了. 我看了一下,调试了一下发现这个方法是在浏览器发出action请求之后,struts2的servlet拦截到aciton请求,然后在初始化这个action类的时候就执行了,换言之,也就是说和类属性的get、set方法一起执行了,他执行的之后参数没有有效的传进来 就报错了,我当时就纳闷了 怎么会没调用就其他类属性方法一起之执行了那?我在没查看源代码的时候就有一个猜测就是,struts2的实现原理可能就是在初始化action类之后就会调用已get和set开头的所有方法,我后来验证了一下自己的想法,果然是这样。由于工作原因不能带大家看代码了,很久没用struts2了不知道他们源代码改了没。以后大家如果遇到这样子的问题可以尝试给方法改个名字,特别是开头的几个字改改可能就不报错了。顺便提一嘴问一句,我ext的经验能发上来吗。ext搞半年了 是半年全天一直搞ext 我快疯了!当然收获也很丰富!
...全文
1806 41 打赏 收藏 转发到动态 举报
写回复
用AI写文章
41 条回复
切换为时间正序
请发表友善的回复…
发表回复
ellen_1201 2014-02-24
  • 打赏
  • 举报
回复
学习了,在Action类中最好不要以get或者set为开头的方法,struts2会在客户端发生Action请求时,自动的执行属性的get、set方法,所以struts2可能会误以为是属性的get、set方法
me_111111 2013-04-03
  • 打赏
  • 举报
回复
有注解可以让拦截器对这个get失效的!
Horrison 2013-02-28
  • 打赏
  • 举报
回复
引用 1 楼 zl3450341 的回复:
这个确实是有这个问题,所以在struts2里面,方法名,不要以get,set打头,否则他会以为是某个属性的getter() setter()方法。Ext经验当然也可以发上来分享啊
以前也遇到同样的问题,后来还是找到原因了
雨泽 2012-11-29
  • 打赏
  • 举报
回复
现在已经改了,我现在就经常使用get开头...没有出现问题2.1.8
Iam_magicHu 2012-11-09
  • 打赏
  • 举报
回复
等着你的EXT
hfmbook 2012-11-06
  • 打赏
  • 举报
回复
他不是当作构造函数一样执行了,是当作一个属性的getter 和 setter方法执行了,struts2 是自动将属性的值放入到request中的。当你调用的Action方法执行完毕后struts会去执行每个Action里面的getter方法,只有这样才能将Action里面数据带入到jsp页面上去。为什么会这样呢?给点代码例子吧,我想struts的实现也和这个大同小异: clasz:是当前调用的Action的class值 object:是当前Action的实例
 
PropertyDescriptor[] propertyDescriptores = Introspector
				.getBeanInfo(clasz).getPropertyDescriptors();
		for (PropertyDescriptor propertyDescriptor : propertyDescriptores) {
			Method m = propertyDescriptor.getReadMethod();
			if (m == null) {
				continue;
			}
			Object ob = m.invoke(object);
			request.setAttribute(propertyDescriptor.getName(), ob);
		}
如果strtus2 是先去查找Action的Field,而不是去查找 PropertyDescriptor ,就不会出现只有get方法没有属性的方法。问题就出现在这里...
mocah_zzz 2012-08-16
  • 打赏
  • 举报
回复
public void getTest(){
System.out.println("lalallalallalalalalal");
}
public void setTest(){
System.out.println("11111111111111111111111111");
}

我在action里加入了以上方法,但却没有得到执行。你的意思是set、get开头的就相当于构造函数一样的执行没错吧?
bird_cat 2012-04-07
  • 打赏
  • 举报
回复
恩 学习了 以后在action方法中命名不会用 get和set了防止出错。
fubinfeng 2012-02-05
  • 打赏
  • 举报
回复
受教了!
vikey0623 2011-11-29
  • 打赏
  • 举报
回复
我的项目里有些“私有”的get方法,没出现问题,共有的我没试!~
索隆 2011-11-24
  • 打赏
  • 举报
回复
占个座,有时间自己研究
SmarkMeng 2011-10-16
  • 打赏
  • 举报
回复
嗯 也遇到过同样的问题 因为在action 中写了getXX处理一些数据,结果总是得不得想要的结果
那时郁闷了好长时间
csy132546 2011-09-22
  • 打赏
  • 举报
回复
所以也许是set方法的问题,不是get方法问题
niuniu20008 2011-09-22
  • 打赏
  • 举报
回复
我的是Struts2.1.8
起不起get名对 Action的属性赋值没有影响。
你的项目出现问题,和set方法有问题,命名有所冲突。
Struts2的参数拦截器在注入值的时候,有两种机制,(调用ognl)
查看ognl-2.7.3.jar中的OgnlRuntime 类中

public static final boolean hasGetProperty(OgnlContext context, Object target, Object oname)
throws IntrospectionException, OgnlException
{
Class targetClass = target == null ? null : target.getClass();
String name = oname.toString();

return (hasGetMethod(context, target, targetClass, name)) || (hasField(context, target, targetClass, name));
}

public static final boolean hasSetProperty(OgnlContext context, Object target, Object oname)
throws IntrospectionException, OgnlException
{
Class targetClass = target == null ? null : target.getClass();
String name = oname.toString();

return (hasSetMethod(context, target, targetClass, name)) || (hasField(context, target, targetClass, name));
}


里面的

return (hasSetMethod(context, target, targetClass, name)) || (hasField(context, target, targetClass, name));
}


所以也许是set方法的问题,不是get方法问题
夕水溪下 2011-09-22
  • 打赏
  • 举报
回复
你用的是哪个版本的??我用get起名没错呀?不要误导大家啊。各位如果觉得有问题可以和我讨论:greenyouyou@163.com

这是我的一个action方法:


public String getCodeStr() throws Exception {


运行良好,没有出半点错误
IT菜鸟 2011-09-16
  • 打赏
  • 举报
回复
学习啊。。。。。。
「已注销」 2011-09-13
  • 打赏
  • 举报
回复
学习中...
哈狄斯 2011-09-01
  • 打赏
  • 举报
回复
学习,路过
xiaoqiuwyh 2011-09-01
  • 打赏
  • 举报
回复
这个经验很有用啊!
BUG胡汉三 2011-09-01
  • 打赏
  • 举报
回复
学习了!!!
加载更多回复(18)

67,512

社区成员

发帖
与我相关
我的任务
社区描述
J2EE只是Java企业应用。我们需要一个跨J2SE/WEB/EJB的微容器,保护我们的业务核心组件(中间件),以延续它的生命力,而不是依赖J2SE/J2EE版本。
社区管理员
  • Java EE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧