论坛首页 Java企业应用论坛

在tapestry中,页面跳转时报错NullPointerException

浏览 4683 次
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
作者 正文
   发表时间:2005-11-10  
情况描述:
1,总共四五个功能模块;
2,每一个模块有两个页面:response和manage。其中均嵌入了border,可以使得页面在模块间转换;
3,所有功能模块通过各自的manage导入,具有查询功能,
引用

manageBI.html
<input type="submit" jwcid="doQuery@Submit" listener="ognl:listeners.doQuery"  value=" 查 询 "/>

manageBI.java
ResponseBI page = (ResponseBI)cycle.getPage("BI/ResponseBI");
cycle.activate(page);

将查询结果在response中显示;
4,response页面可显示查询信息,并可选择返回或是转入其它功能模块(通过border),
引用
responseBI.html
<span jwcid="@DirectLink" listener="listener:doBack">

response.java
public void doBack(IRequestCycle cycle){
ManageBI page = (ManageBI)cycle.getPage("BI/ManageBI");
cycle.activate(page);
}

5,border描述
引用
border.html
<input type="image" name="Image2" width="142" height="20" border="0" jwcid="BI@ImageSubmit"
action="listener:ManageBI" image="asset:BI"/>

border.java
public void ManageBI(IRequestCycle cycle){
ManageBI bi = (ManageBI)cycle.getPage("BI/ManageBI");
cycle.activate(bi);
}

6,页面间的参数通过Visit进行传递,无依赖关系。

产生的问题:
1,导入manage页面后可以实现在border功能;
2,在manage中输入查询项查询(1)若数据库中无此项,在response中可以通过border转入其它模块;(2)若数据库中
由此项,使用border报错。注意:使用response中doBack返回manage正确。所有模块均有此问题。
报错:
org.apache.hivemind.ApplicationRuntimeException

java.lang.NullPointerException
com.satptr.view.bi.ResponseBI.setQueryterm(Unknown Source)
com.satptr.view.bi.ResponseBI.pageBeginRender(Unknown Source)
。。。。。。。。。。。。。。。。。。

我不明白页面间并无参数依赖的关系,而且respoonse页面内部的doBack(IRequestCycle cycle)可以正确执行,同样的代码
在border中执行却不行。最让我郁闷的是,查询数据库返回的list为null时,border的功能就正常了。
另外,在manage中执行border完全正确。

请问各位:抛出的NullPointerException到底指的什么?是页面传递的问题吗?页面间传递时参数设置有何不妥吗?
   发表时间:2005-11-11  
看不懂你在说什么。。。。。

哪个页面出错就放那个页面的完整代码(html,page,java),完整的错误提示。
0 请登录后投票
   发表时间:2005-11-12  
不好意思,弄巧成拙了。

ResponseBI.java
引用
...
public void pageBeginRender(PageEvent event){
...
this.setResponseList(biDAO.getQuery(bi_hql).list());
...
}
...
public void doBack(IRequestCycle cycle){
ManageBI page = (ManageBI)cycle.getPage("BI/ManageBI");
cycle.activate(page);
}
...


ResponseBI.page
引用
<page-specification class="com.satptr.view.bi.ResponseBI">
   
    <property-specification name="item" type="com.satptr.db.Basicinfo"/>
  
</page-specification>


ResponseBI.html

引用
<span jwcid="$Content$">
<span jwcid="@Border">
...
<tr jwcid="@For" element="tr" source="ognl:responseList" value="ognl:item" align="center">
...
<span jwcid="@DirectLink" listener="listener:doBack">返回人员信息管理</span>
...


border.html
引用
...
<form jwcid="form@Form">
...
<input type="image" name="Image2" width="142" height="20" border="0" jwcid="BI@ImageSubmit"
action="listener:ManageBI" image="asset:BI"/>
...


border.java
引用
...
public void ManageBI(IRequestCycle cycle){
ManageBI bi = (ManageBI)cycle.getPage("BI/ManageBI");
cycle.activate(bi);
}
...


其实是这样的,页面response用于显示查询的信息,当responseList不为null时,doBack()正常转入另外页面;
border中ManageBI()却报错:
org.apache.hivemind.ApplicationRuntimeException


java.lang.NullPointerException
com.satptr.view.bi.ResponseBI.setQueryterm(Unknown Source)
com.satptr.view.bi.ResponseBI.pageBeginRender(Unknown Source)
。。。。。。。。。。。。。。。。。。

然而,若responseList为null时,border页面可正常跳转。
页面间无参数依赖,我不明白的是从resoponse跳转至别的页面时,为什么会调用com.satptr.view.bi.ResponseBI.pageBeginRender等?为什么我的responseBI调用会抛出NullPointerException
0 请登录后投票
   发表时间:2005-11-13  
顾名思义 pageBeginRender()
当然是要在页面显示的时候要运行了.
0 请登录后投票
   发表时间:2005-11-14  
我的意思是从A页面跳向B页面时,难道A页面也要执行一把pageBeginRender()吗?同时,A页面中的DirectLink可正确执行,但在border的ImageSubmit中的action,在相同代码下调用却出现错误,这又是为什么呢?
0 请登录后投票
   发表时间:2005-11-14  
引用
我的意思是从A页面跳向B页面时,难道A页面也要执行一把pageBeginRender()吗?同时,A页面中的DirectLink可正确执行,但在border的ImageSubmit中的action,在相同代码下调用却出现错误,这又是为什么呢?

这确实tapestry的一种form rewind策略,是正确的。为了保证form在submit时数据no staleless,tapestry会先扫描一边所在页面的数据同步情况,也就是说,运行一边initialize(),pageBeginRender,pageEndRender,attach,detach等方法。。。所有,一般这种情况下,我不推荐在PageBeginRender里面对数据进行初始化赋值。比如你这里biDAO.getQuery(bi_hql).list(),就是在PageBeginRender方法里面与数据库逻辑层进行交互。。我觉得这种程序实现方式不合理。

而Border,虽然它在使用时,是页面嵌入border中,被border所包围。但是,首先它仍然是一个组件,作为页面中的众多组件之一被调用。那么页面在rewind的时候,自然会触发border中的PageBeginRender。

总之一句话,虽然Form在提交时与Directlink均触发同一种DirectService,但是他们的运作原理是不一样的。
0 请登录后投票
   发表时间:2005-11-14  
楼上说得有道理,我们在pageBeginRender一般只是用来初始化对象
如果使用组件,最好传参数到组件里,组件再进行处理
最好不要在PageBeginRender转到别的页面或做别的逻辑处理
0 请登录后投票
论坛首页 Java企业应用版

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