J'ai une page qui a un appel preRender qui prépare tout ce qui doit être affiché dans la page. Je ne sais pas si c'est pertinent, mais la page reçoit quelques paramètres de l'index.xhtml qui précède l'expérience.
J'ai un commandButton qui doit exécuter une méthode côté serveur (une mise à jour, pour être précis). Il n'est pas nécessaire de rafraîchir la page.
J'utilise donc l'ajax. Voici le code du bouton
<h:commandButton value="Save">
<f:ajax event="click" listener="#{bean.save}"/>
</h:commandButton>
Jusqu'à présent, du côté java, voici la méthode de sauvegarde du haricot
public void save(){
log.debug("Save executed!");
}
J'ai ajouté quelques journaux pour vérifier ce qui est exécuté. Lorsque je clique sur le bouton, la seule chose qui se produit est l'exécution de la méthode preRender (et pas entièrement, juste une partie). Rien d'autre ne se produit. Visuellement, la page n'est pas rafraîchie ou autre.
Je soupçonne que, lorsque je clique sur le bouton, la page est rafraîchie et que, par conséquent, la méthode preRender (appelée Build()) est exécutée, mais comme il n'y a pas de paramètres (rappelez-vous que la méthode Build requiert des paramètres passés par le biais de <f:param>
), il y a un problème.
En résumé : J'ai juste besoin d'exécuter la méthode de sauvegarde lorsque je clique sur le bouton sans rafraîchir ou rediriger quoi que ce soit.
Des idées ?
--EDIT--
INDEX.XHTML
<html xmlns="http://www.w3.org/1999/xhtml"
xmlns:ui="http://java.sun.com/jsf/facelets"
xmlns:f="http://java.sun.com/jsf/core"
xmlns:h="http://java.sun.com/jsf/html"
xmlns:c="http://java.sun.com/jstl/core">
<ui:define name="body">
<h:link outcome="agreementDetail.xhtml" value="EA-15558">
<f:param name="serviceId" value="EA-15558" />
<f:param name="site" value="NIC" />
</h:link>
</ui:define>
</html>
Détails de l'accord.XHTML
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html xmlns="http://www.w3.org/1999/xhtml"
xmlns:ui="http://java.sun.com/jsf/facelets"
xmlns:f="http://java.sun.com/jsf/core"
xmlns:h="http://java.sun.com/jsf/html"
xmlns:c="http://java.sun.com/jstl/core">
<f:view>
<f:event type="preRenderView" listener="#{agreement.build}"/>
</f:view>
<ui:define name="body">
<f:view>
<h:form>
<h:commandButton value="Save" action="#{agreement.save}">
<f:ajax/>
</h:commandButton><br/><br/>
<h:dataTable value="#{agreement.licenseServerNames}" var="licenseServerName">
<h:column>
<h:inputText value="#{licenseServerName}"/>
</h:column>
</h:dataTable>
</h:form>
</f:view>
</ui:define>
</html>
AgreementBean.java
@ManagedBean(name="agreement")
@RequestScoped
public class AgreementBean {
@ManagedProperty("#{param.serviceId}")
private String serviceId;
@ManagedProperty("#{param.site}")
private String site;
private List<String> licenseServerNames; //GETTERS AND SETTERS OMITTED TO AVOID EXCESS CODE
@PostConstruct
public void build(){
logger.debug("START");
methodOne();
logger.debug("END");
}
public void save(){
logger.debug("SAVE!!!!!");
for(String name : licenseServerNames){
logger.debug("Servername = "+name);
}
}
}