我需要为某个项目创建搜索页面。 输入字段为:
<h:inputText styleClass="field35" value="#{searchBean.country}"></h:inputText>
<h:inputText maxlength="20" styleClass="field35" value="#{searchBean.destination}"></h:inputText>
<rich:calendar datePattern="dd/MM/yyyy" value="#{searchBean.startDate}"></rich:calendar>
<rich:calendar datePattern="dd/MM/yyyy" value="#{searchBean.endDate}"></rich:calendar>
在我按下之后:
<h:commandButton id="cb41" action="#{searchBean.processForm}" value="Search" styleClass="button" />
我希望结果打印在同一页面的rich:dataTable
部分。
<rich:dataTable value="#{searchBean.results}" var="journey">
在processForm
方法中,结果变量填充了数据库中的数据,用户被转发到同一页面。
第一次搜索后一切都很好,但是当我再次按下搜索时,bean和页面输入字段之间的绑定就会丢失。换句话说,在country,destination,startData和endDate的processForm方法中,无论页面上的相应字段是什么,我都只获得空值。
bean的范围是request,所有字段都有getter和setter。
有没有人知道可能出现什么问题?
感谢。
编辑: 谢谢t-edd 将范围更改为会话工作,但这是一个性能杀手,使整个bean始终保持在会话中(每次离开想要的页面时都很难删除它)。我理解为什么bean被销毁了,但是在下一个请求之后不应该使用我的页面中的适当值来创建一个新的?
答案 0 :(得分:2)
似乎你需要添加
<t:saveState value="#{searchBean}" />
到你的页面。
此控制器在请求之间保存bean的状态(它提供了在视图的组件树中存储模型值的功能。)。
这样可以保存其数据,而无需将bean的范围更改为session(我不推荐)
您也可以使用
<a4j:keepAlive beanName="searchBean"/>
答案 1 :(得分:1)
我认为问题是bean的范围 - 请求。您是否在每次请求后加载数据?如果没有那么很明显,值为null。尝试会话范围,或者您必须从您的服务或elswere获取数据..
编辑:
在这里发布你的控制器的代码,没有它我无法提供很多帮助。无需将bean放入会话范围即可解决此问题。简而言之:您需要使用gettres和setter将数据存储在请求之间的bean属性中。