JSF-2 - f:ajax-tag funktioniert nicht
Ich habe ein problem mit f:ajax-tag. In meinem vorherigen Projekt, funktionierte alles perfekt. Jetzt habe ich ein anderes Projekt und f:ajax-tag funktioniert überhaupt nicht und ich weiß nicht, warum.
Habe ich dies in JSF-Seite mit Facelets:
<h:form>
...
<h:selectOneMenu id="employeeId" value="#{employeeBean.employeeId}">
<f:selectItems value="#{employeeBean.employeesSelectItem}"/>
<f:ajax event="change" listener="#{employeeBean.changeOwner}"/>
</h:selectOneMenu>
...
</h:form>
Und employeeBean mit changeOwner-Methode mit Datenbank-Zugriff:
...
public void changeOwner(AjaxBehaviorEvent event) {
try {
update.updateOwner(...params...);
JSF.setMessage(Messages.UPDATE_OK);
} catch (UpdateDBException ex) {
JSF.setMessage(ex.getMessage());
}
}
...
Kann ich nicht sehen, nichts falsch. Danke für die Hilfe.
UPDATE
faces-config:
<faces-config version="2.0"
xmlns="http://java.sun.com/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-facesconfig_2_0.xsd">
<converter>
<converter-for-class>java.util.Date</converter-for-class>
<converter-class>misc.TimeZoneConverter</converter-class>
</converter>
</faces-config>
xhtml-Seite:
<ui:composition xmlns:ui="http://java.sun.com/jsf/facelets"
template="./../templates/mainTemplate.xhtml"
xmlns:h="http://java.sun.com/jsf/html"
xmlns:f="http://java.sun.com/jsf/core">
<ui:define name="content">
<h2>Smazání zaměstnance</h2>
Protože s daným zaměstnancem (#{employeeBean.employee.name} #{employeeBean.employee.surname}) souvisejí některé úkoly, je potřeba, aby se jich ujal jiný. Vyberte prosím nové zaměstnance u všech níže uvedených úkolů.
<h:form>
<h:dataTable value="#{taskBean.employeeTasks}" var="item">
<h:column>
<f:facet name="header">ID</f:facet>
<center>#{item.idtask}</center>
</h:column>
<h:column>
<f:facet name="header">Zadavatel</f:facet>
<h:selectOneMenu id="managerId" value="#{employeeBean.newManagerId}" rendered="#{employeeBean.employeeId == item.employeeByIdmanager.idemployee}">
<f:selectItems value="#{employeeBean.otherEmployeesSelectItem}"/>
<f:ajax event="change" listener="#{employeeBean.changeOwner}"/>
</h:selectOneMenu>
<h:outputText value="#{item.employeeByIdmanager.name} #{item.employeeByIdmanager.surname}" rendered="#{employeeBean.employeeId != item.employeeByIdmanager.idemployee}"/>
</h:column>
<h:column>
<f:facet name="header">Zodpovědná osoba</f:facet>
<h:selectOneMenu id="employeeId" value="#{employeeBean.newEmployeeId}" rendered="#{employeeBean.employeeId == item.employeeByIdemployee.idemployee}">
<f:selectItems value="#{employeeBean.otherEmployeesSelectItem}"/>
<f:ajax event="change" listener="#{employeeBean.changeOwner}"/>
</h:selectOneMenu>
<h:outputText value="#{item.employeeByIdemployee.name} #{item.employeeByIdemployee.surname}" rendered="#{employeeBean.employeeId != item.employeeByIdemployee.idemployee}"/>
</h:column>
<h:column>
<f:facet name="header">Čas zadání</f:facet>
<center><h:outputText value="#{item.timestart}"/></center>
</h:column>
<h:column>
<f:facet name="header">Udělat do</f:facet>
<center><h:outputText value="#{item.timetodo}"/></center>
</h:column>
<h:column>
<f:facet name="header">Popis úkolu</f:facet>
#{item.text}
</h:column>
<h:column>
<f:facet name="header">Zákazník</f:facet>
<h:link outcome="viewCustomerDetails">
<h:panelGrid columns="1">
<h:outputText value="#{item.customer.name}"/>
<h:outputText value="#{item.customer.addresscity}"/>
</h:panelGrid>
<f:param name="customerId" value="#{item.customer.idcustomer}"/>
</h:link>
</h:column>
<h:column>
<f:facet name="header">Stav úkolu</f:facet>
#{item.taskstate.state}
</h:column>
<h:column>
<f:facet name="header">Poznámky</f:facet>
<h:outputText escape="false" value="#{item.note}"/>
</h:column>
</h:dataTable>
</h:form>
<h:messages globalOnly="true" styleClass="messages"/>
</ui:define>
UPDATE2
EmployeeBean:
package beans;
import beans.jsf.JSF;
import ejb.Get;
import ejb.Update;
import entities.Employee;
import entities.Permission;
import java.util.ArrayList;
import java.util.List;
import javax.ejb.EJB;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.ManagedProperty;
import javax.faces.bean.RequestScoped;
import javax.faces.model.SelectItem;
import javax.validation.constraints.Pattern;
import misc.Messages;
@ManagedBean(name="employeeBean")
@RequestScoped
public class EmployeeBean {
@EJB
private Get get;
@EJB
private Update update;
@ManagedProperty(name="employeeId", value="#{param['employeeId']}")
private int employeeId;
private int newManagerId;
private int newEmployeeId;
private String edit = "none";
@Pattern(regexp=".+", message="Jméno musí být vyplněno.")
private String name;
@Pattern(regexp=".+", message="Příjmení musí být vyplněno.")
private String surname;
private int permissionId;
private Employee employee;
/** Creates a new instance of EmployeeBean */
public EmployeeBean() {
}
public int getNewEmployeeId() {
return newEmployeeId;
}
public void setNewEmployeeId(int newEmployeeId) {
this.newEmployeeId = newEmployeeId;
}
public int getNewManagerId() {
return newManagerId;
}
public void setNewManagerId(int newManagerId) {
this.newManagerId = newManagerId;
}
public int getEmployeeId() {
return employeeId;
}
public void setEmployeeId(int employeeId) {
this.employeeId = employeeId;
employee = get.getEmployee(employeeId);
}
public String getEdit() {
return edit;
}
public void setEdit(String edit) {
this.edit = edit;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getPermissionId() {
return permissionId;
}
public void setPermissionId(int permissionId) {
this.permissionId = permissionId;
}
public String getSurname() {
return surname;
}
public void setSurname(String surname) {
this.surname = surname;
}
public Employee getEmployee() {
return employee;
}
public void setEmployee(Employee employee) {
this.employee = employee;
}
private void showEdit() {
edit = "block";
}
private void hideEdit() {
edit = "none";
}
/**
* Naplní SelectItem všemi zaměstnanci.
* @return seznam zaměstnanců
*/
public List<SelectItem> getEmployeesSelectItem() {
List<SelectItem> employees = new ArrayList<SelectItem>();
for (Employee e : get.getEmployees()) {
employees.add(new SelectItem(e.getIdemployee(), e.getName() + " " + e.getSurname()));
}
return employees;
}
/**
* Vrátí seznam zákazníků.
* @return seznam zákazníků
*/
public List<Employee> getEmployees() {
return get.getEmployees();
}
/**
* Načte úkol pro editaci.
*/
public void loadEmployee() {
Employee e = get.getEmployee(employeeId);
if (e != null) {
name = e.getName();
surname = e.getSurname();
permissionId = e.getPermission().getIdpermission();
showEdit();
} else {
JSF.setMessage(Messages.DB_RETURN_NULL);
}
}
/**
* Naplní SelectItem všemi oprávněními.
* @return seznam oprávnění
*/
public List<SelectItem> getPermissionsSelectItem() {
List<SelectItem> permissions = new ArrayList<SelectItem>();
for (Permission p : get.getPermissions()) {
permissions.add(new SelectItem(p.getIdpermission(), p.getPermissionname()));
}
return permissions;
}
/**
* Zapíše úpravy úkolu.
*/
public void updateEmployee() {
try {
update.updateEmployee(name, surname, employeeId, permissionId);
JSF.setMessage(Messages.EMPLOYEE_UPDATE_OK);
} catch (Exception ex) {
showEdit();
JSF.setMessage(ex.getMessage());
}
}
/**
* Zruší prováděné úpravy a skryje editaci.
*/
public void cancel() {
hideEdit();
}
public void changeOwner(int taskId) {
System.out.println("taskId: "+taskId);
System.out.println("managerId: "+newManagerId);
System.out.println("employeeId: "+newEmployeeId);
// try {
// update.updateOwner(taskId, newManagerId, newEmployeeId);
// JSF.setMessage(Messages.UPDATE_OK);
// } catch (UpdateDBException ex) {
// JSF.setMessage(ex.getMessage());
// }
}
/**
* Naplní SelectItem všemi možnými stavy pro úkol.
* @return seznam stavů úkolu
*/
public List<SelectItem> getOtherEmployeesSelectItem() {
List<SelectItem> employees = new ArrayList<SelectItem>();
for (Employee e : get.getOtherEmployees(employeeId)) {
employees.add(new SelectItem(e.getIdemployee(), e.getName() + " " + e.getSurname()));
}
return employees;
}
}
Du musst angemeldet sein, um einen Kommentar abzugeben.
Seit
f:ajax
listener
erwartetAjaxBehaviorEvent
ändern:
BEARBEITET: Prüfen Sie, ob eine andere Komponente in die Blöcke bilden, die das Formular übermittelt wird. (Vielleicht h:selectonemenu etc.)
Wird dies nur funktionieren, wenn das input-element in einem Formular. So setzen Sie das ganze Menü in eine
<h:form>
.Update: die
f:ajax
ist in der Tat eine JSF-2.0-tag. Wenn Sie sich jemals ändern Sie Ihre JSF-libs oder diefaces-config.xml
zu erfüllen, JSF 1.2, dann dief:ajax
aufhören zu arbeiten. Überprüfen Sie, wenn Sie mit der korrekten Versionsangabe libs und das root-Deklaration von allenfaces-config.xml
gesetzt zu JSF 2.0.Wenn das nicht hilft, dann sehe ich nicht andere Ursachen als die, daß Sie laufen nicht den code, den Sie denken, Sie sind. Haben Sie Lesen die server-logs? Hast du den debugger? Haben Sie beseitigen die umliegenden code, so dass die JSF-Seite endet mit nur Sie den code wie in deiner Frage innerhalb der
h:body
?Update 2: die
EmployeeBean
wird als@RequestScoped
was bedeutet, dass es garbaged am Ende der Anfrage (nach dem senden der Antwort). Die Belastung der Mitarbeiter ist abhängig von der Anwesenheit von eine Mitarbeiter-ID, die gesetzt wurden als request-parameter. Im Grunde muss man die Mitarbeiter-ID auf jeder Anfrage, um die Mitarbeiter zu laden, einschließlich ajaxical Anfragen. Auch wird die Darstellung des dropdown ist abhängig von der Anwesenheit von eine gültige Mitarbeiter in der Anfrage. Wenn die gerenderten Bedingungfalse
während ajaxical Anfrage, die ajax action wird nicht aufgerufen werden. Ich bin nicht sicher über dieses komplexen Fall, aber in der Theorie bestehen der Mitarbeiter-ID als hidden-parameter sollte helfen:Legen Sie es in das Formular neben dem Tisch.
@ViewScoped
.#{taskBean}
? Es tut bewahren, die gleichen Daten in die nachfolgenden Anforderungen?