Tp4 Ema EMACS Développement Web

La persistance des données est habituellement gérée par une base de données relationnelles.

Le problème est que suite à l’évolution des POJO par exemple en ajoutant une date de création à notre POJO Todo, il faut souvent recoder toutes les requêtes SQL et modifier la structure des tables.

Avec les annotations Java qui permettent d’indiquer des informations additionnelles au code Java, on peut informer un framework de persistance comme Hibernate de ce qu’il doit faire de chaque méthode et propriété d’un POJO.

On a par exemple utilisé l’annoation @WebServlet({ « /Controleur » }) pour indiquer à Tomcat quel est la Servlet qui va être activée par l’URL /Controleur.

Nous avons donc une classe Todo dont nous voulons faire persister les instances avec des annotations à ajouter:

/* Import des packages générique qui sont des interfaces d'hibernate 
ou d'autres outils de persistance */

import javax.persistence.Basic;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.Table;

// Annotation pour indiquer que l'on fait persister ce POJO
@Entity
// Nom de la table créé, indication optionnelle le nom de la table
// est habituellement le nom de la classe
@Table(name = "todo")
public class Todo {

 private Integer id;
 private String texte = "";
 private boolean actif = false;
 
  // Nom de la colonne information optionnelle habituellement
  // c'est le nom du champ qui sert de nom à la colonne
  @Column(name = "texte")
  public String getTexte() {
   return texte;
  }
 
  // Champ créé par défaut le nom de la colonne "actif"
  public boolean isActif() {
    return actif;
  }

  // Clef unique des instances pour 
  @Id
  @Column(name = "id")
  // 2 annotations pour indiquer que la génération de cette 
  // information est assurée par l'identité 
  @GeneratedValue(strategy=GenerationType.IDENTITY)
  @Basic
  public Integer getId() {
    return id;
  }
}

 

Maintenant il faut configurer la liaison entre la base de données et notre projet en ajoutant un fichier de configuration hibernate.cfg.xml dans le dossier src de notre projet.

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-configuration PUBLIC "-//Hibernate/Hibernate Configuration DTD 3.0//EN" 
"http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd">
 
<hibernate-configuration>
 <session-factory>
 <property name="show_sql">true</property>
 <property name="format_sql">true</property>
 <property name="dialect">fr.ema.lgi2p.emacs.hibernate.SQLiteDialect</property>
 <property name="connection.driver_class">org.sqlite.JDBC</property>
 <property name="connection.url">jdbc:sqlite:c:/Developpement/todoHibernate2.sqlite</property>
 <property name="connection.username"></property>
 <property name="connection.password"></property>
 
 <property name="hibernate.hbm2ddl.auto">update</property>
 
<!-- <mapping class="fr.ema.lgi2p.emacs.metier.Todo"/> -->
 </session-factory>
</hibernate-configuration>

Ce fichier indique la nature de la base de données utilisée (sqlite) avec les nom et mot de passe utilisateur (ici aucun à la différence de MySql par exemple), le nom de du driver SQLiteDialect, le connecteur JDBC, l’url pour se connecter à la base de données. J’ai ajouté show-sql et format_sql pour afficher dans les logs les requêtes SQL.

Le réglages hibernate.hbm2ddl.auto permet ici d’indiquer que l’on souhaite créer les tables de bases de données et les modifier mais sans effacer les colonnes. Si par exemple on retire une propriété par exemple « actif » à notre POJO, la base de données n’enlèvera pas de données.

Nous devons ajouter un Dialect spécifique pour Sqlite suite à un bug sur le driver officiel.Il est téléchargeable à cette adresse : SQLiteDialect. Il faut bien sur le dézipper et le mettre dans le bon package.

Pour utiliser maintenant la couche de persistance il faut créer une classe spécialisée DaoManagerHibernate:

private DaoManagerHiberante() {
    // Ouvrir le fichier hibernate.cfg.xml pour lire la configuration
    Configuration configuration = new Configuration();
    configuration.configure();
   
    // Indique que la classe Todo.class est à analyser 
    configuration.addAnnotatedClass(Todo.class);

   // Ouvre le gestionnaire de connexion 
   serviceRegistry = new ServiceRegistryBuilder()
        .applySettings(configuration.getProperties())
        .buildServiceRegistry();
 
    // Fabrique une session de connexion, on a une seule connexion
   // mais il est possible d'avoir plusieurs connexions en même temps
    sessionFactory = configuration
        .buildSessionFactory(serviceRegistry);

    // Ouverture de la session de connexion
    session = sessionFactory.openSession();
 }

// Méthode pour sauver un Todo
public void addTodo(Todo todo){
 // Ouvre une transaction sur la base de données
 Transaction tx = session.beginTransaction();

 // Avec la session, nous sauvons le todo passé en paramètre 
 session.save( todo );

 // Validation de la sauvegarde réellement dans la base de données
 // Parfois il est utile de ne garder l'objet en mémoire et d'écrire 
 // dans la base de données plus tardivement pour optimiser le temps 
 session.flush();

 // La transaction est validé, tout est OK, le todo est sauevgardé
 tx.commit();
 }
 
 // Retourne toues les todos de la base de données 
 public List<Todo> getLestTodos(){
   @SuppressWarnings("unchecked")
   // sur la session on créer une requête HQL (H=Hibernate) 
   // Finalement assez proche du SQL, on peut rajouter des clauses
   // comme en SQL "from Todo where Todo.actif = true
   List<Todo> todos = session.createQuery("from Todo").list();
 
   return todos;
 }

 

Pour finir, il faut ajouter les packages hibernate et Sqlite avec leur logger et des classes utilitaires additionnelles (dom4j pour ouvrir les fichiers xml par exemple).

Vous pouvez les télécharger à cette adresse pour ma version de démonstration (Hibernate-jars) à dézipper et à placer dans le dossier WEB-INF/lib/ de votre projet.

 

Finalement, après configuration, on va se concentrer sur les classes annoté @Entity qui vont être sauvegarder et la classe DaoManagerHibernate qui assure la gestion de la session de connexion avec la base de données.

Hibernate est framework de persistance très performant, donc avec beaucoup d’option. Au début de son utilisation on se retrouve avec beaucoup de réglages mais ensuite en fonctionnement normal, on n’intervient que sur très peu de réglages et récupère enfin les avantages de l’utilisation d’un tel framework complexe.

Publié dans Emacs | Laisser un commentaire

Résultat du sondage de Stackoverflow 2017

Le sondage 2017 du site web de support informatique stackoverflow vient de sortir. Le sondage est très/trop complet notamment sur des questions hors du domaine du développement (le développeur a t’il des enfants par exemple). Vous pouvez le trouver à cette URL.

Je sors quelques points que je trouve intéressant et donc ce n’est que mon regard personnel sur ce sondage, chacun est libre d’en sortir ses propres impressions.

 

 

 

Comment se définit le développeur:

Finalement on peut dire que les sondés sont globalement des développeurs qui font un peu de tout en Front/Back/Full, finalement c’est le « Desktop or entreprise applications » qui montre bien que ce type de développement est assez faible sur ce site. Peut être que les développeurs de ce genre d’applications sont expérimentés et n’ont plus besoin de poser des questions.

 

La bataille des IDEs:

Le Visual Studio payant et gratuit semble enfoncé les autres, le trio des éditeurs Sublime Text/Vim/Notepad++ semble être très utilisé au final, le reste est très classique au final.

Les langages des développeurs:

Beaucoup de développement web en Front, donc JS+HTML+CSS sontles premier. On trouve les inaltérables SQL/Shell en plus. La tendance reste Java/Python/C#/PHP/C++/C.  J’ai indiqué les langages ayant plus de 10%, vous trouverez surement votre langage dans le sondage.

 

Les Framework des développeurs:

Node.js / Angular /react indique bien que le développement des solutions javascript a le vent en poupe. Ce qui est surprenant encore c’est le .Net Core qui est très important, une information que je n’avais pas personnellement.

Base de données utilisées

 

La seconde place de SQL Server est pour moi une surprise, le reste me parait assez classique comme représentation.

Les plateformes cible des développeurs:

Attention, ce n’est pas avec quel OS ils développent, il y a une réponse spécifique sur ce point. On voit bien que le classique c’est Linux/Windows, un peu d’android, de cluster AWS, Mac OS. Rasberry Pi et WordPress sont présentés comme des cibles cela indique bien la force de leur spécificité.

 

Les regroupement  des technologies pour les développeurs:

Très utile cela indique bien les liaisons outils/technologies/plateformes pour comprendre qu’elles sont les compétences liées.

 

 

Publié dans Développement | Laisser un commentaire

Arduino M0 pro et UART additionnel

Dans le cadre d’un développement sur un Arduino M0 Pro, je me retrouve a devoir brancher en protocole UART un module bluetooth et un lecteur RFID tout les deux en UART.

Comme je débute en Arduino, je branche le module bluetooth sur RT( broche 0) /TX (broche 1) de la carte :

 

Donc se pose la question d’avoir une entrée UART sur d’autres broches. J’avoue que je traine sur google et que je trouve enfin la bonne explication pour transformer les broches  10 en TX et 11 en RX.

Vous trouverez sur ce lien toutes les explications chez Adafruit mais pour ceux qui cherchent comme moi, voici le résumé avec le code:

#include "wiring_private.h"

Uart Serial2(&sercom1, 11, 10, SERCOM_RX_PAD_0, UART_TX_PAD_2);

void SERCOM1_Handler()
{
 Serial2.IrqHandler();
}

void setup()
{
  Serial2.begin(9600);
  pinPeripheral(10, PIO_SERCOM);
  pinPeripheral(11, PIO_SERCOM);
}


void loop()
{
 if (Serial2.available()){
   byte byteRead = Serial2.read();
   Serial2.write(byteRead);
   Serial.write( byteRead ); 
 }
}

Et voila, j’avoue que cela m’a permis d’entrer dans des détails du « M0 pro » et de son contrôleur ATSAMD21  mais enfin j’ai compris comment on peut refaire un UART de plus en cas de besoin.

Voila le montage final avec UART sur PIN 0 et 1, SDA & SCL branché et enfin le nouveau UART PIN 10 et PIN 11

Publié dans Développement | Laisser un commentaire

Protégé : Formation python Quatrième partie

Cet article est protégé par un mot de passe. Pour le lire, veuillez saisir votre mot de passe ci-dessous :

Publié dans EuroMov | Saisissez votre mot de passe pour accéder aux commentaires.

Formation python Troisème partie

 EXERCICE NEUF

Demander une information depuis la ligne de commande, pour filtrer les informations et ne garder que celle dont le numero_ligne est supérieur au numero_ligne_initial indiqué par l’utilisateur.

Pour demander une variable, voici la commande

numero_ligne_initial = input('Numéro de ligne initial: ')
numero_ligne_initial = int(numero_ligne_initial)

Normalement votre console va contenir ce message, avec le curseur pour attendre que vous indiquiez à partir de quel ligne on va traiter l’information

Numéro de ligne initial: _

 

Filtrer les informations à partir d’un numéro de ligne ->

 

 

 


HUITIEME TRUC

Les bibliothèques additionnelles sont très importantes dans python. Par défaut, python ne charge pas toutes les bibliothèques car cela prendrais trop de temps, cela chargerais en mémoire trop d’informations et même il y a risque d’incompatibilités entre certaines bibliothèques. Donc on charge que ce que l’on a besoin et on les importes individuellement.

Par exemple pour faire un graphisme, la bibliothèque que je propose est matplotlib.

Pour l’installer, il faut soit appeler en ligne de commande le logiciel pip par exemple via la commande du système d’exploitation (terminal sous MacOs, cmd sous Windows :

pip install requests

ou on trouve aussi la commande exprimé comme ceci:

python -m pip install <nom de la bibliothèque>

Ce que je conseille sinon c’est ce petit programme python qui exécute pip (qui est développé en python), à exécuté dans l’interpreteur python:

Python 3.6.2 (v3.6.2:5fd33b5, Jul 8 2017, 04:57:36) [MSC v.1900 64 bit (AMD64)]
 on win32
Type "help", "copyright", "credits" or "license" for more information.
>>>import pip
>>>pip.main(['list'])
>>>pip.main(['install','<nom de la bibliothèque>'])

Mais ce qui est vraiment pratique avec PyCharm c’est que l’on peut faire via l’IDE tout cela:

Allez sur le Menu File > Settings…

NOTA: sous Mac Os le menu settings est déplacé dans le menu le plus à gauche portant le nom de l’application soit ici PyCharm > Settings…

Choisissez « Project: <votre projet> » puis « Project Interpreteur » et complètement à droite le bouton « + » puis vous pouvez chercher une bibliothèque (un package en VO) par exemple « matplotlib » pour l’installer.

Une fois l’installation terminé, on peut constater que matplotlib n’a pas été installé tout seul mais des bibliothèques additionnelles ont été aussi installé pour le faire fonctionner:

On peut constater que la bibliothèque numpy qui est très utile pour le calcul scientifique est aussi installé car elle est nécessaire à matplotlib.

 


NEUVIÈME TRUC

 

Pour l’utilisation de matplotlib et numpy pour faire une figure et des calculs, il faut en premier lieu importer les bibliothèques. Pourquoi indiquer dans un programme ce que l’on veut importer précisément, on pourrait penser que python va charger toutes les bibliothèques que l’on a installer, oui mais dans ce cas là on va avoir un long temps de chargement avant que notre programme ne s’exécute.

Pour importer l’objet qui gère dans la bibliothèque matplotlib l’objet qui gère les diagrammes, on peut écrire ceci:

from matplotlib import pyplot

Mais on trouve la version plus abrégé suivante:

import matplotlib.pyplot

Sauf qu’après on se retrouve à devoir faire préfixer toutes les fonctions de cet objet, par exemple ici la fonction figure() par le nom de la bibliothèque + le nom de l’objet:

matplotlib.pyplot.figure()

Donc on peut faire un alias (le mot après as) pour remplacer le préfixe par quelquechose de plus court

import matplotlib.pyplot as plt

et du coup l’appel se fait avec la version écourtée:

plt.figure()

Par exemple pour numpy la bibliothèque de calcul scientifique, son alias est souvent np.

 

Mais revenons à ce que nous avons besoin d’importer pour faire une courbe :

import matplotlib.pyplot as plt
import numpy as np
from mpl_toolkits.mplot3d import Axes3D

Voici un petit morceau de programme pour tracer une courbe simple:

donnees = [18,22,4,15,15]
fig = plt.figure()
ax = fig.gca()
ax.plot( donnees , label='parametric curve')
plt.show()

Essayer d’afficher à l’écran cette courbe et modifier les données pour construire un autre exemple.

On peut faire une courbe avec deux dimensions :

donneesX = [1,2,3,15,18]
donneesY = [18,22,4,15,15]
fig = plt.figure()
ax = fig.gca()
ax.plot( donneesX, donneesY , label='parametric curve')
plt.show()

 


 EXERCICE DIX

Cette courbe est le début du vol du planeur enregistré par le GPS d’un smartphone.

Essayons de construire un programme pour l’afficher avec les données du fichier traitement_fichier.txt.

En premier lieu, importer matplotlib et numpy. Ensuite il faut créer trois tableaux pour stocker les informations:

#initialisation des tableaux de données
longitude = []
latitude = []
altitude = []

Puis après avoir passé la première ligne du fichier traitement_fichier.txt qui contient les entête des colonnes. Nous pouvons ajouter les valeurs lu comme str en valeur de type float (nombre à virgule) via ces lignes:

#construction des tableaux de données
latitude.append(float(data[1]))
longitude.append(float(data[2]))
altitude.append(float(data[3]))

Bien sur éviter de lire la colonne data[0] qui contient les timestamps peut utile pour ce diagramme.

A la fin de notre programme après avoir bien construit les 2 tableaux de données voici le code pour afficher le diagramme:

#dessin de la figure
fig = plt.figure()
ax = fig.gca(projection='3d')
ax.plot(longitude, latitude, altitude, label='parametric curve')
plt.show()

A vous de jouer.

Affichage des données longitude, latitude, altitude ->

 

 


DIXIÈME TRUC

 

Si vous ne codez pas, tout cela ne va pas vraiment être utile.

Mettez des commentaires pour expliquer les morceaux du code.

Indiquez clairement ce que fais une variable, numero_ligne ou numeroLigne.

Faites des fichiers intermédiaires pour pouvoir rejouer l’intégralité ou une partie du processus.

Utilisez le déboggage pour tracer l’enchainement du code et l’état des variables.

 

Quatrième partie de la formation ⇒

 

 

Publié dans EuroMov | Laisser un commentaire

Protégé : Formation python Seconde partie

Cet article est protégé par un mot de passe. Pour le lire, veuillez saisir votre mot de passe ci-dessous :

Publié dans EuroMov | Saisissez votre mot de passe pour accéder aux commentaires.

Protégé : Formation Python

Cet article est protégé par un mot de passe. Pour le lire, veuillez saisir votre mot de passe ci-dessous :

Publié dans EuroMov | Saisissez votre mot de passe pour accéder aux commentaires.

Process Explorer de Sysinternals

Pour le développement et même pour avoir une meilleure connaissance du fonctionnement de son PC sous Windows, un outil qui doit être installé à mon avis par défaut est Process Explorer.

Continuer la lecture

Publié dans Développement | Laisser un commentaire

Premier développement Seafile

Suite à l’utilisation de Seafile alternative open-source à Dropbox, je me suis posé la question du rajout de fonctionnalité dans cette solution.

Continuer la lecture

Publié dans Développement | Laisser un commentaire

Tp3 Ema EMACS Développement Web

1/ Utilisation de javascript avec jquery

Avec le javascript et la bibliothèque jquery, nous pouvons mettre en barré le texte associé à une case cochée par l’internaute.

Supposons que nous disposons du code HTML suivant fabriqué à l’origine par la JSP:

<p>
<input type="checkbox" name="checkbox_eau" > Eau
</p>

Nous devons en premier lieu pouvoir manipuler le texte du à côté de la case à cochée, en ajoutant un tag span nous indiquons que ce texte n’est pas simplement un texte sans modifier la mise en forme.

<p>
<input type="checkbox" name="checkbox_eau" >
<span id="checkbox_eau"> Eau </span>
</p>

Nous aimerions ensuite pouvoir lier le click sur la case de la checkbox à la modification du HTML par le javascript en ajoutant la classe barre au tag <span>:

<p>
<input type="checkbox" name="checkbox_eau" >
<span id="checkbox_eau" class="barre"> Eau </span>
</p>

Nous allons appeler jquery directement depuis le serveur hébergent ce projet (CDN) via l’ajout de ce code dans la JSP:

 <script
 src="https://ajax.googleapis.com/ajax/libs/jquery/1.12.0/jquery.min.js"></script>

ou en téléchargeant le code javascript pour garder notre version en local et ne pas subir les évolutions de la version jquery:

 <script src="js/jquery-latest.min.js"></script>

Nous pouvons maintenant coder directement en javascript dans la page HTML pour les premiers tests puis ce code ira dans un fichier javascript dans le dossier js:

 <script language="javascript">

 $(document).ready(function() {
    $("input[type=checkbox]").click(
         function(event) { 
            var name = $(this).attr("name");
            var checked = $(this).prop('checked');;
            console.log( $(this).attr("name") );
           // ... continuer en javascript
         });
   
 });
// 
</script>

en décomposant ce code nous avons un premier appel à une fonction anonyme dans la méthode ready.

$(document).ready(function() {
    // ce code javascript est déclenché quand la page est chargée
});

Jquery exploite une fonction qui s’appelle $ pour chercher soit dans le DOM de la page HTML un ou plusieurs éléments/tags, par exemple :

$("h1") // cherche des tags h1
$("#header") // cherche des tags avec id="header"

$("input[type=checkbox]") // cherche des tags input avec un attribut input qui vaut checkbox

la dernière instruction permet donc de trouver nos checkbox et nous allons leur ajouter un événement click dessus.

$("input[type=checkbox]").click(  );

Pour ajouter ce qui doit être fait par le click nous indiquons ainsi une fonction javascript anonyme qui va être appelée par cet événement click :

         function(event) { 
            var name = $(this).attr("name");
            var checked = $(this).prop('checked');;
            console.log( $(this).attr("name") );
           // ... continuer en javascript
         });

console.log appelle la console Javascript embarquée dans les navigateurs (voir plus bas).

En exploitant la fonction de recherche d’un tag à partir de son id et en utilisant la méthode addClass(« barre ») vous pouvez ajouter une classe au bon texte.

$("span#checkbox_eau").addClass("barre");

 

Nous pouvons exploiter le débugger et la console javascript embarqués dans nos navigateurs. Voici l’exemple avec Firebug (pour Chrome faire CTRL+ALT+I) :

Animation de l'activation des onglets: Console, Script et Réseau

Animation de l’activation des onglets: Console, Script et Réseau

Nous pouvons afficher le code Javascript et poser des points d’arrêt dans notre code.

Avec firebug, affichage du code javascript et point d'arrêt ajouté

Avec firebug, affichage du code javascript et point d’arrêt ajouté

Pour Firefox:

Pour Chrome: 

Nota: la fonction $ peut parfois être utilisé par d’autres frameworks Javascript. on peut alors remplacer les appels via jQuery:

jQuery(document).ready(function(jQuery){
            // ne pas utiliser la fonction $ mais jQuery
        });

2/ Injection de javascript avec AngularJS 1.x

AngularJS est actuellement en version 2.x mais cette version s’appuie sur une sur-implémentation de Javascript appelé TypeScript. Le développeur code en langage TypeScript qui passe dans un compilateur TypeScript pour générer du Javascript spécialisé.

AngularJS 2 est plus performant et plus léger que la version 1.x mais nous allons utiliser la version AngularJS 1.x car elle est plus simple en évitant cette compilation additionnelle.

Nous injection dans le tag <header> le chargement d’AngularJS 1.6.1  et d’un fichier Javascript qui va gérer en MVC la manipulation du HTML dans la page Web:

<script
 src="https://ajax.googleapis.com/ajax/libs/angularjs/1.6.1/angular.min.js"></script>
<script src="js/todo.js"></script>

Nous appelons dans une DIV une application todoApp :

<div ng-app="todoApp">

Puis dans un autre DIV incluse dans la précédente nous appelons la gestion de la liste des todo via un controller avec une fabrication du tag de début de liste <ul>:

<div ng-controller="TodoListController as todoList">
 <ul>

Attention le <div> doit inclure la liste et les évènements du <form> pour être effectif sur le bouton du formulaire.

Nous avons ensuite une boucle qui va charger successivement les todos :

<li ng-repeat="todo in todoList.todos">

Nous pouvons ensuite appelé un champ de type checkbox qui va être lié à la partie modèle de notre application AngularJS:

<input type="checkbox" ng-model="todo.actif"> 

Nous pouvons indiquer à AngularJS que nous voulons un affichage du contenu des objects Javascript avec ce genre de code:

{{todo.texte}}
Maintenant pour la partie formulaire nous allons coder l'appel via le bouton Submit à la fonction addTodo qui se trouve dans AngularJs et qui fera ensuite appel au travers du réseau à la Servlet Controlleur: 

 <form ng-submit="todoList.addTodo()">
 <input type="text"  ng-model="todoList.todoText"  placeholder="add new todo here"> 
 
 <input type="submit" value="add">
 </form>

Voici le code todo.js pour déclencher l’affichage de quelques todos pour tester votre application AngularJS:

// Création de l'application todoApp et déclaration du controleur avec le module http activé
angular.module('todoApp', []).controller('TodoListController', function( $http ) {

var todoList = this;
 
todoList.todos = [
{ texte: 'chocolat' , actif:false},
{ texte: 'gateaux' , actif:true}
];
 
// Fonction pour ajouter un  todo depuis l'interface HTML
todoList.addTodo = function() {
      todoList.todos.push( {texte:todoList.todoText, actif:false});
      todoList.todoText = '';
};

}); // Fin application

Pour l’instant tout ce code ne permet qu’une manipulation en local dans le navigateur de la liste des Todos. Il faut via une commande Ajax faire une requête vers le serveur pour que la mise à jours soit effective dans la base de données.

Nota: le paramètre action dans la liste des paramètres permet à la notre Servlet Controlleur de savoir que la demande via pour de l’ajax et qu’il faut faire un ajout du Todo dans la base de données et d’ensuite répondre en  json par exemple:

// Création de la liste des paramètres de la requête GET avec le paramètre action 
var parametres = {action: "ajax.add_todo" };

$http({
  method : "GET",
  url : "./Controleur",
  params: parametres,
})
   .then(function successCallback(response) {
        console.log( response.data );
        // Rafraichir la liste avec la reponse en Json reçue
}, function errorCallback(response) {
        // En cas d'erreur par exemple 404 pour la requête GET sur le controleur
        console.log( response );
});

 

 

2/ Utilisation du module Rewrite de Tomcat

 

Depuis très longtemps, Apache Web Serveur dispose d’un module dit de « Rewriting ». Pour faire simple, une URL arrive de la forme
http://monsite.com/2018/02/27/
et ce module transforme cette URL en cette URL:
http://monsite.com/index.php?year=2018&month=02&day=27

La règle appliquée est écrite avec un système d’expression régulière de la forme.

RewriteRule ^[^/]*/(.*)/(.*)/(.*)$ index.php?year=$1&mont=$2&day=3 [L,QSA]

Pour Tomcat 8+, la modification se fait en 2 endroits.

En premier lieu, ouvrer le fichier server.xml se trouvant dans le dossier « Servers »:

Trouver le <Context> de votre application, dans mon cas, l’application est HibernateEmacs2018.

Il faut transformer le tag solitaite <Context /> en tag ouvrant et fermant
<Context> </Context> pour insérer cette ligne indiquant que l’on veut exploiter la classe RewriteValve

<Valve className="org.apache.catalina.valves.rewrite.RewriteValve" />

 

Dans un second temps, on va créer dans le dossier WEB-INF/ un fichier rewrite.config contenant un ou plusieurs règles de réécritures.

 

La première règle que je vous propose détecte /Controleur/ et convertit donc en URL de formulaire: Controleur?action=getLesTodos qui va afficher tous les Todos par exemple

RewriteRule ^/Controleur/$ /Controleur?action=getLesTodos [R,NE]

La seconde règle permet de convertir toute URL de la forme /Controleur/delTodo/lait/ en URL plus classique /Controleur?action=delTodo&texte=lait :

RewriteRule /Controleur/(.*)/(.*)/ /Controleur?action=$1&texte=$2 [R,NE]

A vous de voir comment améliorer la lisibilité de vos URLs en exploitant ce système de réécriture qui permet de développer en mode RESTful et surtout pour les applications sur Internet d’améliorer le référencement par les moteurs d’indexation qui sont très friand d’URL « lisible ».

 

 

Publié dans Emacs | Laisser un commentaire