所以我有一堆InputText-Box,表达某种客户数据(客户ID,名字,姓氏等)
现在我想在输入有效的customer-id时自动填充(使用相应的mysql数据)所有InputText-Box。
<h:inputText id = "customer_id" value="#{reservationHandler.customer.customer_id}"/>
我想我必须使用Ajax将当前的customer-id传递给托管bean,但是我该怎么做呢?我如何填写其他InputText-Boxes?
提前致谢。
答案 0 :(得分:1)
此任务可以使用JSF 2附带的<f:ajax>
标记完成,并在this tutorial中得到了很好的说明。第一个示例向您展示如何完成手头的任务。另一个建议是对您的托管bean使用@ViewScoped
注释,如BalusC博客文章Communication in JSF 2.0 - Managed bean scopes所述。
使用所有这些信息和您正在使用的托管bean,演示可以是:
客户类
public class Customer {
private int customer_id;
private String name;
//constructor, getters and setters...
}
ReservationHandler托管bean
@ManagedBean
@ViewScoped
public class ReservationHandler {
private Customer customer;
//this EJB will retrieve the Customer data
//if you don't have it like this, then use your own
//custom CustomerService class/implementation to retrieve the data from dabatase
@EJB
private CustomerService customerService;
//constructor, getters and setters...
@PostConstruct
public void init() {
customer = new Customer();
}
public void showCustomerDataListener(AjaxBehaviorEvent event) {
Customer customerFromDB =
customerService.getCustomer(customer.getCustomer_id());
if (customerFromDB != null) {
customer = customerFromDB;
}
}
}
Customer Facelets视图(只是相关代码)
<h:form>
<h:outputText value="Customer ID:" />
<h:inputText id="customer_id"
value="#{reservationHandler.customer.customer_id}">
<f:ajax event="blur"
listener="#{reservationHandler.showCustomerDataListener}"
render="customer_name" />
</h:inputText>
<h:outputText value="Customer name:" />
<h:inputText id="customer_name"
value="#{reservationHandler.customer.name}" />
</h:form>
如果您的Customer
类拥有多个属性,则有两个选项:
在render
组件的<f:ajax>
属性中设置每个输入的ID,但这非常天真。
使用UIContainer
对所有组件进行分组并渲染此UIContainer。假设Customer
类具有额外的private String address
属性而给出的示例:
<h:form>
<h:outputText value="Customer ID:" />
<h:inputText id="customer_id"
value="#{reservationHandler.customer.customer_id}">
<f:ajax event="blur"
listener="#{reservationHandler.showCustomerDataListener}"
render="customerData" />
</h:inputText>
<h:panelGrid id="customerData" columns="2">
<h:outputText value="Customer name:" />
<h:inputText id="customer_name"
value="#{reservationHandler.customer.name}" />
<h:outputText value="Address:" />
<h:inputText id="customer_address"
value="#{reservationHandler.customer.address}" />
</h:panelGrid>
</h:form>
要了解在<f:ajax event="what_to_write_here">
中应用的受支持事件,请参阅f:ajax JSF Core Tag Reference,事件代码属性说明:
将调用Ajax请求的事件,例如“click”,“change”,“blur”,“keypress”等。启用了Ajax行为的组件必须支持该事件即可。注意:事件名称与没有“on”前缀的DOM事件名称相同,因此对于“onclick”事件,正确的事件名称是“click”。命令组件(如h:commandButton和h:commandLink)支持“action”事件,输入组件支持“valueChange”事件,例如h:inputText和h:selectOneMenu。