Pas grave :sm:
Maintenant ça fonctionne bien ?
Version imprimable
Pas grave :sm:
Maintenant ça fonctionne bien ?
Si tu mets un point d'arrêt dans la servlet et que tu suis le processus, ça se plante dans la classe IPX800V3 ou dès l'appel de la servlet ?
EDIT:
P'tain j'suis con, http.send() c'est le javascript... oups...
Je pense que le problème vient du fait que tu n'as pas mis la bonne url côté javascript... chez moi l'application se nommait "automate", toi non... du coup, il faut modifier l'url ajax
Je ne suis sur a 100% mais ça se plante lors de l'appel de la servlets
Il faudrait mettre ceci
Code:http.open("GET", window.location.pathname + "getState?addr=" + adresse, true);
Il manque un petit "/" non ?
Pièce jointe 533099
Oups, j'ai mal fait mon test...
Mets plutôt
Code:http.open("GET", "/ApplicationWebAutomate/getState?addr=" + adresse, true);
C'est bon, j'arrive a rentrer l'adresse IP cela fonctionne mais lorsque je souhaite lancer l'extraction cyclique :
Pièce jointe 533103
Pièce jointe 533106
Sans le traitement cyclique ça fonctionne bien ?
Ton automate répond en combien de temps ?
Dans l'application que je t'ai donné, le cycle entre les requêtes est de 5 secondes, c'est peut-être trop juste (en plus de ne pas être super utile)... tu devrais augmenter cette valeur, 30 secondes est déjà assez court...
C'est la ligne
L'intervalle est en millisecondesCode:intervalId = setInterval("reloadData()", 5000);
Lorsque je rentre l'ip et que je clique sur ajouter automate en un peu plus 10 secondes.
J'ai changé le cycle entre les requêtes, j'ai mis comme tu m'as dit "30000". Mais je n'arrive plus à me connecter..
Pièce jointe 533107
Je vois mal comment t'aider, je n'ai pas d'IPX800 sous la main...
Tu peux déjà mettre en commentaire la ligneet voir ce que ça donne...Code:socket.setSoTimeout(10000);
Je comprend, tu m'as deja beaucoup aidé.
J'ai l'impression que ça n'arrive pas jusqu’à la classe IPX800.
J'ai ceci dans la console :
Extraction de l'état de l'automate 172.22.55.210 en cours...
java.net.ConnectException: Connection timed out: connectExtraction de l'état de l'automate 172.22.55.210 terminée.
Extraction de l'état de l'automate 172.22.55.210 en cours...
java.net.ConnectException: Connection timed out: connectExtraction de l'état de l'automate 172.22.55.210 terminée.
Normalement, c'est une erreur liée à la classe IPX800V3, tu peux mettre un point d'arrêt dans le catch de la servlet, peut-être que tu auras des informations en explorant l'exception.
Tu as bien mis le setSoTimeout en commentaire ?
L'erreur semble venir d'un timeout sur la lecture, donc à priori à la ligne br.readLine().
Je regarde :
Pièce jointe 533265
Oui il est bien en commentaire.
J'ai l'impression que j'accède pas a la requête ou que le programme n'arrive pas a sortir de la fonction getAutomateData..
Si tu ne poursuis pas l'exécution, c'est normal. Quand il atteint un point d'arrêt, il s'arrête jusqu'à ce que tu lui dises de continuer (F6 pas à pas, F8 on passe).
Si tu mets le point d'arrêt sur la ligne result = e.toString(); tu auras accès à la variable "e" (l'exception) et tu pourras explorer l'objet...
Mais bon, vu l'exception, c'est que ton automate ne répond pas dans le délai imparti...
Essaye de mesurer le temps par défaut qu'il attend et ensuite, adapte la ligne socket.setSoTimeout(...) avec une valeur supérieure... ou, dans un premier temps, mets la valeur 0 qui veut dire "attente indéfinie".
Voici le "e" après le point d'arret :
Pièce jointe 533316
Est ce normal que le "result" soit vide ici ?
Pour moi c'est bien un problème de socket car au niveaux du " sb.append("\"").append(result).append("\");");" il y a bien le automates.set("172.22.55.210"), mais le "result" est vide : java.net.SocketTimeoutException: Read timed out
Modif : Lorsque je ne met pas de temps dans le setSoTimeout(0), l'extraction de l'automate reste en cour indéfiniment.
Ben oui, c'est normal, comme ton appel via socket n'aboutit pas mais lance une exception, l'affectation ne se fait pas. Mais dans le catch, c'est le message lié à l'exception qui est affecté à result...
C'est ton IPX qui ne répond plus, il faudrait regarder dans la documentation si il a besoin d'une commande pour libérer son canal ou je ne sais quoi...
La première commande est bien passée, c'est les suivantes qui ne passe plus si je comprends bien...
Salut, désolé j'étais absent la semaine :)
Oui je me suis rendu compte en relisant que ce n'était pas la question la plus pertinente x).
Voici la doc :
https://www.domotique-info.fr/script/IPX_API_M2M.pdf
Je fais des recherches, je vous tiens au courant si je trouve une solution.
J'ai trouvé la solution !!!!!!
Voici le résultat :
Pièce jointe 535564
Pièce jointe 535572
et voici maintenant la classe IPX800V3 :
Code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29 package com.automate.state; import java.io.BufferedReader; import java.io.InputStreamReader; import java.io.PrintWriter; import java.net.Socket; public class IPX800V3 { public static String test(String adresse, int port) throws Exception { try ( Socket socket = new Socket(adresse, port); BufferedReader br = new BufferedReader(new InputStreamReader(socket.getInputStream())); PrintWriter pw = new PrintWriter(socket.getOutputStream()); ) { socket.setSoTimeout(10000); pw.println("GetOutputs"); pw.flush(); // j'ai donc forcé l'écriture String result; result = br.readLine(); return result; } } }
Voila, maintenant il faut que j'arrive a fermer les sockets car lorsque j'essaye de re-récupérer les données cela m'affiche les mêmes que dans la première requête.
Cool, tu avances ;)
Le socket est fermé, le try with resources est là pour s'assurer que ce qui est défini entre parenthèses sous le try soit fermé à la sortie du bloc...
Oui grâce a toi :)
Lorsque je rentre par exemple l'ipx : 172.22.55.210 je reçois donc les 32 0.
Je change l'état manuellement des 5 premières sorties, je devrais donc recevoir : 111110000000000000000.. sauf que je reçois les 32 0.
Donc je me suis dis que je devais sans doute le fermer. Apparemment non :)
Soucis de mémoire non ?
Comme dit, Socket implémente "java.lang.AutoCloseable", donc, en fin de bloc, la méthode "close()" est appellée.
Mais peut-être que l'équipement a besoin de commandes additionnelles... je ne sais pas...
Salut :)
Je continue d'avancer sur mon application web et j'aurais une petite question.
Voici l'état de mon appli :
Pièce jointe 537374
Comme tu peux le voir sur la photo j'ai bien récupéré la réponse de l'automate, elle est traitée pour ensuite afficher une représentation de l'andon(panneau leds).
Le petit soucis c'est que je voudrais que l'ip saisit soit vérifiée pour éviter d'afficher la représentation des fausses adresses. Je ne trouve pas mon bonheur sur le web..
Aurais tu une idée ?
Lorsque tu instancies la classe Socket en lui passant l'adresse IP et le port, tu n'as qu'à traiter l'exception UnknownHostException à part.
Salut,
Après pas mal de recherche..
J'ai essayé pas mal de choses mais je suis toujours au même niveaux..
Aurais-tu un peu plus d'info a me donner ?
J'ai trouvé quelques choses :
La servlet avec l'exception "result = null;"
Code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20 if (adresse != null) { String result = null; try { result = IPX800V3.test(adresse, 9870); } catch (Exception e) { result = null; } if(result != null) { StringBuilder sb = new StringBuilder(); sb.append("automates.set(\"").append(adresse).append("\", "); System.out.print(result); sb.append("\"").append(result).append("\");"); sb.append("\r\n\r\n"); out.write(sb.toString()); }
et la fonction ajouterAutomate avec le if (automates.get(adresse) != null)
Code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17 function ajouterAutomate() { var inputField = document.getElementById("automate"); var adresse = inputField.value; if (automates.get(adresse) != null) { automates.set(adresse, "Initialisation en cours... "); } inputField.value = ""; displayData(); setTimeout(getAutomateData, 200, adresse); afficherTab(); }
Cela fonctionne correctement pour le moment mais je ne sais pas si c'est la bonne façon :roll:
Suite a mon petit msg voici le code de l'application :
com.automate.bdd : BaseDD
Code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90 package com.automate.bdd; import java.sql.Connection; import java.sql.DriverManager; import java.sql.PreparedStatement; import java.sql.ResultSet; import java.sql.SQLException; import java.sql.Statement; import java.util.ArrayList; import java.util.List; import com.automate.beans.Utilisateur; public class BaseDD { private Connection connexion; public List<Utilisateur> recupererUtilisateurs() { List<Utilisateur> utilisateurs = new ArrayList<Utilisateur>(); Statement statement = null; ResultSet resultat = null; loadDatabase(); try { statement = connexion.createStatement(); // Exécution de la requête resultat = statement.executeQuery("SELECT IP FROM dbo.Table_automates;\r\n" + ""); // Récupération des données while (resultat.next()) { String IP = resultat.getString("IP"); Utilisateur utilisateur = new Utilisateur(); utilisateur.setIP(IP); utilisateurs.add(utilisateur); } } catch (SQLException e) { } finally { // Fermeture de la connexion try { if (resultat != null) resultat.close(); if (statement != null) statement.close(); if (connexion != null) connexion.close(); } catch (SQLException ignore) { } } return utilisateurs; } private void loadDatabase() { // Chargement du driver try { Class.forName("com.microsoft.sqlserver.jdbc.SQLServerDriver"); } catch (ClassNotFoundException e) { } try { connexion = DriverManager.getConnection("jdbc:sqlserver://SPF00035\\SQL;databaseName=IPX;user=sa;password=AdminIPX800"); } catch (SQLException e) { e.printStackTrace(); } } public void ajouterUtilisateur(Utilisateur utilisateur) { loadDatabase(); try { PreparedStatement preparedStatement = connexion.prepareStatement("INSERT INTO dbo.Table_automates (IP, Port, Nom, NbLeds) VALUES (?, ?, ?, ? )"); preparedStatement.setString(1, utilisateur.getIP()); preparedStatement.setString(2, utilisateur.getPort()); preparedStatement.setString(3, utilisateur.getNom()); preparedStatement.setString(4, utilisateur.getNbLeds()); preparedStatement.executeUpdate(); } catch (SQLException e) { e.printStackTrace(); } } }
Un beans :
Code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37 package com.automate.beans; public class Utilisateur { private String IP; private String Port; private String Nom; private String NbLeds; public String getIP() { return IP; } public void setIP(String iP) { IP = iP; } public String getPort() { return Port; } public void setPort(String port) { Port = port; } public String getNom() { return Nom; } public void setNom(String nom) { Nom = nom; } public String getNbLeds() { return NbLeds; } public void setNbLeds(String nbLeds) { NbLeds = nbLeds; } }
Ma servlet GetState :
Code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54 package com.automate.state; import java.io.IOException; import java.io.PrintWriter; import javax.servlet.ServletException; import javax.servlet.annotation.WebServlet; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import com.automate.bdd.BaseDD; @WebServlet(urlPatterns = "/getState") public class GetState extends HttpServlet { private static final long serialVersionUID = 1; @Override protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { try ( PrintWriter out = response.getWriter();) { String adresse = request.getParameter("addr"); System.out.println("Extraction de l'état de l'automate " + adresse + " en cours..."); if (adresse != null) { String result = null; try { result = IPX800V3.test(adresse, 9870); } catch (Exception e) { result = null; } if(result != null) { StringBuilder sb = new StringBuilder(); sb.append("automates.set(\"").append(adresse).append("\", "); //System.out.print(result); sb.append("\"").append(result).append("\");"); sb.append("\r\n\r\n"); out.write(sb.toString()); } } System.out.println("Extraction de l'état de l'automate " + adresse + " terminée."); } } }
La classe IPX800V3 :
Code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29 package com.automate.state; import java.io.BufferedReader; import java.io.InputStreamReader; import java.io.PrintWriter; import java.net.Socket; public class IPX800V3 { public static String test(String adresse, int port) throws Exception { try ( Socket socket = new Socket(adresse, port); BufferedReader br = new BufferedReader(new InputStreamReader(socket.getInputStream())); PrintWriter pw = new PrintWriter(socket.getOutputStream()); ) { socket.setSoTimeout(500); pw.println("GetOutputs"); pw.flush(); String result; result = br.readLine(); return result; } } }
Et ma page jsp (anciennement index.html) :
Petit rappel j'utilise SQL server. J'aimerais récupéré les IP sur la base pour ensuite les traiter. J'arrive a les afficher dans une page jsp avec des balises JSTL mais je n'arrive pas a les traiter.Code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212 <%@ page pageEncoding="UTF-8" %> <%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %> <!DOCTYPE html> <html> <head> <meta charset="UTF-8"/> <style type="text/css"> body { /*background:url("image/andon.png") no-repeat center top;*/ } fieldset { background-color: #F0F7F6; -moz-border-radius:8px; -webkit-border-radius:8px; border-radius:8px; } legend { font-weight : bolder; font-size:larger; margin-bottom:0px; margin-left:10px; } .test { width : 55px; height : 320px; background-color: #030303; border-radius: 10px; } .legend1 { width: 645px; height: 89px; margin-left: 310px; float: left; } .automate { margin-top:15px; margin-bottom:15px; margin-right: 0px; } #table { margin-left: 2px; } </style> <script> var automates = new Map(); function ajouterAutomate() { var inputField = document.getElementById("automate"); var adresse = inputField.value; if (automates.get(adresse) != null) { automates.set(adresse, "Initialisation en cours... "); } inputField.value = ""; displayData(); setTimeout(getAutomateData, 200, adresse); afficherTab(); } function getAutomateData(adresse) { var http = new XMLHttpRequest(); http.open("GET", "/ApplicationWebAutomate/getState?addr=" + adresse, true); http.send(); http.onreadystatechange = function() { if (this.readyState == 4 && this.status == 200) { var response = this.responseText; console.log(response); eval(response); displayData(); afficherTab(); } } } function displayData() { var result = ""; automates.forEach(function(valeur, cle) { result += cle + " = " + valeur + "<br/>"; }); document.getElementById("data").innerHTML = result; //afficherTab(); } function afficherTab() { var result = ""; automates.forEach(function(valeur, cle) { result += "<br>" + cle + " = " + "<br>" + "<br>" + "<div class='test' id='test'>"; //for (var i = 0; i < 5; i++) { if(valeur[4] == 0){ result += "<br>" + "<table id='table' width='50px' height='35px' background-color:#030303>" + "<tbody>" + "<tr>" + "<td style='border-style:30px; border-color:#D9CFCF; background-color:#D9CFCF; opacity: 1;' >" + "</td>" + "</tr>" + "</tbody>" + "</table>"; // result += "<tr>" + valeur[i] + "<br/>"; } else { result += "<br>" + "<table id='table' width='50px' height='35px' >" + "<tbody>" + "<tr>" + "<td style='border-color:#FEFCFC; background: radial-gradient(#F9F7B8, #FEFCFC); background-color:#FEFCFC; box-shadow: 0px 0px 11px 4px rgba(237, 245, 100, 0.77);-moz-box-shadow: 0px 0px 11px 4px rgba(237, 245, 100, 0.77);-webkit-box-shadow: 0px 0px 11px 4px #FFFFFF;' >" + "</td>" + "</tr>" + "</tbody>" + "</table>"; } if(valeur[3] == 0){ result += "<br>" + "<table id='table' width='50px' height='35px' >" + "<tbody>" + "<tr>" + "<td style='border-color:#82F37A; background-color:#82F37A; opacity: 1;' >" + "</td>" + "</tr>" + "</tbody>" + "</table>"; // result += "<tr>" + valeur[i] + "<br/>"; } else { result += "<br>" + "<table id='table' width='50px' height='35px' >" + "<tbody>" + "<tr>" + "<td style='border-color:#0FD501; background: radial-gradient(#FFFFFF, #0FD501); background-color:#0FD501;box-shadow: 0px 0px 11px 4px rgba(15, 213, 1, 0.75);-moz-box-shadow: 0px 0px 11px 4px rgba(15, 213, 1, 0.75);-webkit-box-shadow: 0px 0px 11px 4px rgba(15, 213, 1, 0.75);' >" + "</td>" + "</tr>" + "</tbody>" + "</table>"; } if(valeur[2] == 0){ result += "<br>" + "<table id='table' width='50px' height='35px' >" + "<tbody>" + "<tr>" + "<td style='border-color:#F97878; background-color:#F97878; opacity: 1;' >" + "</td>" + "</tr>" + "</tbody>" + "</table>"; // result += "<tr>" + valeur[i] + "<br/>"; } else { result += "<br>" + "<table id='table' width='50px' height='35px' >" + "<tbody>" + "<tr>" + "<td style='border-color:#FE0101; background: radial-gradient(#FFFFFF, #FE0101); background-color:#FE0101; box-shadow=0px 0px 11px 4px rgba(255, 0, 0, 0.88);-moz-box-shadow=0px 0px 11px 4px rgba(255, 0, 0, 0.88);-webkit-box-shadow: 0px 0px 11px 4px rgba(255, 0, 0, 0.88);' >" + "</td>" + "</tr>" + "</tbody>" + "</table>"; } if(valeur[1] == 0){ result += "<br>" + "<table id='table' width='50px' height='35px' >" + "<tbody>" + "<tr>" + "<td style='border-color:#FEDE73; background-color:#FEDE73; opacity: 1;' >" + "</td>" + "</tr>" + "</tbody>" + "</table>"; // result += "<tr>" + valeur[i] + "<br/>"; } else { result += "<br>" + "<table id='table' width='50px' height='35px' >" + "<tbody>" + "<tr>" + "<td style='border-color:#FA7E05; background: radial-gradient(#FFFFFF, #FA7E05); background-color:#FA7E05;box-shadow: 0px 0px 11px 4px #fe9901;-moz-box-shadow: 0px 0px 11px 4px #fe9901;-webkit-box-shadow: 0px 0px 11px 4px #fe9901;' >" + "</td>" + "</tr>" + "</tbody>" + "</table>"; } if(valeur[0] == 0){ result += "<br>" + "<table id='table' width='50px' height='35px' >" + "<tbody>" + "<tr>" + "<td style='border-color:#767AF2; background-color:#767AF2; opacity: 1;' >" + "</td>" + "</tr>" + "</tbody>" + "</table>" + "</div>"; // result += "<tr>" + valeur[i] + "<br/>"; } else { result += "<br>" + "<table id='table' width='50px' height='35px' >" + "<tbody>" + "<tr>" + "<td style=' border-color:#080FF0; background: radial-gradient(#FFFFFF, #080FF0); background-color:#080FF0;box-shadow: 0px 0px 11px 4px #080ff0;-moz-box-shadow: 0px 0px 11px 4px #080ff0;-webkit-box-shadow: 0px 0px 11px 4px #080ff0;' >" + "</td>" + "</tr>" + "</tbody>" + "</table>" + "</div>" ; } }); document.getElementById("data").innerHTML = result; } function reloadData() { automates.forEach(function(valeur, cle) { getAutomateData(cle); afficherTab(); }); } var intervalId = null; function setTimer() { if (intervalId != null) { clearInterval(intervalId); intervalId = null; document.getElementById("cyclique").innerHTML = "Démarrer l'extraction cyclique"; return; } intervalId = setInterval("reloadData()", 5000); document.getElementById("cyclique").innerHTML = "Stopper l'extraction cyclique"; } </script> </head> <body> <div class="legend1"> <form onsubmit="return false"> <fieldset class="connection"> <legend>Simoldes Plasticos France</legend> <div class="automate"> <label for="automate">Adresse automate</label> <input type="text" id="automate" value="<c:out value="${utilisateur.IP}"/>" /> <button onclick="ajouterAutomate()">Ajouter automate</button> <button onclick="setTimer()" id="cyclique">Démarrer l'extraction cyclique</button> <!-- <button onclick="afficherTab()">Afficher tableau</button> --> <div id="data"></div> <c:forEach var="utilisateur" items="${ utilisateurs }"> <li><c:out value="${ utilisateur.IP }" /> </li> </c:forEach> </div> </fieldset> </form> </div> </body> </html>
Tu veux faire le lien avec ceci ?
Code:
1
2
3 <c:forEach var="utilisateur" items="${ utilisateurs }"> <li><c:out value="${ utilisateur.IP }" /> </li> </c:forEach>
Non du tout je faisais quelques test pour récupérer une IP et l'afficher. Mais ce n'est pas ce que je souhaite faire.
Je te réexplique :
Actuellement l'application récupère l'ip que l'utilisateur rentre dans le INPUT, creation d'un socket avec l'ip et le port, pour ensuite envoyer une requête a mon automates et en fin faire l'affichage suivant la réponse de l'automate.
J'aimerais maintenant qu'au lieu de devoir rentrer chaque IP (Version final : 26 IPX800), que l'application ce connecte a une BDD qui possède toute les IP de mes automates pour ensuite faire le traitement en arrière plan puis afficher la réponses.
Voici ma table dans ma BDD :
Pièce jointe 539491
Dans le principe, tu peux t'inspirer de la boucle que tu as fait avec ta variable "utilisateurs".
Tu peux très bien associer un évènement "onclick" sur la balise <li>
Comme ceci
Code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36 <!DOCTYPE html> <html> <head> <meta charset="UTF-8"/> <script> function process(ip, port, name, leds) { alert('Automate ' + name + ', adresse=' + ip + ':' + port + ', nombre de leds=' + leds); } </script> <style> li{ cursor:pointer; } </style> </head <body> <form onsubmit="return false"> <ul> <c:forEach var="utilisateur" items="${ utilisateurs }"> <li onclick="process('${utilisateur.IP}', '${utilisateur.Port}', '${utilisateur.Nom}', '${utilisateur.NbLeds}')">${utilisateur.Nom}</li> </c:forEach> </ul> </form> </body> </html>
J'avais essayé de faire quelques choses de similaires mais javais eu du mal pour les fonction js et ajax (pour qui récupère l'ip et le port) et pour la servlet GetState et la classe BaseDD.
Si je comprend bien ce que tu as fais : tu veux d'abord afficher les IP, Port, Name, NbLeds pour ensuite cliquer sur l'ip voulu et continuer le traitement comme d'habitude ?
Dans ce que je t'ai montré oui, mais je ne sais pas ce que tu voudrais faire au juste, il y a différentes façons de voire les choses.
Là, tu peux sélectionner à partir d'une liste ET ajouter un nouvel automate (je ne sais pas si tu en as le besoin)
Tu pourrais tout autant charger ET extraire toutes les données des automates de ta DB dès le chargement de la page (fonction associée à <body onload="...">) sans avoir de fonction d'ajout
Ou un mixte des 2
Je voudrais tous charger et extraire les données des automates dès le chargement de la page. Ou comme tu dis avoir une liste de tous les noms d'automates. Pour l'affichage il suffirait de cliquer sur le nom des automates qui nous intéresse pour les afficher.
J'ai donc essayé :
Code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75 package com.automate.servlets; import java.io.IOException; import java.io.PrintWriter; import javax.servlet.ServletException; import javax.servlet.annotation.WebServlet; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import com.automate.beans.Utilisateur; import com.automate.bdd.BaseDD; @WebServlet(urlPatterns = "/getState") public class GetState extends HttpServlet { private static final long serialVersionUID = 1; public GetState() { super(); // TODO Auto-generated constructor stub } protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { BaseDD tableNoms = new BaseDD(); request.setAttribute("utilisateurs", tableNoms.recupererUtilisateurs()); this.getServletContext().getRequestDispatcher("/WEB-INF/bonjour.jsp").forward(request, response); } @Override protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { try ( PrintWriter out = response.getWriter();) { String adresse = request.getParameter("utilisateurs"); System.out.println("Extraction de l'état de l'automate " + adresse + " en cours..."); if (adresse != null) { String result = null; try { result = IPX800V3.test(adresse, 9870); } catch (Exception e) { result = null; } if(result != null) { StringBuilder sb = new StringBuilder(); sb.append("automates.set(\"").append(adresse).append("\", "); //System.out.print(result); sb.append("\"").append(result).append("\");"); sb.append("\r\n\r\n"); out.write(sb.toString()); } } System.out.println("Extraction de l'état de l'automate " + adresse + " terminée."); } } }
Parait-elle correcte ? Lors du chargement de la page la méthode service s’exécute avec comme adresse null et je reste sur une page blanche. Je voudrais que d'abord cela ce connecte sur la bdd, qu'elle récupère les IP/Port/Nom/NbLeds, qu'elle les affiche sur ma page ensuite il suffirait de cliquer sur le nom de l'automate par exemple pour envoyer la requête a l'automate et faire l'affichage. Je ne souhaite pas ajouter de nouveaux Automates a ma bdd.
Avec une servlet, soit tu codes la méthode service qui répond à tout type de requête, soit tu code doGet et/ou doPost pour répondre respectivement à une requête get (url) ou une requête post (formulaire).
Dans tous les cas, ce n'est pas une super idée de faire une servlet qui fait 2 choses différentes, il serait peut-être judicieux d'en faire 2 :
1- extraction de la liste à partir de la DB
2- extraction de l'état d'un automate
Au niveau de la page, il faudrait récupérer la liste des automates dans la méthode liée à "unload" sous forme de liste d'objets javascript et boucler sur la liste pour appeler l'autre servlet qui extrait l'état.
D'accord, je vais donc faire 2 servlets.
J'ai modifié aussi les fonctions javascript et la fonction ajax.
Cela fonctionne pour le moment :)
Bonjour,
Je suis en train de continuer de développer tranquillement mon application, j'aurais encore une petite question :)
Je m'explique :
J'ai maintenant une page jsp qui récupère les infos de ma base de données et les affiche ensuite.
Le traitement des données ce fait après l'affichage. J'aimerais tester la connexion avant l'affichage, car pour le moment la page affiche tous les automates présent sur la table sans savoir si l'automate est fonctionnel. Pour le moment je récupère l'ip par javascript depuis la page d'affichage.
Je ne sais pas trop sur quoi me diriger.
Merci d'avance.
Cordialement
Je ne pense pas que ce soit une bonne idée de tester avant l'affichage de la page parce que tu vas introduire des latences qui peuvent être longues en ouvrant le socket vers tes automates.
Le mieux, je pense, serait de désactiver les automates qui ne répondent pas (ou les effacer) en conservant le principe actuel...
De mon point de vue, le mieux est de continuer avec les requêtes ajax.
A la limite, tu pourrais jouer sur le temps d'attente entre 2 requêtes. Si un automate ne répond pas, il n'est peut-être pas nécessaire d'envoyer une requête toutes les 15 secondes ;)