浏览 3486 次
锁定老帖子 主题:ww的ognl解释有点问题
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
|
|
---|---|
作者 | 正文 |
发表时间:2006-08-08
例如,调用: .../.../gomodify.action?user.id=1 也就是一个加载id为1的user对象进行编辑的操作。 问题是,ww不会调用我这个action里面user对象的setId(..)方法。 百思不得其解,后来发现,改成调用url: .../.../gomodify.action?user.Id=1 其实也就是把小写开头的id改成大写开头Id。 我这就搞不懂了,ognl是怎么工作的?如果我有一个user对象,有个属性是id,生成的set,get方法难道不是setId和getId吗? 如果我同时有id和Id两个属性怎么办呢?当然我知道这样做本身设计就有问题。 至少我觉得,我传个id进来,你就应该让我调用一下setId吧,每次传到后台都是空值…… 不过,后来还发现,这还是个不定因素,有时候小写id又行了,真是搞不懂ww怎么搞的…… 做了几个模块,每次都是一上来不行,后来也没改代码,又莫明其妙的好了,愈来愈糊涂了。 声明:ITeye文章版权属于作者,受法律保护。没有作者书面许可不得转载。
推荐链接
|
|
返回顶楼 | |
发表时间:2006-08-08
这个……我觉得应该跟user对象建立没有有关系。
如果是 null的话,怎么也设不上去。 有时好呢,估计是因为interceptor起作用了。 |
|
返回顶楼 | |
发表时间:2006-08-08
应该传一个id,然后action里根据这个id自己去从数据库中get。或者自己修改拦截器。参看jert项目。
|
|
返回顶楼 | |
发表时间:2006-08-09
OGNL只与Getter和Setter的方法命名有关,譬如:你的代码如下:
public class User(); { private Long id; public Long getId(); {return this.id;} public void setId(Long id); {this.id = id;} public Long getUserId(); {return this.id;} public void setUserId(Long id); {this.id = id;} } url: edit.action?user.id=1 ==> setId(id) edit.action?user.userId ==> setUserId(id) 与属性是id还是Id没有关系,只与getter和setter方法的名称有关系,还有一点需要注意的,你的拦截器得需要配置,并且在你的Action中,需要 private User user;的实例字段。 |
|
返回顶楼 | |
发表时间:2006-08-09
必须写get方法,光写set方法会有问题。
加上get方法再试试。 |
|
返回顶楼 | |
发表时间:2006-08-10
downpour 写道 必须写get方法,光写set方法会有问题。
加上get方法再试试。 还有一点需要注意: ognl的运作方式: user.id=1是调用Action里面的getUser().setId(1); 所以Action中要有private User user;的getter方法 public User getUser(); |
|
返回顶楼 | |
发表时间:2006-08-15
AbstractFortuneCarrier
@Override public Integer getId(); { // log.debug("getId...");; return super.getId();; } @Override public void setId(Integer id); { // log.debug("setId...");; super.setId(id);; } FortuneCarrier public class FortuneCarrier extends AbstractFortuneCarrier implements Serializable { 。。。 dao和service层代码就不贴了 web层 FortuneCarrierAction public class FortuneCarrierAction extends ActionSupport implements Preparable { private FortuneCarrier fortuneCarrier; // fortuneCarrier的getter setter 都有 。。。 /** * @return */ public String goModify(); { log.debug("...goModify , and id = " + fortuneCarrier.getId(););; try { fortuneCarrier = fortuneCarrierManager .findDetailsById(fortuneCarrier.getId(););; } catch (ObjectNotFoundException e); { addFieldError("fortuneCarrier.id", e.getMessage(););; return INPUT; } return SUCCESS; } 我从查询结果页面的jsp里面写: <ww:url value="gomodify.action" id="url"> <ww:param name="fortuneCarrier.Id" value="id" /> </ww:url> <TD> <a href="<ww:property value="#url"/>">modify</a> </TD> modify.jsp是gomodify.action的success forward,也很简单: <%@ page language="java" pageEncoding="UTF-8"%> <%@ taglib uri="/webwork" prefix="ww"%> <html> <body> <ww:form action="update" method="post" validate="true"> <ww:textfield name="fortuneCarrier.id" label="id" readonly="true" /> <ww:textfield name="fortuneCarrier.name" label="name" /> <ww:textfield name="fortuneCarrier.note" label="note" /> <ww:submit value="update" /> </ww:form> <br> </body> </html> 问题在于我查询页面中必须写: <ww:param name="fortuneCarrier.Id" value="id" /> 而不是我预期的: <ww:param name="fortuneCarrier.id" value="id" /> 也就是要打开.../gomodify.action?fortuneCarrier.Id=1才会设置好id…… |
|
返回顶楼 | |
发表时间:2006-08-23
最终问题确认下来了:
非常之奥秘,请看: 页面上很多对象,比如传了个user.id=1过去,经常会读不到这个入参,或者说ognl认为user对象没有id这个属性,所以将之忽略。导致:最终user对象没有new出来,或者其id对象没有设置进去。 而且发现,这问题出现无确数,出现问题后重启tomcat又好了,不一会儿又出现。而且不一定出现在某一个特定的对象上,一会儿是user,一会儿是role,等等,都有可能。 现在项目都快要做好了,但是还在为这id的问题烦恼。经常需要测试用户重启tomcat,太丢脸了。 我已经把webwork和xwork的源码加到项目里面去了,打算跟踪调试,但是又不知道跟踪哪里,唉。 |
|
返回顶楼 | |