论坛首页 Java企业应用论坛

使用模型驱动模式,页面无法显示数据的问题

浏览 5336 次
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
作者 正文
   发表时间:2005-07-22  
public class PersonAction extends ActionSupport implements Action,ModelDriven{

  private Person person= new Person();;

  public Object getModel(); {
    return person;
  }

  public String doProperty();{
    String id = (String); ServletActionContext.getRequest();.getParameter("id");;
    person=personBO.doGetPerson(Integer.parseInt(id););;
    return "doProperty";
  }

}
jsp也面,
<ww:property value="personId"/>
<ww:property value="name"/>

xwork.xml

	<interceptors>
		<interceptor name="reference-resolver"
			class="com.opensymphony.xwork.interceptor.ExternalReferencesInterceptor" />
		<interceptor-stack name="WSStack">
		<interceptor-ref name="model-driven" />
		<interceptor-ref name="params" />		
		<interceptor-ref name="reference-resolver" />
		</interceptor-stack>
	</interceptors>		
	
	<action name="person" class="com.oss.ww2.sample.web.ww2.action.PersonAction" >	
	
		<external-ref name="personBO">personBO</external-ref>	
		

		<result name="doProperty" type="dispatcher">
			<param name="location">/person/personProperty.jsp</param>
		</result>
			
		<interceptor-ref name="WSStack" />
		
	</action>





为什么页面上总是显示不出数据呀。改用字段驱动就一切正常了。
   发表时间:2005-07-22  
出错的页面?
0 请登录后投票
   发表时间:2005-07-24  
页面没有问题。

把 Person对象变成Public的,然后页面上
&lt;ww:property value="person.personId"/&gt;
就好了。不知道为什么
0 请登录后投票
   发表时间:2005-07-25  
引用
&lt;ww:property value="person.personId"/&gt;


//ModelDriven & person.personId

getModel().getPerson.getPersonId() ==&gt;person.getPerson.getPersonId()

还能正确显示?
0 请登录后投票
   发表时间:2005-07-25  
没写getPerson()啊,代码里写的又是getModel()
0 请登录后投票
   发表时间:2005-08-03  
页面中改成下面这样试试
&lt;ww:property value="model.personId"/&gt;
&lt;ww:property value="model.name"/&gt;
0 请登录后投票
   发表时间:2005-08-09  
倒不是猜想,只是分析错了 呵呵,自己删掉,以免误导人家。
0 请登录后投票
   发表时间:2005-08-09  
javamaker 写道
页面中改成下面这样试试
<ww:property value="model.personId"/>
<ww:property value="model.name"/>

这样应该是对的,取值的用model.xxxx,设值直接用xxxx

模型驱动是在action执行之前,把model(即new Person();产生的对象);压入stack的。 
引用: 

person=personBO.doGetPerson(Integer.parseInt(id););; 
 

这句代码中person已经指向另一个Object了,stack中的person仍然是初始化时new Person();产生的那个对象,值当然为空了。 
解决方法:BeanUtils.copyProperties();

你是在猜想吧,model driven没这么弱,原来的写法是对的。前提是model在params的interceptor之前
0 请登录后投票
   发表时间:2006-11-09  
强烈同意楼上的观点,本人曾遇到过同样的问题,能过debug发现
页面得到的person(这里以楼主的代码做类)的对象与
我曾在这句这前打过一句 log.print(person) //1
person=personBO.doGetPerson(Integer.parseInt(id));  
之后也打了一句.
log.print(person)//2

发现二者对象不一致,而debug提示中页面的赋值对象名与1中的对象名一致,这证实了楼上滴观点.不过本人当时的办法比较笨,没有想到beanutils竟然是一个一个属性set出来的.汗~~~~~~~~~.

忘记补充一点了..
如果person中有个set类型,或其它pojo的对象,并且碰到用hibernate时的延迟加载时,对不起,你还是只能用person.setF1(bean.getF1)这种笨方法,否则你在用beanutils.copyProperty()方法时,会出现org.hibernate.LazyInitializationException:的错误~~~
0 请登录后投票
论坛首页 Java企业应用版

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