论坛首页 Java企业应用论坛

ww的ognl解释有点问题

浏览 3485 次
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
作者 正文
   发表时间:2006-08-08  
问题不大,我在reqeust里,通过get方式put了一个对象的id。
例如,调用:
.../.../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怎么搞的……

做了几个模块,每次都是一上来不行,后来也没改代码,又莫明其妙的好了,愈来愈糊涂了。
   发表时间:2006-08-08  
这个……我觉得应该跟user对象建立没有有关系。
如果是 null的话,怎么也设不上去。
有时好呢,估计是因为interceptor起作用了。
0 请登录后投票
   发表时间:2006-08-08  
应该传一个id,然后action里根据这个id自己去从数据库中get。或者自己修改拦截器。参看jert项目。
0 请登录后投票
   发表时间: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;
的实例字段。
0 请登录后投票
   发表时间:2006-08-09  
必须写get方法,光写set方法会有问题。

加上get方法再试试。
0 请登录后投票
   发表时间:2006-08-10  
downpour 写道
必须写get方法,光写set方法会有问题。

加上get方法再试试。

还有一点需要注意:
ognl的运作方式:
user.id=1是调用Action里面的getUser().setId(1);
所以Action中要有private User user;的getter方法
public User getUser();
0 请登录后投票
   发表时间: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……
0 请登录后投票
   发表时间:2006-08-23  
最终问题确认下来了:

非常之奥秘,请看:

页面上很多对象,比如传了个user.id=1过去,经常会读不到这个入参,或者说ognl认为user对象没有id这个属性,所以将之忽略。导致:最终user对象没有new出来,或者其id对象没有设置进去。

而且发现,这问题出现无确数,出现问题后重启tomcat又好了,不一会儿又出现。而且不一定出现在某一个特定的对象上,一会儿是user,一会儿是role,等等,都有可能。

现在项目都快要做好了,但是还在为这id的问题烦恼。经常需要测试用户重启tomcat,太丢脸了。

我已经把webwork和xwork的源码加到项目里面去了,打算跟踪调试,但是又不知道跟踪哪里,唉。
0 请登录后投票
论坛首页 Java企业应用版

跳转论坛:
Global site tag (gtag.js) - Google Analytics