为什么这个ajax @form提交不更新和呈现模型值?

时间:2017-07-20 14:07:48

标签: ajax jsf-2 mojarra

我有以下方案,并且使用ajax提交表单时遇到问题:

DataContext

模型是一个简单的javabean,只有getter和setter来表示值。

当我点击ajax按钮时,我可以看到一个请求进入服务器,持有我的Form-Data。 我使用输出文本的硬编码值得到了部分响应 - 但不是模型值。 我可以看到,我的二传手也没有被召唤。

如果我将ajax执行更改为特定的inputText组件ID - 而不是适用于那个。

我错过了什么?

- 引用EmployeeBean

<Style TargetType="{x:Type DataGridCell}">
    <Style.Triggers>
        <MultiDataTrigger>
            <MultiDataTrigger.Conditions>
                <Condition Binding="{Binding DataContext.IsTopElement, RelativeSource={RelativeSource AncestorType=UserControl}}" Value="False"/>
                <Condition Binding="{Binding IsCustomer}" Value="True"/>
            </MultiDataTrigger.Conditions>
            <Setter Property="IsEnabled" Value="False"/>
        </MultiDataTrigger>
    </Style.Triggers>
</Style>

EmployeeController:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE html
        PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
        "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml"
    xmlns:h="http://java.sun.com/jsf/html"
    xmlns:f="http://java.sun.com/jsf/core" xml:lang="en" lang="en"
    xmlns:ui="http://java.sun.com/jsf/facelets">
<h:head>
<h:outputStylesheet library="css" name="employee.css"  />

    <title>Welcome</title>
</h:head>
<h:body>
<h:form>
    <h:panelGrid>
        <h:outputLabel for="first_name" value="First Name" />
        <h:inputText id="first_name"
            value="#{employeeController.model.firstName}" required="true" />

        <h:outputLabel for="last_name" value="Last Name" />
        <h:inputText id="last_name"
            value="#{employeeController.model.lastName}" required="true" />

        <h:outputLabel for="email" value="Email" />
        <h:inputText id="email" value="#{employeeController.model.email}"
            required="true" />

        <h:outputLabel for="phone_number" value="Phone" />
        <h:inputText id="phone_number"
            value="#{employeeController.model.phoneNumber}" required="true" />

        <h:outputLabel for="salaray" value="Salary" />
        <h:inputText id="salaray" value="#{employeeController.model.salary}"
            required="true" />

        <h:commandButton value="Save(AJAX)">
            <f:ajax execute="@form" render="modelOutput"/>
        </h:commandButton>
    </h:panelGrid>
</h:form>
    <h:panelGrid id="modelOutput">
        <h:outputText id="fName"
            value="First Name: #{employeeController.model.firstName}" />
        <h:outputText value="Last Name: #{employeeController.model.lastName}" />
        <h:outputText value="E-Mail: #{employeeController.model.email}" />
        <h:outputText
            value="Phonenumber: #{employeeController.model.phoneNumber}" />
        <h:outputText value="Salary: #{employeeController.model.salary}" />
    </h:panelGrid>
</h:body>
</html>

1 个答案:

答案 0 :(得分:0)

所以我找到了解决方案的原因。

主要问题如下:

从生命周期的监听者中我看到服务器端的处理跳过阶段4&amp; 5。 这是什么原因? 那么 - 阶段3是关于验证。我的表单有一些验证限制,即required

我没有填写所有输入字段,因此验证阶段没有成功。 JSF然后跳过第4阶段&amp; 5 - 现在我们也知道为什么没有召集人。

以下是踢球者: 它彻底失败了! 你确实得到一个包含表单参数的好的ajax请求。并且您确实获得了良好的部分响应 - 但没有来自bean的动态值。

应用程序日志中没有错误消息(好吧,也应该没有,但这会让你知道没有异常)。 但显然Ajax不会像使用完整页面请求时那样填充任何组件。 您没有任何有关失败验证的信息。 如果您不使用生命周期信息输出,则无法以任何方式查看它。

此外,我唯一能够找到的是添加一个呈现某些信息的组件。添加一个硬编码的outputText,它只会在facesContext.validationFailed的信息上呈现,并通过ajax facelet呈现。

<h:commandButton value="Save (AJAX)">
                <f:ajax execute="@form" render="modelOutput global_flag_validation_failed_render" />
            </h:commandButton>
            <h:messages />
            <h:panelGroup id="global_flag_validation_failed_render">
                <h:outputText id="global_flag_validation_failed" value="Fehler in Ajax aufgetreten!"
                    rendered="#{facesContext.validationFailed}" />
            </h:panelGroup>

我不知道这是Mojarra 2.2.14的指定和想要的行为 - 有人知道吗?