====== Stage Java: octobre 2018 ====== ===== Introduction ===== Découvrir la plateforme Java: * son langage de programmation * sa machine virtuelle * l'environnement de développement ^ Public cible | 10 jeunes | ^ Date | 22, 23, et 24 octobre | ^ Lieu | **Au 214** | ===== Modalités ===== Une inscription est nécessaire pour pouvoir planifier. Une adhésion "Les Petits Hackers" (80 euros) sera demandée. * [[interne:pouradherer|Bulletin d'adhésion]] ===== Planning et contenu ===== * Communication ===== Présent pour animer ===== Animation de l'atelier: * Stéphane Blanc * Christian Jacolot ===== Contacts ===== ^ Structure ^ Nom Prénom ^ Rôle sur le projet / poste ^ | Maison du libre | Stéphane Blanc | Logistique et animation | | Maison du libre | Christian JACOLOT | Logistique et animation | ===== Déroulé ===== * Présentation Java * Installation Java JDK (OpenJDK) * Présentation et installation de l'environnement de développement Eclipse * Présentation du langage avec des exemples ===== Présentation Java ===== Présentation: {{ :projets:2018:stage_initiation_java.odp |}} Code de l'exemple: package bzh.lph.stage; import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; public class Devine { private final static int max = 100; public static void main(String[] args) throws IOException { int nombre = (int) (Math.random() * max) + 1; // à deviner int nbCoup = 0; int i = 0; do { BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); System.out.print("Entrer un entier entre 1 et 100:"); try { i = Integer.parseInt(br.readLine()); if (i < nombre) { System.out.println("nombre trop petit"); } else if (i > nombre) { System.out.println("nombre trop grand"); } else { System.out.println("bravo, vous avez deviné"); } } catch (NumberFormatException nfe) { System.err.println("Ce n'est pas un nombre!"); } nbCoup += 1; // nbCoup = nbCoup +1; } while (i != nombre); System.out.println("Gagné en " + nbCoup + " coup(s)"); } } } ===== Java Interface Graphique ===== Présentation: {{ :projets:2018:stage_initiation_java_gui.odp |}} Code de l'exemple: package bzh.lph.services; import java.awt.FlowLayout; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import javax.swing.ImageIcon; import javax.swing.JButton; import javax.swing.JFrame; import javax.swing.JLabel; import javax.swing.JOptionPane; import javax.swing.JPanel; import javax.swing.JTextField; public class DevineGui { private final static int max = 100; public static void main(String[] args) { // jeu int nombre = (int) (Math.random() * max) + 1; // à deviner int nbCoup = 0; // fenêtre JFrame f = new JFrame("ma fenêtre"); f.setSize(640,480); // conteneur JPanel panel = new JPanel(); // configure le layout du conteneur panel.setLayout(new FlowLayout()); // créer les widgets JLabel msgLbl = new JLabel("Devine un nombre entre 1 et 100"); JLabel msgEntreLbl = new JLabel("Entrer un nombre: "); JTextField nombreTF = new JTextField(); nombreTF.setText("99"); JButton validationBtn = new JButton("Valider mon nombre"); // quand le bouton validation est cliqué, vérifie le nombre validationBtn.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { String textNombre = nombreTF.getText(); int i = 0; try { i = Integer.parseInt(textNombre); if (i < nombre) { JOptionPane.showConfirmDialog(f, "nombre trop petit", "Perdu", JOptionPane.OK_CANCEL_OPTION); } else if (i > nombre) { JOptionPane.showMessageDialog(f, "nombre trop grand", "Perdu", JOptionPane.OK_CANCEL_OPTION); } else { JOptionPane.showMessageDialog(f, "vous avez deviné", "Bravo", JOptionPane.OK_CANCEL_OPTION); } } catch (NumberFormatException nfe) { JOptionPane.showMessageDialog(f, "Ceci n'est pas un nombre !", "Erreur", JOptionPane.OK_CANCEL_OPTION); } // nbCoup += 1; // nbCoup = nbCoup +1; } }); // ajoute les widgets au conteneur panel.add(msgLbl); panel.add(msgEntreLbl); panel.add(nombreTF); panel.add(validationBtn); // ajoute le conteneur à la fenêtre f.getContentPane().add(panel); // la fenêtre est visible et active f.setVisible(true); } } ===== Java Stockage: Base de données ===== Présentation: {{ :projets:2018:stage_initiation_java_stockage.odp |}} Code de l'exemple: package bzh.lph.stage; import java.sql.Connection; import java.sql.DriverManager; import java.sql.PreparedStatement; import java.sql.ResultSet; import java.sql.SQLException; import java.sql.Statement; public class GestionContact { private static Connection conn = null; public static void main(String[] args) { connect(); // lireData(); // ecrireData(); // effacerData(); disconnect(); } // connection à la base de contact public static void connect() { conn = null; try { // les paramêtres de la connexion à la base de données String url = "jdbc:sqlite:contact.db"; // ouvrir la base de données conn = DriverManager.getConnection(url); System.out.println("Connexion à la base réussie."); } catch (SQLException e) { System.out.println(e.getMessage()); } } // fermer la connexion à la base de données private static void disconnect() { try { if (conn != null) { conn.close(); } } catch (SQLException ex) { System.out.println(ex.getMessage()); } } private static void lireData() { if (conn != null) { try { // créer à partir de la connexion la requête Statement stmt = conn.createStatement(); // exécuter la requête ResultSet rs = stmt.executeQuery("select * from contact"); // parcourir le résultat while (rs.next()) { int numeroContact = rs.getInt("numero"); String nomContact = rs.getString("nom"); String prenomContact = rs.getString("prenom"); System.out.println( "Numéro: " + numeroContact + ", Nom: " + nomContact + ", Prénom: " + prenomContact); } } catch (SQLException e) { System.out.println(e.getMessage()); } } } private static void ecrireData() { if (conn != null) { try { // préparer la requête String nomContact = "Blanc"; String prenomContact = "Stéphane"; String insertionContact = "INSERT INTO contact(nom, prenom) VALUES('" + nomContact + "','" + prenomContact + "')"; // créer à partir de la connexion la requête Statement stmt = conn.createStatement(); // exécuter la requête stmt.executeUpdate(insertionContact); System.out.println("Insertion de Stéphane: ok"); } catch (SQLException e) { System.out.println(e.getMessage()); } } } private static void effacerData() { if (conn != null) { try { // préparer la requête int numeroJacolot = 1; String effacterRqt = "DELETE FROM contact WHERE numero = ?"; // créer une requête à partir de la connexion PreparedStatement deleteStmt = conn.prepareStatement(effacterRqt); // positionner le paramètre deleteStmt.setInt(1, numeroJacolot); // exécuter la requête deleteStmt.executeUpdate(); System.out.println("Christian a été effacé: ok"); } catch (SQLException e) { System.out.println(e.getMessage()); } } } } mvn archetype:generate -DarchetypeGroupId=net.mdl29.test -DartifactId=resttest -DarchetypeArtifactId=maven-archetype-quickstart pom.xml org.eclipse.jetty jetty-server 9.2.3.v20140905 org.eclipse.jetty jetty-servlet 9.2.3.v20140905 org.glassfish.jersey.core jersey-server 2.7 org.glassfish.jersey.containers jersey-container-servlet-core 2.7 org.glassfish.jersey.containers jersey-container-jetty-http 2.7 org.glassfish.jersey.media jersey-media-moxy 2.7 org.glassfish.jaxb jaxb-runtime 2.3.2 Class EntryPoint.java package net.mdl29.test; import javax.ws.rs.GET; import javax.ws.rs.Path; import javax.ws.rs.Produces; import javax.ws.rs.core.MediaType; @Path("/entry-point") public class EntryPoint { @GET @Path("test") @Produces(MediaType.TEXT_PLAIN) public String test() { return "Test"; } } Class App.java package net.mdl29.test; import org.eclipse.jetty.server.Server; import org.eclipse.jetty.servlet.ServletContextHandler; import org.eclipse.jetty.servlet.ServletHolder; public class App { public static void main(String[] args) throws Exception { ServletContextHandler context = new ServletContextHandler(ServletContextHandler.SESSIONS); context.setContextPath("/"); Server jettyServer = new Server(8080); jettyServer.setHandler(context); ServletHolder jerseyServlet = context.addServlet( org.glassfish.jersey.servlet.ServletContainer.class, "/*"); jerseyServlet.setInitOrder(0); // Tells the Jersey Servlet which REST service/class to load. jerseyServlet.setInitParameter( "jersey.config.server.provider.classnames", EntryPoint.class.getCanonicalName()); try { jettyServer.start(); jettyServer.join(); } finally { jettyServer.destroy(); } } } Ajouter la gestion du manifeste dans pom.xml ... org.apache.maven.plugins maven-shade-plugin 1.6 true *:* META-INF/*.SF META-INF/*.DSA META-INF/*.RSA package shade net.mdl29.test.App ... pom.xml 4.0.0 net.mdl29.websocket chatwebsocket 0.0.1-SNAPSHOT war 9.0.16 1.1 2.9.8 javax.websocket javax.websocket-api ${websocket.version} provided com.fasterxml.jackson.core jackson-databind ${jackson.version} org.apache.tomcat tomcat-servlet-api ${tomcat.version} provided ${project.artifactId} maven-compiler-plugin 3.1 1.8 1.8 maven-war-plugin 2.4 WebContent false class ChatWebsocket.java /* * Licensed to the Apache Software Foundation (ASF) under one or more * contributor license agreements. See the NOTICE file distributed with * this work for additional information regarding copyright ownership. * The ASF licenses this file to You under the Apache License, Version 2.0 * (the "License"); you may not use this file except in compliance with * the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package net.mdl29.websocket; import java.io.IOException; import java.util.Set; import java.util.concurrent.CopyOnWriteArraySet; import java.util.concurrent.atomic.AtomicInteger; import javax.websocket.OnClose; import javax.websocket.OnError; import javax.websocket.OnMessage; import javax.websocket.OnOpen; import javax.websocket.Session; import javax.websocket.server.ServerEndpoint; @ServerEndpoint(value = "/websocket/chat") public class ChatWebsocket { private static final String GUEST_PREFIX = "Guest"; private static final AtomicInteger connectionIds = new AtomicInteger(0); private static final Set connections = new CopyOnWriteArraySet<>(); private final String nickname; private Session session; public ChatWebsocket() { nickname = GUEST_PREFIX + connectionIds.getAndIncrement(); } @OnOpen public void start(Session session) { this.session = session; connections.add(this); String message = String.format("* %s %s", nickname, "has joined."); broadcast(message); } @OnClose public void end() { connections.remove(this); String message = String.format("* %s %s", nickname, "has disconnected."); broadcast(message); } @OnMessage public void incoming(String message) { // Never trust the client String filteredMessage = String.format("%s: %s", nickname, filter(message.toString())); broadcast(filteredMessage); } @OnError public void onError(Throwable t) throws Throwable { System.out.println("Chat Error: " + t.toString()); } private static void broadcast(String msg) { for (ChatWebsocket client : connections) { try { synchronized (client) { client.session.getBasicRemote().sendText(msg); } } catch (IOException e) { System.out.println("Chat Error: Failed to send message to client " + e); connections.remove(client); try { client.session.close(); } catch (IOException e1) { // Ignore } String message = String.format("* %s %s", client.nickname, "has been disconnected."); broadcast(message); } } } public static String filter(String message) { if (message == null) return null; char content[] = new char[message.length()]; message.getChars(0, message.length(), content, 0); StringBuilder result = new StringBuilder(content.length + 50); for (int i = 0; i < content.length; i++) { switch (content[i]) { case '<': result.append("<"); break; case '>': result.append(">"); break; case '&': result.append("&"); break; case '"': result.append("""); break; default: result.append(content[i]); } } return result.toString(); } } Web client chat.xhtml: Apache Tomcat WebSocket Examples: Chat

Seems your browser doesn't support Javascript! Websockets rely on Javascript being enabled. Please enable Javascript and reload this page!

Les sources complets avec pom, html, java: {{ :projets:2018:websocket-src.tar.gz |}}