Killkala
Messages postés6Date d'inscriptionlundi 2 octobre 2017StatutMembreDernière intervention18 octobre 2017
-
2 oct. 2017 à 10:27
KX
Messages postés16722Date d'inscriptionsamedi 31 mai 2008StatutModérateurDernière intervention25 septembre 2023
-
18 oct. 2017 à 19:20
Bonjour à tous !
Je sais que de nombreux sujet traite déjà de ma question, mais beaucoup sont en php et en java je ne trouve pas ma réponse.
J'ai déjà une partie de code construit. Et je pense que le problème vient de ma servlet car lorsque je rentre idSelect = (long) 1, il me ressort bien la zone 1 de ma liste. Mais du coup j'ai pas vraiment d'idée !
Je vous montre mon code : (j'ai enlever des grosses partie de mon code qui ne sont pas utile dans mon problème donc ne soyez pas étonné de certaines choses! Cela rend la lecture plus simple)
Je vous remercie d'avance
Ca fait vraiment un moment que je suis bloqué et je manque de connaissance pour trouvé, so .. HELP MEEE, PLEASE !! ^^
(désolé pour les fautes d'orthographes, on me le reproche souvent!)
Killkala
Messages postés6Date d'inscriptionlundi 2 octobre 2017StatutMembreDernière intervention18 octobre 2017 3 oct. 2017 à 09:50
Bonjour KX,
En effet, tes indications m'ont aidé cela a résolu le problème (il y avait aussi un autre soucis mais que j'ai pu résoudre rapidement)
Cela marche beaucoup mieux même si lent je trouve, peut-être une histoire de cache.
J'ai juste une dernière question, dans ma deuxième liste, ma première liste se réaffiche en plus. Une idée ?
C'est à dire :
Liste 2 -> Elements Liste1 + Elements Liste2
Je voudrai pouvoir enlever les éléments de la liste 1.
KX
Messages postés16722Date d'inscriptionsamedi 31 mai 2008StatutModérateurDernière intervention25 septembre 2023126 3 oct. 2017 à 13:18
"même si lent je trouve, peut-être une histoire de cache" J'ai surtout l'impression que tu ne fais pas suffisamment la distinction entre les deux cas d'utilisations, notamment tu fais :
Or un seul des deux chargements est nécessaire, soit tu récupères tout, soit un seul, mais il n'y a pas de raison de faire les deux actions à chaque fois, ce qui explique pourquoi c'est plus long que ça ne devrait.
En plus ici tu récupères une nouvelle page à chaque fois que tu changes une valeur, alors que la partie AJAX devrait juste récupérer la liste des valeurs et ne modifier (en JS) que cette partie là dans la page sans recharger tout le reste.
Je pense qu'au final tu devrais avoir deux servlets :
celle que tu as déjà et qui charge la JSP entière la première fois
une nouvelle servlet qui prends le paramètre de recherche spécifique et renvoie juste la liste des valeurs de la combobox.
Killkala
Messages postés6Date d'inscriptionlundi 2 octobre 2017StatutMembreDernière intervention18 octobre 2017
>
KX
Messages postés16722Date d'inscriptionsamedi 31 mai 2008StatutModérateurDernière intervention25 septembre 2023 4 oct. 2017 à 12:03
Bonjour KX,
Merci de ton aide, je pense avoir beaucoup avancé avec tes indications. J'ai crée ma 2e servlet comme tu me l'a conseillé mais je pense que je ne dois pas bien renvoyer les valeurs.
Voici ma 2e servlet :
ListServket.java
package com.auscult.servlets;
import java.io.IOException;
import java.util.ArrayList;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import com.auscult.beans.Zone;
import com.auscult.dao.DAOFactory;
import com.auscult.dao.DaoZone;
public class ListServlet extends HttpServlet {
private static final long serialVersionUID = 1L;
public static final String CONF_DAO_FACTORY = "daofactory";
private DaoZone daoZone;
public void init() throws ServletException {
this.daoZone = ( (DAOFactory) getServletContext().getAttribute( CONF_DAO_FACTORY ) ).getZoneDao();
}
public void doGet( HttpServletRequest request, HttpServletResponse response ) throws ServletException, IOException {
Long idSelect = null;
if (request.getParameter("select")!= null) {
idSelect = Long.parseLong(request.getParameter( "select" ));
}
ArrayList<Zone> arrayZone = daoZone.findByChantier(idSelect);
request.setAttribute("arrayZone", arrayZone);
this.getServletContext().getRequestDispatcher( "/WEB-INF/admin/create/stationForm.jsp" ).forward( request, response );
}
}
Dans ma ListBox je récupère bien les éléments de façon dynamique, mais le soucis c'est qu'elle s'affiche de la manière suivante :
NomList1 + NomList2 + ElementsList2
Or je ne veux pas du nom de la liste 1 en debut. Je pense qu'il doit peut-être encore y avoir un double chargement lorsque j'utilise RequestDispatcher, où je ne sais pas trop à vrai dire, j'ai fais pas mal de test mais rien de concluant à ce sujet.
KX
Messages postés16722Date d'inscriptionsamedi 31 mai 2008StatutModérateurDernière intervention25 septembre 2023126
>
Killkala
Messages postés6Date d'inscriptionlundi 2 octobre 2017StatutMembreDernière intervention18 octobre 2017 Modifié le 4 oct. 2017 à 20:26
Dans mon idée, la deuxième servlet ne devrait pas renvoyer une JSP, il ne faut pas changer de page web mais juste compléter la page déjà affichée avec des données additionnelles.
Par exemple :
public void doGet( HttpServletRequest request, HttpServletResponse response ) throws ServletException, IOException {
long idSelect = Long.parseLong(request.getParameter("select"));
List<Zone> zones = daoZone.findByChantier(idSelect);
String json = zones.stream().map(Zone::toString).collect(Collectors.joining("','","['","']"));
response.getWriter().write(json);
}
Et côté JS :
zones = eval(xhr.responseText);
que tu pourras mettre directement dans ta liste déroulante en modifiant le DOM (c'est le principe de l'AJAX)
Killkala
Messages postés6Date d'inscriptionlundi 2 octobre 2017StatutMembreDernière intervention18 octobre 2017
>
KX
Messages postés16722Date d'inscriptionsamedi 31 mai 2008StatutModérateurDernière intervention25 septembre 2023 12 oct. 2017 à 12:16
Bonjour KX,
Merci pour ton aide encore une fois! J'avoue avoir fait une petite pause sur ce problème qui me prenais beaucoup la tête, mais maintenant je n'ai plus le choix de le résoudre !
Alors côté Java je pense que tout se passe bien, il récupère bien la liste de Zones qui dépend de Chantier. J'ai appliqué tes conseils pour la servlet.
En faite la le problème c'est plutôt côté Ajax (j'avoue que c'est l'une des première fois que j'en fais et ce n'est pas simple!)
Dans mon fichier .JS, j'applique donc ce que tu m'as dis de cette façon :
if (xhr.status == 200 || xhr.status == 0) {
zones = eval(xhr.responseText);
console.log(zones);
}
Et dans ma console (sans parler de ma JSP dans un premier temps mais ca m'a donné le même résultat), ça m'affiche ça :
["com.auscult.beans.Zone@3055971a"]
Je ne comprend pas du tout ce résultat, surtout que les chiffres/lettres après l'@ changent à chaque fois
Moi je voudrai afficher l'Id (ou le nom peut importe ça reviens au même).
J'ai essayé "zones.zone_id" mais là il m'affiche "undefined"
J'espère que tu pourras m'aider !
Merci en tout cas :)
KX
Messages postés16722Date d'inscriptionsamedi 31 mai 2008StatutModérateurDernière intervention25 septembre 2023126
>
Killkala
Messages postés6Date d'inscriptionlundi 2 octobre 2017StatutMembreDernière intervention18 octobre 2017 12 oct. 2017 à 13:11
Sur le stream j'ai fait un
map(Zone::toString)
donc on appelle la méthode
toString()
sur les objets Zone.
Si tu obtiens
com.auscult.beans.Zone@3055971a
c'est parce que tu n'as pas redéfini la méthode toString dans ta classe, donc tu hérites le comportement par défaut de la classe Object.
Alors soit tu redéfinis la méthode toString pour ta classe Zone, soit tu changes le mapping pour appeler une autre méthode, par exemple si tu as une méthode
<script>
function list1changelist2() {
list1 = document.getElementById("list1");
selected = list1.selectedOptions[0].value;
var xmlHttp = new XMLHttpRequest();
xmlHttp.onreadystatechange = function() {
if (xmlHttp.readyState == 4 && xmlHttp.status == 200) {
list2 = document.getElementById("list2");
list2.innerHTML = xmlHttp.response;
}
}
xmlHttp.open("GET", "/data?id="+selected, true);
xmlHttp.send(null);
}
list1changelist2(); // pour l'initialisation
</script>
À chaque fois que la liste 1 change de valeur dans le HTML on appelle la fonction du code JavaScript, celui-ci va lire le DOM pour récupérer la valeur sélectionnée, par exemple "a", "b" ou "c" et faire une requête HTTP GET sur ton serveur à l'URL /data?id=a, /data?id=b ou /data?id=c selon la valeur.
Voici ce que pourrait renvoyer l'URL /data selon la valeur de l'id (ce que tu devrais faire avec une deuxième JSP)
C'est ce contenu qui sera inséré dans la liste2 à chaque appel de la fonction (que l'on peut appeler une première fois au chargement de la page pour initialiser la première valeur).