【发布时间】:2017-12-26 07:03:42
【问题描述】:
我遇到以下情况,并且使用 ajax 提交表单时遇到问题:
<?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>
模型是一个简单的 javabean,只有 getter 和 setter 的值。
当我单击 ajax 按钮时,我可以看到一个请求发送到服务器,其中包含我的表单数据。 我得到了输出文本的硬编码值的部分响应 - 但不是模型值。 我可以看到我的设置器也没有被调用。
如果我将 ajax 执行更改为特定的 inputText 组件 ID - 它适用于该组件。
我错过了什么?
-- 员工豆
public class EmployeeBean {
private String firstName;
private String lastName;
private String email;
private String phoneNumber;
private Float salary;
public String getFirstName() {
return firstName;
}
public void setFirstName(String firstName) {
this.firstName = firstName;
}
public String getLastName() {
return lastName;
}
public void setLastName(String lastName) {
this.lastName = lastName;
}
public String getEmail() {
return email;
}
public void setEmail(String email) {
this.email = email;
}
public String getPhoneNumber() {
return phoneNumber;
}
public void setPhoneNumber(String phoneNumber) {
this.phoneNumber = phoneNumber;
}
public Float getSalary() {
return salary;
}
public void setSalary(Float salary) {
this.salary = salary;
}
}
员工控制器:
@ManagedBean
@RequestScoped
public class EmployeeController {
private EmployeeBean model;
@PostConstruct
public void init() {
model = new EmployeeBean();
}
public EmployeeBean getModel() {
return model;
}
public void clearAjax(AjaxBehaviorEvent ajaxBehaviorEvent) {
clearUiAreaForm(ajaxBehaviorEvent.getComponent());
System.out.println("Form cleared");
}
}
【问题讨论】:
-
请通过编辑代码改进您的问题。它不完整。并确定您没有收到任何错误?
-
我看不出有人愿意在问题中看到样板代码的原因,但我会为那些似乎喜欢它的人增强它;)您是否还想看到提到的 Model 类根据 JavaBean 规范工作?我很乐意提供任何人想看到的每一行。 -- 是的,我确信我没有收到任何错误,因为我可以看到我得到了无错误的部分响应,并且我可以看到提交的请求包含表单值。浏览器的javascript控制台没有错误,我的应用服务器日志也没有错误。
-
我从未要求过样板文件等...但我注意到您发布的部分内容由于格式错误而被隐藏。下次请把它改成minimal reproducible example...你在开发模式下运行应用程序吗?
-
所以实际问题是验证失败 - 我只能通过准确检查生命周期来跟踪这一点 - 缺少第 4 阶段和第 5 阶段。我仍然不知道为什么他们在 ajax 中默默地失败了,但它确实失败了。