[Risolto] [Sviluppo] JSF e AJAX

Linguaggi di programmazione: php, perl, python, C, bash e tutti gli altri.
Fabio1989
Prode Principiante
Messaggi: 151
Iscrizione: domenica 1 novembre 2009, 22:26

[Risolto] [Sviluppo] JSF e AJAX

Messaggio da Fabio1989 »

Salve a tutti,
avrei bisogno di una mano per implementare una chiamata ajax ( o anche pseudo-ajax usando gli iframes).

Praticamente ho due combobox, di cui inizialmente solo una popolata; all'onchange dell'una si deve valorizzare l'altra con query su DB.
Purtroppo, però, ho possibilità di usare solo la versione 1.2 di JSF, per la quale non sono riuscito a trovare molti esempi.

Avevo fatto giusti un inizio, del tipo:

Codice: Seleziona tutto

<%@ page language="java" contentType="text/html; charset=ISO-8859-1" pageEncoding="ISO-8859-1"%>
<%@ taglib prefix="f"  uri="http://java.sun.com/jsf/core"%>
<%@ taglib prefix="h"  uri="http://java.sun.com/jsf/html"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
<title>AJAX</title>

<script type="text/javascript">
	function popolaCombo2 (){
		alert('???');
	}
</script>

</head>
<body>
<f:view>
	<h:form id="formPrincipale">
		<h:selectOneMenu id="combo1" value="#{bean.valueCombo1}" onchange="popolaCombo2()">
			<f:selectItems value="#{bean.combo1}"/>
		</h:selectOneMenu>
		
		<h:selectOneMenu id="combo2" value="#{bean.valueCombo2}">
			<f:selectItems value="#{bean.combo2}"/>
		</h:selectOneMenu>
		
		<h:commandButton value="avanti"></h:commandButton>
	</h:form>
</f:view>
</body>
</html>

Codice: Seleziona tutto

package testAjax;

import java.util.HashMap;
import java.util.Map;

public class Bean {

	
	private Map <String, String> combo1 = new HashMap();
	private Map <String, String> combo2 = new HashMap();
	private String valueCombo1 = "";
	private String valueCombo2 = "";
	
	public Bean(){
		combo1 = new HashMap();
		combo2 = new HashMap();
	}
	
	public Map getCombo1 (){
			combo1 = new HashMap<String, String>();
			combo1.put("1", "1");
			combo1.put("2", "2");
			/* ecc */
		
		return combo1;
		
	}
	
	public Map getCombo2 (){
		return new HashMap<String, String>();
		/*if (this.combo1 == null)
			return null;
		
		if (this.valueCombo1.equals("1")){
			combo2.put("3", "3");
		} else {
			combo2.put("4", "4");
		}
		return combo2;
		*/
	}

	public String getValueCombo1() {
		return valueCombo1;
	}

	public void setValueCombo1(String valueCombo1) {
		this.valueCombo1 = valueCombo1;
	}

	public String getValueCombo2() {
		return valueCombo2;
	}

	public void setValueCombo2(String valueCombo2) {
		this.valueCombo2 = valueCombo2;
	}
}

Ultima modifica di Fabio1989 il domenica 5 febbraio 2012, 16:00, modificato 1 volta in totale.
Avatar utente
elsco
Scoppiettante Seguace
Scoppiettante Seguace
Messaggi: 350
Iscrizione: giovedì 19 giugno 2008, 12:46
Località: Napoli

Re: [Sviluppo] JSF e AJAX

Messaggio da elsco »

Ciao,
Per effettuare delle chiamate ajax senza complicarti la vita puoi utilizzare delle librerie di estensione di JSF(richfaces,primefaces,icefaces, ecc...).
Tra tutte ti consiglio Richfaces.
Inoltre puoi implementare questo comportamento con una chiamata classica a server.
Sul valueChangeListener della prima combo agganci un metodo del tuo managedBean nel quale vai a popolare la seconda combo.
Il valore della prima combo lo puoi prendere dall'actionEvent.

Codice: Seleziona tutto

<h:selectOneMenu id="combo1" valueChangeListener="#{tuoMBean.popolaCombo}" >
     <f:selectItems value="#{bean.combo1}"/>
</h:selectOneMenu>
E nel managedBean

Codice: Seleziona tutto

public void popolaCombo(ActionEvent event){
// valorizza combo2
}
Fabio1989
Prode Principiante
Messaggi: 151
Iscrizione: domenica 1 novembre 2009, 22:26

Re: [Sviluppo] JSF e AJAX

Messaggio da Fabio1989 »

elsco ha scritto: Ciao,
Per effettuare delle chiamate ajax senza complicarti la vita puoi utilizzare delle librerie di estensione di JSF(richfaces,primefaces,icefaces, ecc...).
Tra tutte ti consiglio Richfaces.
Inoltre puoi implementare questo comportamento con una chiamata classica a server.
Sul valueChangeListener della prima combo agganci un metodo del tuo managedBean nel quale vai a popolare la seconda combo.
Il valore della prima combo lo puoi prendere dall'actionEvent.

Codice: Seleziona tutto

<h:selectOneMenu id="combo1" valueChangeListener="#{tuoMBean.popolaCombo}" >
     <f:selectItems value="#{bean.combo1}"/>
</h:selectOneMenu>
E nel managedBean

Codice: Seleziona tutto

public void popolaCombo(ActionEvent event){
// valorizza combo2
}

La seconda soluzione è ottima, in effetti simula una chiamata ajax...
Ti ringrazio! :)
Avatar utente
elsco
Scoppiettante Seguace
Scoppiettante Seguace
Messaggi: 350
Iscrizione: giovedì 19 giugno 2008, 12:46
Località: Napoli

Re: [Sviluppo] JSF e AJAX

Messaggio da elsco »

Con la chiamata ajax avresti fatto la stessa cosa con la differenza che avresti ricaricato solo parte della jsp.
Ti faccio l'esempio con un tag RichFaces:

Codice: Seleziona tutto

<h:selectOneMenu id="combo1" value="#{bean.valueCombo1}">
	<f:selectItems value="#{bean.combo1}"/>
        <a4j:support event="onchange" actionListener="#{mbean.popolaCombo}" reRender="combo2"/>
</h:selectOneMenu>

<h:selectOneMenu id="combo2" value="#{bean.valueCombo2}">
	<f:selectItems value="#{bean.combo2}"/>
</h:selectOneMenu>
In questo modo avresti ricaricato solo la seconda combo(combo2) e non tutta la pagina.

Ciao
Fabio1989
Prode Principiante
Messaggi: 151
Iscrizione: domenica 1 novembre 2009, 22:26

Re: [Sviluppo] JSF e AJAX

Messaggio da Fabio1989 »

elsco ha scritto: Con la chiamata ajax avresti fatto la stessa cosa con la differenza che avresti ricaricato solo parte della jsp.
Ti faccio l'esempio con un tag RichFaces:

Codice: Seleziona tutto

<h:selectOneMenu id="combo1" value="#{bean.valueCombo1}">
	<f:selectItems value="#{bean.combo1}"/>
        <a4j:support event="onchange" actionListener="#{mbean.popolaCombo}" reRender="combo2"/>
</h:selectOneMenu>

<h:selectOneMenu id="combo2" value="#{bean.valueCombo2}">
	<f:selectItems value="#{bean.combo2}"/>
</h:selectOneMenu>
In questo modo avresti ricaricato solo la seconda combo(combo2) e non tutta la pagina.

Ciao
Ottimo, ti ringrazio per l'esempio con questo tag, a livello di codice sembra molto simile alla soluzione del valueChangeListener.
Eventualmente, sarebbe molto difficile includerlo in un progetto già esistente?
La versione di jsf è comunque vecchiotta, forse addirittura precedente alla 1.2 che dicevo sopra...

P.S.: mi sapresti consigliare una guida per jsf, magari dove l'hai imparata tu (vedo molto bene)?
Grazie ancora :)
Avatar utente
elsco
Scoppiettante Seguace
Scoppiettante Seguace
Messaggi: 350
Iscrizione: giovedì 19 giugno 2008, 12:46
Località: Napoli

Re: [Sviluppo] JSF e AJAX

Messaggio da elsco »

Aggiungere RichFaces al progetto è semplice, sulla documentazione ufficiale ti spiega come fare:
http://docs.jboss.org/richfaces/latest_3_3_X/en/devguide/html/GettingStarted.html#AddingRichFaceslibrariesintotheproject
Per quanto riguarda la guida o libro non te lo so consigliare perché l'ho imparato lavorando... mi dispiace.

Ciao
Fabio1989
Prode Principiante
Messaggi: 151
Iscrizione: domenica 1 novembre 2009, 22:26

Re: [Sviluppo] JSF e AJAX

Messaggio da Fabio1989 »

elsco ha scritto: Aggiungere RichFaces al progetto è semplice, sulla documentazione ufficiale ti spiega come fare:
http://docs.jboss.org/richfaces/latest_3_3_X/en/devguide/html/GettingStarted.html#AddingRichFaceslibrariesintotheproject
Per quanto riguarda la guida o libro non te lo so consigliare perché l'ho imparato lavorando... mi dispiace.

Ciao

Ho capito, grazie comunque  8)
Avatar utente
elsco
Scoppiettante Seguace
Scoppiettante Seguace
Messaggi: 350
Iscrizione: giovedì 19 giugno 2008, 12:46
Località: Napoli

Re: [Sviluppo] JSF e AJAX

Messaggio da elsco »

Non dimenticare di mettere risolto.

Ciao
Scrivi risposta

Ritorna a “Programmazione”

Chi c’è in linea

Visualizzano questa sezione: 0 utenti iscritti e 1 ospite