我有一个JSF页面,用户可以在其中输入他们的车到我的数据库。形式有三个输入字段:对话范围意外行为
- 厂商
- 模型
- 登记
的Manufacturer
和Model
字段都是自动完成的字段。为了完成Model
字段,我需要知道用户在提交表单之前在Manufacturer
字段中选择了什么值。为此,我成立了一个AJAX调用通知选定值的托管bean:
<p:autoComplete id="manufacturer"
minQueryLength="3"
completeMethod="#{carController.complete}"
forceSelection="true">
<p:ajax event="itemSelect"
listener="#{carController.manufacturerSelected}" />
</p:autoComplete>
而在托管bean:
public void manufacturerSelected(SelectEvent se) {
manufacturer = se.getObject().toString();
}
该模型的外观自动完成场和处理方法大致相同,价值略有不同。
要保留在多个XHR请求manufacturer
价值,我已经设置了bean来ConversationScoped
,并开始在@PostConstruct
标注的方法谈话:
@Named
@ConversationScoped
public class CarController implements Serializable {
@Inject
private Conversation conversation;
@PostConstruct
private void init() {
conversation.begin();
}
什么我希望是bean只得到实例化一次因为对话尚未结束,并保留manufacturer
字段中的值。但是,这并不适用,并且对于每个XHR请求再次实例化bean,导致manufacturer
字段也为null
。在PostConstruct
方法中设置断点显示它实际上已被调用,方法manufacturerSelected
也是如此。
我怀疑这与我没有手动传播对话ID的事实有关,但文档说这个ID应该自动传播任何faces请求。这实际上是否正确,这是否意味着XHR请求不一定是面对请求?
编辑:在豆的不同位置设置断点透露,每个XHR请求有一个新的bean(conversation.getId()
不断变化),所以我显然不传播正确的ID。如何用p:ajax传播ID,我可以在哪里用EL获得它?
虽然对话可能不是这里的方法,但您可以通过例如firebug或burpproxy调试实际的ajax请求,以查看真正发送的内容。 –