使用Ajax更改InputText-Values

时间:2013-01-21 14:27:52

标签: ajax jsf

所以我有一堆InputText-Box,表达某种客户数据(客户ID,名字,姓氏等)

现在我想在输入有效的customer-id时自动填充(使用相应的mysql数据)所有InputText-Box。

<h:inputText id = "customer_id" value="#{reservationHandler.customer.customer_id}"/>

我想我必须使用Ajax将当前的customer-id传递给托管bean,但是我该怎么做呢?我如何填写其他InputText-Boxes?

提前致谢。

1 个答案:

答案 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类拥有多个属性,则有两个选项:

  1. render组件的<f:ajax>属性中设置每个输入的ID,但这非常天真。

  2. 使用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>
    
  3. 要了解在<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。