Comme tu avais l’air intéressé par Spring , je te fais rapidement une synthèse des possibilités de Spring :
Spring est un container léger. Ceci signifie que tu n’as besoin que d’un Tomcat et des jars « Spring », et qu’il t’apporte des fonctionnalités d’un serveur d’application J2EE (jonas, jboss, etc … ), sans en utiliser un (ex : les transactions, JMS, gestion des objets, sécurité) .
Après si tu as besoin de toutes les fonctionnalités d’un serveur J2EE, il vaut peut-être mieux en utiliser un directement. De plus, J2EE 6 a largement simplifier son modèle de développement suite au critique de la communauté Spring (ejb 3.0, JSF 2.0,etc … ).
Ce dernier est composé de nombreux modules que tu peux intégrer ou non selon tes besoins.
• La grande force de Spring est qu’il est basé sur le POJOs, et de ce fait, il ne contraint pas ton implémentation ( on ne doit pas hériter d’une classe particulière ou implémenter une interface) et peut-être mis en place après coup. La mise en place est simple sur une nouvelle application, et le ticket d’entrée faible.
• Il favorise l’intégration de technologie existante, et ne réinvente pas la roue. C'est-à-dire que qu’il n’essaye pas de concurrencer des Framework reconnus (comme hibernate, activeMQ, etc … ), mais propose des « ponts » pour les intègrer (ex : pour la persistance, il y a un pont vers hibernate, TopLink , JMS, etc …).
• Il fournit un plugin Eclipse qui facilite l’écriture des fichiers XML (Spring IDE).
• Spring adresse l’ensemble des problématiques du développement WEB.
En détails :
1. Gestion du cycle de vie des objets et injection de dépendances (via Spring Core)
a. Ceci permet de substituer facilement une implémentation par une autre (ex : pour les tests, ou pour faire évoluer ton application).
2. Les couches WEB sur une modèle MVC et la création de endpoint REST / JSON (via Spring MVC)
a. Création simple de contrôleur MVC et de vue JSP, two-way binding, validation , et production simple de endpoint REST délivrant du XML/JSON, ou basé sur REST.
3. la sécurité de l’application par JDBC,SSO, LDAP (via Spring Security)
a. Sécuriser simplement une application par un filtre HTTP
4. la couche d’accès à la persistance et gestion des transactions (Spring ORM)
a. Permet de gérer les transactions simplement par annotation, foun
5. exposition des services (via JMX, RMI, JMS, etc …)
a. permet simplement de transformer une « classe normale » en classe appelable via RMI, JMX, Web-Service, etc …)
6. les tests unitaires (via Spring-test)
7. la programmation par aspect (Spring-AOP)
8. plein d’autres modules (Spring batch, etc …)
lundi 28 mars 2011
unix / linux : shell find avec xargs
Voici une astuce lorsque le grep n'est plus possible ... et que grep vous dit :
arg list too long
arg list too long
find . -name "*ClientSession*" | xargs grep 888413
mercredi 16 mars 2011
Seleinium : petit exemple avec du XPATH
Voici un exemple de script qui s'utilise sur Mantis :
package com.example.tests;
import java.io.File;
import java.io.FileWriter;
import java.io.IOException;
import com.thoughtworks.selenium.DefaultSelenium;
import com.thoughtworks.selenium.Selenium;
public class MantisSearch {
/**
* @param args
*/
public static void main(String[] args) {
String chaineARechercher = "";
if (args.length == 1 && !"".equals(args[0])) {
chaineARechercher = args[0];
} else {
System.err.println("Usage : \n");
System.err.println(MantisSearch.class.getSimpleName()
+ " chaineAChercher \n");
System.err.println("Example : \n");
System.err
.println(MantisSearch.class.getSimpleName()
+ " \"at net.mm.ccm.server.DefaultServer.systemFailure (line 1019)\" \n");
System.exit(-1);
}
Selenium selenium = new DefaultSelenium("localhost", 4444, "*chrome",
"http://tracker.com/");
selenium.start();
selenium.open("/login_page.php");
selenium.type("username", "guest");
selenium.type("password", "guest");
selenium.click("//input[@value='Ouvrir la session']");
selenium.waitForPageToLoad("30000");
selenium.click("link=Afficher les bogues");
selenium.waitForPageToLoad("30000");
selenium.type("search", chaineARechercher);
selenium.click("filter");
selenium.waitForPageToLoad("30000");
// si au moins une reponse
StringBuilder builder = new StringBuilder();
int index = 4;
while (selenium.isElementPresent("//table[@id='buglist']/tbody/tr["
+ index + "]")) {
if (selenium.isElementPresent("//table[@id='buglist']/tbody/tr["
+ index + "]/td[4]")) {
String link = selenium
.getText("//table[@id='buglist']/tbody/tr[" + index
+ "]/td[4]");
// System.err.println("click sur le lien " + link);
if (selenium.isElementPresent("link=" + link)) {
selenium.click("link=" + link);
selenium.waitForPageToLoad("5000");
index++;
String resultat = selenium.getBodyText();
if (resultat.indexOf(chaineARechercher) != -1) {
builder.append("######################################################"+"\n");
builder.append("Mantis possible : " + link +"\n");
builder.append(resultat+"\n");
builder.append("######################################################"+"\n");
}
selenium.click("link=Afficher les bogues");
selenium.waitForPageToLoad("5000");
} else {
System.err.println("element non trouve link=" + link);
}
}
else
{
// il n'y plus de resultat
// on sort
break;
}
}
try {
FileWriter file = new FileWriter("mantisTrouvees.txt");
file.write(builder.toString());
file.flush();
file.close();
} catch (IOException e) {
e.printStackTrace();
}
System.out.println(builder.toString());
selenium.click("link=Fermer la session");
selenium.waitForPageToLoad("30000");
selenium.stop();
}
}
javascript : ajax exemple
Un très bon site traitant du sujet
Voici un petit exemple Ajax :
Tout d'abord un exemple synchrone :
Puis , un exemple asynchrone :
Un exemple complet avec un POST :
Une troisième façon de faire, mais qui ne me semble pas être de l'ajax car elle rafraichi tout la page :
Voici la page complète :
Voici un petit exemple Ajax :
Tout d'abord un exemple synchrone :
var xhr_object = null;
if(window.XMLHttpRequest) // Firefox
xhr_object = new XMLHttpRequest();
else if(window.ActiveXObject) // Internet Explorer
xhr_object = new ActiveXObject("Microsoft.XMLHTTP");
else { // XMLHttpRequest non supporté par le navigateur
alert("Votre navigateur ne supporte pas les objets XMLHTTPRequest...");
return;
}
xhr_object.open("GET", location.href, false);
xhr_object.send(null);
if(xhr_object.readyState == 4) alert("Requête effectuée !");
Puis , un exemple asynchrone :
var xhr_object = null;
if(window.XMLHttpRequest) // Firefox
xhr_object = new XMLHttpRequest();
else if(window.ActiveXObject) // Internet Explorer
xhr_object = new ActiveXObject("Microsoft.XMLHTTP");
else { // XMLHttpRequest non supporté par le navigateur
alert("Votre navigateur ne supporte pas les objets XMLHTTPRequest...");
return;
}
xhr_object.open("GET", "uneJsp.jsp", true);
xhr_object.onreadystatechange = function() {
if(xhr_object.readyState == 4) alert(xhr_object.responseText);
}
xhr_object.send(null);
Un exemple complet avec un POST :
var l1 = f.elements["list1"];
var l2 = f.elements["list2"];
var index = l1.selectedIndex;
if(index < 1)
l2.options.length = 0;
else {
var xhr_object = null;
if(window.XMLHttpRequest) // Firefox
xhr_object = new XMLHttpRequest();
else if(window.ActiveXObject) // Internet Explorer
xhr_object = new ActiveXObject("Microsoft.XMLHTTP");
else { // XMLHttpRequest non supporté par le navigateur
alert("Votre navigateur ne supporte pas les objets XMLHTTPRequest...");
return;
}
xhr_object.open("POST", "species.php", true);
xhr_object.onreadystatechange = function() {
if(xhr_object.readyState == 4)
eval(xhr_object.responseText);
}
xhr_object.setRequestHeader("Content-type", "application/x-www-form-urlencoded");
var data = "family="+escape(l1.options[index].value)+"&form="+f.name+"&select=list2";
xhr_object.send(data);
}
Une troisième façon de faire, mais qui ne me semble pas être de l'ajax car elle rafraichi tout la page :
Voici la page complète :
<%@ page language="java" contentType="text/html; charset=ISO-8859-1"
pageEncoding="ISO-8859-1"%>
<%@ page import="java.util.Date" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
<title>Insert title here</title>
<script type="text/javascript">
function updateData()
{
var dt = new Date();
window.status = dt.getSeconds();
}
function timer()
{
var value = 1000;
if(value > 0)
{
//window.setTimeout(function() {var dt = new Date();window.status = dt.getSeconds();},2000);
var date = new Date();
var e = window.document.getElementById("date");
e.innerHTML = date.getSeconds();
window.setTimeout('document.location=document.location',2000);
}
else
{
alert("erreur de saisie");
}
}
</script>
<title>test refresh</title>
</head>
<body onload="timer()">
<h1 id="date">pas de date</h1>
</body >
</html>
vendredi 11 mars 2011
java : les desgin pattern
voici 2 lien très intéressants concerant les patterns :
http://www.javacamp.org/designPattern
http://www.dofactory.com/Default.aspx
http://www.javacamp.org/designPattern
http://www.dofactory.com/Default.aspx
jeudi 10 mars 2011
unix /linux : la commande diff et la commande patch
un très bon site ici
Voici les 2 commandes à connaitre pour appliquer automatiquement les différences détectées par la commande diff:
Supposons que nous ayons 2 fichiers nommés version1 et version2 en 2 versions différentes :
Tout d'abord, effectuons, un diff que nous redirigeons vers un fichier de patch nommé pdate1to2.patch :
$ diff -u version1 version2 > update1to2.patch
Ensuite, il faut appliquer la commande patch
patch -p0 < update1to2.patch
A noter : L'argument -p{nb} indique de tronquer x répertoires dans les noms de fichiers affectés par le patch. Cela peut-être pratique quand un patch s'applique à une aborescence qui n'est pas la même que la votre.
A noter diff -r pour 2 répertoires
diff -r repertoire1 repertoire1
Voici les 2 commandes à connaitre pour appliquer automatiquement les différences détectées par la commande diff:
Supposons que nous ayons 2 fichiers nommés version1 et version2 en 2 versions différentes :
Tout d'abord, effectuons, un diff que nous redirigeons vers un fichier de patch nommé pdate1to2.patch :
$ diff -u version1 version2 > update1to2.patch
Ensuite, il faut appliquer la commande patch
patch -p0 < update1to2.patch
A noter : L'argument -p{nb} indique de tronquer x répertoires dans les noms de fichiers affectés par le patch. Cela peut-être pratique quand un patch s'applique à une aborescence qui n'est pas la même que la votre.
A noter diff -r pour 2 répertoires
diff -r repertoire1 repertoire1
mysql : se connecter au shell SQL
Voici, un rappel des commande à lancer pour se connecter à un shell mysql :
mysql -hmaMachineHote -P3306 -umonUser -pmonMotDePasse -e "SELECT * FROM Client"
Server version: 5.0.56_AWL-Enterprise-log Source distribution
Type 'help;' or '\h' for help. Type '\c' to clear the buffer.
mysql>connect maBDD
select * from Client;
Comment demarrer une transaction (BEGIN pourt mysql <= 4.1 ou sinon START TRANSACTION)
mysql>START TRANSACTION;
mysql>UPDATE Client SET PROFILE='GOLD' WHERE TOTAL >= 1000;
...
mysql>ROOLBACK;
...
mysql>UPDATE Client SET PROFILE='GOLD' WHERE TOTAL >= 3000;
...
mysql>commit;
la transaction est svalidé par le mot clé COMMIT ou invalidé par ROLLBACK
A noter : lors d'une commande insert, update ou delete, il est possible de connaître le nombre de colonne impactées avec la requête suivante :
select ROW_COUNT();
Voici une commande pour lancer un script SQL :
mysql>source monFichier.sql
Ou une seconde commande (qui correspond à la commande source mais en mode "court")
mysql>\. monFichier.sql
Lancer une commande directement (dasn un sh par exemple) :
mysql -hmaMachineHote -P3306 -umonUser -pmonMotDePasse -e "SELECT * FROM Client"
mysql -hmaMachineHote -P3306 -umonUser -pmonMotDePasse -e "SELECT * FROM Client"
Server version: 5.0.56_AWL-Enterprise-log Source distribution
Type 'help;' or '\h' for help. Type '\c' to clear the buffer.
mysql>connect maBDD
select * from Client;
Comment demarrer une transaction (BEGIN pourt mysql <= 4.1 ou sinon START TRANSACTION)
mysql>START TRANSACTION;
mysql>UPDATE Client SET PROFILE='GOLD' WHERE TOTAL >= 1000;
...
mysql>ROOLBACK;
...
mysql>UPDATE Client SET PROFILE='GOLD' WHERE TOTAL >= 3000;
...
mysql>commit;
la transaction est svalidé par le mot clé COMMIT ou invalidé par ROLLBACK
A noter : lors d'une commande insert, update ou delete, il est possible de connaître le nombre de colonne impactées avec la requête suivante :
select ROW_COUNT();
Voici une commande pour lancer un script SQL :
mysql>source monFichier.sql
Ou une seconde commande (qui correspond à la commande source mais en mode "court")
mysql>\. monFichier.sql
Lancer une commande directement (dasn un sh par exemple) :
mysql -hmaMachineHote -P3306 -umonUser -pmonMotDePasse -e "SELECT * FROM Client"
mysql : lancer des commandes SQL via un script ksh
Voici un exemple simple de script ksh, qui se connecte a une BDD et lance des commandes :
Tout d'abord, il suffit de lancer un shell myqsl via la commande suivante :
A noter que les argument sont "collés" au options, et l'option -e pour lancer une commande sql.
$MYSQL -h$MYSQL_SERVEUR -P3306 -u$USER -p$PWD -e "$REQUETE_SAV" > sauvegardeDonnees.txt
Voici; l'exemple complet ...
Tout d'abord, il suffit de lancer un shell myqsl via la commande suivante :
A noter que les argument sont "collés" au options, et l'option -e pour lancer une commande sql.
$MYSQL -h$MYSQL_SERVEUR -P3306 -u$USER -p$PWD -e "$REQUETE_SAV" > sauvegardeDonnees.txt
Voici; l'exemple complet ...
#!/bin/ksh
set -x
echo "Debut de ${0}"
#------------------------------------------------------------
# VALIDATION ET RECUPERATION DES PARAMETRES
#------------------------------------------------------------
NB_PARAM=5
if [ $# -ne $NB_PARAM ]
then
echo "Nombre de paramètre incorrect"
echo
echo "USAGE : "
echo "${0} NomBase User PWD nomFileARenommer nomNouvelleFile"
exit 0
fi
# ------------------------------------------------------------------
# Chargement du profile
# ------------------------------------------------------------------
echo "Chargement du profile"
. /etc/conf/ini_trt_mysql.ksh
BASE=$1
USER=$2
PWD=$3
NOM_ORIGINE=$4
NOM_NOUVEAU=$5
REQUETE_NEW="use $BASE;SELECT * FROM client WHERE name='${NOM_NOUVEAU}'"
REQUETE_SAV="use $BASE;SELECT * FROM client WHERE name='${NOM_ORIGINE}'"
REQUETE_UPDATE="use $BASE;UPDATE client SET NAME='${NOM_NOUVEAU}' WHERE NAME='${NOM_ORIGINE}'"
echo "BASE = " $1
echo "USER = " $2
echo "PWD = " $3
# ------------------------------------------------------------------
# Lancement de la requête
# ------------------------------------------------------------------
$MYSQL -h$MYSQL_SERVEUR -P3306 -u$USER -p$PWD -e "$REQUETE_SAV" > sauvegardeDonnees.txt
$MYSQL -h$MYSQL_SERVEUR -P3306 -u$USER -p$PWD -e "$REQUETE_UPDATE"
$MYSQL -h$MYSQL_SERVEUR -P3306 -u$USER -p$PWD -e "$REQUETE_NEW" > nouvelleDonnees.txt
diff sauvegardeDonnees.txt nouvelleDonnees.txt
# ------------------------------------------------------------------
# Fin du traitement
# ------------------------------------------------------------------
echo "Fin de ${0}"
lundi 7 mars 2011
unix / linux : charger simplement des variables d'environnements
Une syntaxe simple permet de charger des variables ou d'exécuter un script de "contexte", il s'agit de :
echo "chargement du contexte"
. /home/enwoo/monScriptDeContexte.sh
echo "démarrage du script"
Cette simple commande lancera le premier script et permettra par exemple de positionner des variables d'environnements nécessaires aux commandes suivantes ...
echo "chargement du contexte"
. /home/enwoo/monScriptDeContexte.sh
echo "démarrage du script"
Cette simple commande lancera le premier script et permettra par exemple de positionner des variables d'environnements nécessaires aux commandes suivantes ...
unix / linux : find multiple commande exec
Voici, comment exécuter plusieurs commande dans le même find ... C'est tout simple et parfois très pratique ...
find . \( -name "*.*" \) -type f -exec grep -i 'style=' {} \; -exec grep -i '<STYLE>' {} \; -print > allStyle.txt
A noter, qu'il existe une syntaxe alternative avec des + pour la séparation
find . \( -name "*.*" \) -type f -exec grep -i 'style=' {} \; -exec grep -i '<STYLE>' {} \; -print > allStyle.txt
A noter, qu'il existe une syntaxe alternative avec des + pour la séparation
Inscription à :
Articles (Atom)