论坛首页 Java版 Struts

struts2实际编程中ognl解析的一个问题

浏览 725 次
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
作者 正文
最后更新时间:2008-01-08
问题是这样子的(struts2中):

首先,action用泛型将PoJo传到基类
MyMaintAction extends BaseAction<MyPoJo>{
//someMethod
}
再在BaseAction中定义了curObject
public abstract class  BaseMaintAction<T> extends ActionSupport{
protected T curObject
//someMethod
//getter setterMethod
}

目的就是通过如下URL访问时,能得到MyPoJo类型的一个curObject,从而进行其他操作。
http://localhost/MyPoJo!edit.action?curObject.id=2,

目前的情况是,curObject的确存在了,是Object类型但不是MyPoJo的。所以就去DEBUG源代码,

但是看到OGNL的解析代码时,着实难以下手了,不知道我这么做,行得通否,十分希望能得到一点指点。
   
最后更新时间:2008-01-08
你可以写一个inteceptor,读取curObject.id这种格式的参数,配合action name (MyPoJo)然后构建出对应的curObject,和ognl没有太多关系。
   
0 请登录后投票
最后更新时间:2008-01-08
奥,也想到了这个路子。

直接定义protected  MyPoJo curObject;能够做到,现在要另写一个的inteceptor,于心不忍呢。

如果在from里面定义了myPojo.otherProperty,就没有简单办法映射到MyPojo了,而这些直接定义protected  MyPoJo curObject可以做到。
   
0 请登录后投票
最后更新时间:2008-01-09
承上,最近写了一个方法:
private void bind() {
    String entityString = BeanUtils.getEntityString(getEntityClass());
    BeanUtils.forceSetProperty(this, entityString,curObject);	
}

entityString:是SomeAction (extends BaseAction extends ActionSupport)中的一个对象的定义。
如果将它放在Action中执行,页面可以通过entityString.property得到值。
如果将它放在Intercept中执行,则得不到,而实际中curObject是有值的。

这两种办法有什么区别呢?

Intercept和BaseAction部分代码贴出如下,希望有所指点。
EditEntityInteceptor.java

private static final long serialVersionUID = 1L;
	private static final Log logger = LogFactory.getLog(EditEntityInteceptor.class);

	@SuppressWarnings("unchecked")
	protected String doIntercept(ActionInvocation invocation) throws Exception {
		//some code...
		String result = invocation.invoke();
		if (action instanceof BaseMaintAction) {
			Object curObject = BeanUtils.forceGetProperty(action, "curObject");
			if(curObject!=null){
				BeanUtils.forceSetProperty(action,entityString,curObject);
				logger.info("EditEntityInteceptor.doIntercept invoked... ->put curObject by the key:  "+entityString+".");
			}
		}
		return result;
	}


BaseMaintAction.java,BaseAction 是泛型定义getEntityClass()得到对象类型.entityString取值就是getEntityClass().getSimpleName(),首字母小写。
public String edit() {
		if(!StringUtils.isBlank(String.valueOf(curid)))
			curObject = (T)getCommonFacade().get(getEntityClass(), getCuridValue());
			String entityString = BeanUtils.getEntityString(getEntityClass());
		         BeanUtils.forceSetProperty(this, entityString,curObject);		
		return SUCCESS;
	}
   
0 请登录后投票
论坛首页 Java版 Struts

跳转论坛:
JavaEye推荐