Outils pour utilisateurs

Outils du site


projets:2018:stagejava

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.

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: 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: 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: 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

<dependencies>

  <dependency>
      <groupId>org.eclipse.jetty</groupId>
      <artifactId>jetty-server</artifactId>
      <version>9.2.3.v20140905</version>
  </dependency>
  <dependency>
      <groupId>org.eclipse.jetty</groupId>
      <artifactId>jetty-servlet</artifactId>
      <version>9.2.3.v20140905</version>
  </dependency>
  <dependency>
      <groupId>org.glassfish.jersey.core</groupId>
      <artifactId>jersey-server</artifactId>
      <version>2.7</version>
  </dependency>
  <dependency>
      <groupId>org.glassfish.jersey.containers</groupId>
      <artifactId>jersey-container-servlet-core</artifactId>
      <version>2.7</version>
  </dependency>
  <dependency>
      <groupId>org.glassfish.jersey.containers</groupId>
      <artifactId>jersey-container-jetty-http</artifactId>
      <version>2.7</version>
  </dependency>
  <dependency>
      <groupId>org.glassfish.jersey.media</groupId>
      <artifactId>jersey-media-moxy</artifactId>
      <version>2.7</version>
  </dependency>
  

<dependency>

  <groupId>org.glassfish.jaxb</groupId>
  <artifactId>jaxb-runtime</artifactId>
  <version>2.3.2</version>

</dependency>

</dependencies>

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

<build>
...

<plugins>
    <plugin>
      <groupId>org.apache.maven.plugins</groupId>
      <artifactId>maven-shade-plugin</artifactId>
      <version>1.6</version>
      <configuration>
        <createDependencyReducedPom>true</createDependencyReducedPom>
        <filters>
          <filter>
            <artifact>*:*</artifact>
            <excludes>
              <exclude>META-INF/*.SF</exclude>
              <exclude>META-INF/*.DSA</exclude>
              <exclude>META-INF/*.RSA</exclude>
            </excludes>
          </filter>
        </filters>
      </configuration>
 
      <executions>
        <execution>
          <phase>package</phase>
          <goals>
            <goal>shade</goal>
          </goals>
          <configuration>
            <transformers>
              <transformer
                implementation="org.apache.maven.plugins.shade.resource.ServicesResourceTransformer" />
              <transformer
                implementation="org.apache.maven.plugins.shade.resource.ManifestResourceTransformer">
                <manifestEntries>
                  <Main-Class>net.mdl29.test.App</Main-Class>
                </manifestEntries>
              </transformer>
            </transformers>
          </configuration>
        </execution>
      </executions>
    </plugin>
  </plugins>
 ...

</build>

pom.xml

<project xmlns="http://maven.apache.org/POM/4.0.0"

    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"

    xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 
    http://maven.apache.org/xsd/maven-4.0.0.xsd">
    
    <modelVersion>4.0.0</modelVersion>
    <groupId>net.mdl29.websocket</groupId>
    <artifactId>chatwebsocket</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <packaging>war</packaging>
    
    <properties>
        <tomcat.version>9.0.16</tomcat.version>
        <websocket.version>1.1</websocket.version>
        <jackson.version>2.9.8</jackson.version>
    </properties>
          
    <dependencies>
        <!-- Dependency needed by the Web-socket -->
        <!-- Tomcat has it, so no need to package into the war file -->
        <dependency>
            <groupId>javax.websocket</groupId>
            <artifactId>javax.websocket-api</artifactId>
            <version>${websocket.version}</version>
            <scope>provided</scope>
        </dependency>
        
        <!-- Used to serialize the message from the browser -->
        <dependency>
            <groupId>com.fasterxml.jackson.core</groupId>
            <artifactId>jackson-databind</artifactId>
            <version>${jackson.version}</version>
        </dependency>
        
        <!-- Sevlet jars for compilation, provided by Tomcat -->
        <dependency>
            <groupId>org.apache.tomcat</groupId>
            <artifactId>tomcat-servlet-api</artifactId>
            <version>${tomcat.version}</version>
            <scope>provided</scope>
        </dependency>
    </dependencies>
      
    <build>
        <finalName>${project.artifactId}</finalName>
        <plugins>
            <plugin>
                <artifactId>maven-compiler-plugin</artifactId>
                <version>3.1</version>
                <configuration>
                <source>1.8</source>
                <target>1.8</target>
                </configuration>
            </plugin>
                      
            <plugin>
                <artifactId>maven-war-plugin</artifactId>
                <version>2.4</version>
                <configuration>
                <warSourceDirectory>WebContent</warSourceDirectory>
                <failOnMissingWebXml>false</failOnMissingWebXml>
                </configuration>
            </plugin>
        </plugins>
    </build>
    
</project>

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<ChatWebsocket> 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("&lt;");
                break;
            case '>':
                result.append("&gt;");
                break;
            case '&':
                result.append("&amp;");
                break;
            case '"':
                result.append("&quot;");
                break;
            default:
                result.append(content[i]);
            }
        }
        return result.toString();
    }
    
}

Web client chat.xhtml:

<?xml version="1.0" encoding="UTF-8"?>
<!--
  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.
-->
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en">
<head>
    <title>Apache Tomcat WebSocket Examples: Chat</title>
    <style type="text/css"><![CDATA[
        input#chat {
            width: 410px
        }

        #console-container {
            width: 400px;
        }

        #console {
            border: 1px solid #CCCCCC;
            border-right-color: #999999;
            border-bottom-color: #999999;
            height: 170px;
            overflow-y: scroll;
            padding: 5px;
            width: 100%;
        }

        #console p {
            padding: 0;
            margin: 0;
        }
    ]]></style>
    <script type="application/javascript"><![CDATA[
        "use strict";

        var Chat = {};

        Chat.socket = null;

        Chat.connect = (function(host) {
            if ('WebSocket' in window) {
                Chat.socket = new WebSocket(host);
            } else if ('MozWebSocket' in window) {
                Chat.socket = new MozWebSocket(host);
            } else {
                Console.log('Error: WebSocket is not supported by this browser.');
                return;
            }

            Chat.socket.onopen = function () {
                Console.log('Info: WebSocket connection opened.');
                document.getElementById('chat').onkeydown = function(event) {
                    if (event.keyCode == 13) {
                        Chat.sendMessage();
                    }
                };
            };

            Chat.socket.onclose = function () {
                document.getElementById('chat').onkeydown = null;
                Console.log('Info: WebSocket closed.');
            };

            Chat.socket.onmessage = function (message) {
                Console.log(message.data);
            };
        });

        Chat.initialize = function() {
            if (window.location.protocol == 'http:') {
                Chat.connect('ws://' + window.location.host + '/examples/websocket/chat');
            } else {
                Chat.connect('wss://' + window.location.host + '/examples/websocket/chat');
            }
        };

        Chat.sendMessage = (function() {
            var message = document.getElementById('chat').value;
            if (message != '') {
                Chat.socket.send(message);
                document.getElementById('chat').value = '';
            }
        });

        var Console = {};

        Console.log = (function(message) {
            var console = document.getElementById('console');
            var p = document.createElement('p');
            p.style.wordWrap = 'break-word';
            p.innerHTML = message;
            console.appendChild(p);
            while (console.childNodes.length > 25) {
                console.removeChild(console.firstChild);
            }
            console.scrollTop = console.scrollHeight;
        });

        Chat.initialize();


        document.addEventListener("DOMContentLoaded", function() {
            // Remove elements with "noscript" class - <noscript> is not allowed in XHTML
            var noscripts = document.getElementsByClassName("noscript");
            for (var i = 0; i < noscripts.length; i++) {
                noscripts[i].parentNode.removeChild(noscripts[i]);
            }
        }, false);

    ]]></script>
</head>
<body>
<div class="noscript"><h2 style="color: #ff0000">Seems your browser doesn't support Javascript! Websockets rely on Javascript being enabled. Please enable
    Javascript and reload this page!</h2></div>
<div>
    <p>
        <input type="text" placeholder="type and press enter to chat" id="chat" />
    </p>
    <div id="console-container">
        <div id="console"/>
    </div>
</div>
</body>
</html>

Les sources complets avec pom, html, java: websocket-src.tar.gz

projets/2018/stagejava.txt · Dernière modification: 2019/03/03 20:30 par christian.jacolot