mardi 13 mars 2012

maven : appeler des tâches ants de zip et YUICompressor

Voici, un exemple de script maven permettant d'executer des taches ANT de post-build. L'exemple suivant permet d'effectuer des zips (par exemple pour livrer des scripts bash ou autres) et minise des fichiers JS, et remplace des tokens par un timestamps afin d'éviter des problèmes de caches des navigateurs: <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/maven-v4_0_0.xsd">
<modelVersion>4.0.0</modelVersion>

<!-- ============== -->
<!-- Identification -->
<!-- ============== -->
<groupId>net.enwoo</groupId>
<artifactId>bandeau_extension</artifactId>
<version>0.0.1-SNAPSHOT</version>
<packaging>pom</packaging>
<name>uneAppli</name>

<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-antrun-plugin</artifactId>
<dependencies>
<dependency>
<groupId>ant</groupId>
<artifactId>ant-jsch</artifactId>
<version>1.6.5</version>
</dependency>
<dependency>
<groupId>jsch</groupId>
<artifactId>jsch</artifactId>
<version>0.1.25</version>
</dependency>
</dependencies>
<executions>
<execution>
<id>bandeau_extension</id>
<phase>package</phase>
<configuration>
<tasks>
<ant antfile="${basedir}/build.xml">
<target name="deploy" />
</ant>
</tasks>
</configuration>
<goals>
<goal>run</goal>
</goals>
</execution>
</executions>
</plugin>
</plugins>
</build>
</project>

taches ANT de zip


<?xml version="1.0"?>

<project default="deploy" basedir=".">
<property name="zipDir" location="${basedir}\zip" />
<property name="user" value="monUser" />
<property name="password" value="*******" />

<!-- =================================
target: deploy
================================= -->
<target name="deploy" depends="zip" description="copie sur la bastion les zip">
<echo>debut transfert</echo>
<echo>${user}:${password}@uneMachineServeur:/home/${user}</echo>
<scp todir="${user}@uneMachineServeur:/home/${user}/MEP" failonerror="true" verbose="true" trust="true" password="${password}">
<fileset dir="${zipDir}">
<include name="**/*.zip" />
<include name="**/*.sh" />
</fileset>
</scp>
<echo>fin transfert</echo>
</target>


<!-- - - - - - - - - - - - - - - - - -
target: zip
- - - - - - - - - - - - - - - - - -->
<target name="zip" depends="clean,compressor, gestionVersion, zipWEB, zipMiddle">
<echo>fin packaging</echo>
</target>

<!-- - - - - - - - - - - - - - - - - -
target: clean
- - - - - - - - - - - - - - - - - -->
<target name="clean">
<echo>nettoyage [${zipDir}]</echo>
<delete includeemptydirs="true">
<fileset dir="${zipDir}" includes="**/*.zip" />
</delete>

<delete verbose="true">
<fileset dir="${basedir}/src/main/webapp/js/csr">
<include name="Services*.js" />
</fileset>
</delete>


<delete verbose="true">
<fileset dir="${basedir}/tmp">
<include name="**/*.js" />
</fileset>
</delete>
<echo>fin nettoyage [${zipDir}]</echo>
</target>


<!-- - - - - - - - - - - - - - - - - -
target: zipWEB
- - - - - - - - - - - - - - - - - -->
<target name="zipWEB">
<echo>creation du zip pour le web</echo>
<zip destfile="${zipDir}/WEBS.zip" basedir="${basedir}/src/main/webapp" />
<echo>fin creation du zip pour le web</echo>
</target>

<!-- - - - - - - - - - - - - - - - - -
target: zipMiddle
- - - - - - - - - - - - - - - - - -->
<target name="zipMiddle">
<echo>creation du zip pour les patchs sous forme de classes</echo>
<zip destfile="${zipDir}/middlePatch.zip" basedir="${basedir}/middle/classes" />
<echo>fin creation du zip pour les patchs sous forme de classes</echo>
</target>

<!-- - - - - - - - - - - - - - - - - -
target: compressor
- - - - - - - - - - - - - - - - - -->
<target name="compressor">
<ant antfile="compressor.xml" target="doCompress" />
</target>


<!-- - - - - - - - - - - - - - - - - -
target: gestionVersion
- - - - - - - - - - - - - - - - - -->
<target name="gestionVersion">
<tstamp>
<format property="buildDate" pattern="yyyyMMdd_HHmmss_SS" />
</tstamp>

<copy tofile="${basedir}/src/main/webapp/wacd/defaults/csr/Bandeau_CSR.html" file="${basedir}/src/main/webapp/wacd/defaults/csr/Bandeau_CSR_template.html" overwrite="true" verbose="true"/>
<replace file="${basedir}/src/main/webapp/wacd/defaults/csr/Bandeau_CSR.html" value="${buildDate}" summary="true">
<replacetoken>@version_build@</replacetoken>
</replace>

<copy tofile="${basedir}/src/main/webapp/js/csr/Services.js" file="${basedir}/tmp/min/Services.js" verbose="true"/>
<move tofile="${basedir}/src/main/webapp/js/csr/Services_${buildDate}.js" file="${basedir}/src/main/webapp/js/csr/Services.js" verbose="true"/>
</target>
</project>

taches de minimisation du JS par YUICompressor


<?xml version="1.0"?>

<project default="doCompress" basedir=".">
<property name="jsDir" location="${basedir}/src/main/webapp/js/csr" />
<property name="tmpDir" location="${basedir}/tmp" />
<property name="concatDir" location="${tmpDir}/concat" />
<property name="minDir" location="${tmpDir}/min" />
<!-- =================================
target: compression
================================= -->
<target name="doCompress" depends="doConcat" description="Compresse le js concatene">
<echo>Compression</echo>
<taskdef name="yuicompress" classname="com.yahoo.platform.yui.compressor.YUICompressTask">
<classpath>
<pathelement path="${basedir}/lib/YUIAnt.jar" />
<pathelement path="${basedir}/lib/yuicompressor-2.4.7.jar" />
<pathelement path="${basedir}/lib/rhino-1.6R7.jar" />
</classpath>
</taskdef>
<delete includeemptydirs="true">
<fileset dir="${minDir}" includes="Services.js"/>
</delete>
<yuicompress warn="false" munge="yes" preserveallsemicolons="true" outputfolder="${minDir}" >
<fileset dir="${concatDir}" >
<include name="**/Services.js" />
</fileset>
</yuicompress>
<echo>fin compression</echo>
</target>

<!-- =================================
target: concatenation
================================= -->
<target name="doConcat" description="Concatene les js">
<echo>Concatenation</echo>
<delete includeemptydirs="true">
<fileset dir="${concatDir}" includes="Services.js"/>
</delete>
<concat destfile="${concatDir}/Services.js" force="no">
<filelist dir="${jsDir}" files="Services.js,myload.js"/>
</concat>
<echo>Fin concatenation</echo>
</target>
</project>

vendredi 3 février 2012

Unix / Linux : faire une liste simple de répertoire

Parfois, lorsque l'on dispose de nombreuses instances de programme, et qu'on souhaite automatiser des choses, sur des arborescence similaire , mais légèrement différentes (comme des nombreuses install tomcat)

il est utile de faire une boucle en shell. Un moyen simple, et la commande "ls" couplé a "cut" pour récupérer la partie variable de l'instance.

Par exemple, j'ai 3 instances tomcats :

/Metier/tomcat1/conf/server.xml
/Metier/tomcat2/conf/server.xml
/Metier/tomcat3/conf/server.xml
/Metier/UnAutreTomcat1/conf/server.xml
/Metier/ UnSecondTomcat1 /conf/server.xml

Je veux récupérer tous les fichiers server.xml de mes instances tomcat (et pas les 2 dernières), pour les gérer en conf.

Ce qui nous donne :

TOMCATS=`ls /MIDDLE/tomcat* | grep SSL-cnav2 | cut -d'/' -f 1`

for unTomcat in $TOMCATS ; do
  mkdir -p $DEST/$ unTomcat   
  cp -v /MIDDLE/cnav/$ unTomcat /tomcat1/conf/* $DEST/$unTomcat
done





Unix / Linux : trouver facilement un binaire/fichier

Dans des scripts bash, il est regulièrement nécessaire de spécifier des chemins. Une technique simple, peut être d'utiliser la commande "locate", et si elle ne trouve rien, on peut tenter une chemin par défaut. Voici, des exemples simples qui utilise les options -e pour "exist" et -r pour chercher la regex.

Pour trouver java :
bash3.02:$/usr/bin/locate -e -r "bin/java$"

Pour trouver mysqldump, et préciser un chemin par défaut dans le cas contraire :
...
# Check presence MySQL MysqlDump=`/usr/bin/locate -e -r "mysqldump$"` 
if [ $? -ne 0 ]; then 
   echo 1 "mysqldump command not found" 
else 
   Mysql="/usr/local/mysql/bin/mysql" 
fi

lundi 23 janvier 2012

Unix / Linux : shell lecture de configuration

Voici une technique simple pour créer des scripts de déploiements sur plusieurs machines : # ecrasement cp $APP_REPO/MIDDLE/APPDocumentServlet.xml /MIDDLE/monAppli/$APP_SERVICE_NAME/tomcat1/conf cp $APP_REPO/MIDDLE/classpath.txt /MIDDLE/monAppli/$APP_SERVICE_NAME/tomcat1/conf cp $APP_REPO/MIDDLE/jvm.properties /MIDDLE/monAppli/$APP_SERVICE_NAME/tomcat1/conf cp $APP_REPO/MIDDLE/web.xml /MIDDLE/monAppli/$APP_SERVICE_NAME/tomcat1/conf # maj APPDocumentServlet.xml cd /MIDDLE/monAppli/$APP_SERVICE_NAME/tomcat1/conf sed -i -e "s/\$APP_SLS_APP_NAME/$APP_SLS_APP_NAME/g" APPDocumentServlet.xml sed -i -e "s@\$APP_SLS_BDD@$APP_SLS_BDD@g" APPDocumentServlet.xml # maj classpath sed -i -e "s/\$APP_SERVICE_NAME/$APP_SERVICE_NAME/g" classpath.txt # maj jvm.properties sed -i -e "s/\$APP_SERVICE_NAME/$APP_SERVICE_NAME/g" jvm.properties # RELANCE service start_service $APP_SERVICE_NAME rm /SVI/monAppli/$APP_SERVICE_NAME/conf/dog.txt

mercredi 21 décembre 2011

unix / linux : ajouter des users qui se connecte par ssh

Pour gérer simplement les users, la notion de groupe est essentielle. Avec openssh , il est simple de créer et d'ajouter des users pouvant se connecter par ssh.
Tout d'abord ajoutons l'option "AllowGroup" dans le fichier /etc/ssh/sshd_config ... AllowGroup sshlogin ... Puis, redémarrer le process : /etc/init.d/ssh restart
Pour cela, il faut créer un groupe "sshlogin" :

addgroup ssh login Puis on crer des users:
adduser toto On ajoute les users existants au groupe :
adduser toto sshlogin Les utilisateurs peuvent alors se connecter ... Des explications bien plus complètes sur ubuntu.fr

jeudi 3 novembre 2011

outils : astuces putty


Astuce 1 : Ne plus taper le votre user pour se connecter aux machines se connecter au bastion rajouter la ligne la ligne User www dans le fichier ~/.ssh/config on peut maintenant faire : ssh monserveur05 et plus ssh monUser@monserveur05 Astuce 2 : Utiliser le pavé numérique sous VI en utilisant Putty sous putty dans Terminal / Features cocher "Disable application keypad mode" Astuce 3 : Augmenter la taille du scroll de la fenêtre sous Putty sous putty dans Window mettre une nouvelle valeur dans le champs "Lines of scrollback" Attention à ne pas oublier de sauvegarder les options sous Putty!


mardi 13 septembre 2011

Web / http / https / IE : contenu mixte elements non securises

Si vous créer un site web, dotn le contenu est distribué en HTTPS. Ce dernier peut faire référence à des éléments non sécurisés tel que des image, ou le player Window Media Player ... De ce fait, sous IE, vous aurez à chaque ouverture de la page, une popup, vous demandant si vous souhaitez ou non afficher cette page qui contient des éléments non sécurisés (commençant par http ...) Voici un très bon lien traitant du sujet : Pour corrigez , cela :
  1. si cela est possible, vous pouvez passer ces ressources en https (ex : en
  2. si la ressource ne vous appartient pas ... alors il ne faut pas spécifier le protocole et mettre // (ex : en
  3. la dernière solution est de configurer IE pour qu'il accepte le contenu mixte (ds tools-security->custom level-> accept mixte content (je en suis plus sûr du libellé exact :-) )
Voici un exemple avec le player windows : A noter que les urls ont été modifiées pour être "relative" // en supprimant http ... ce qui supprime le warning sous IE remplacement de : http://www.microsoft.com/Windows/Downloads/Contents/Products/MediaPlayer en //www.microsoft.com/Windows/Downloads/Contents/Products/MediaPlayer Ce qui donne :

Chargement en cours...

web / html / javascript / flash player / video

Voici une petite librairie javascript fort utile nommée flowplayer , qui fonctionne avec jquery et permet d'encapsuler une player flash pour lire des videos / mp3 par exemple ... voici l'exemple de code tiré du site <!-- setup player container --> <div id="player" style="width:500px;height:300px"></div> <div id="info" class="box info"> You have Flash version 9.115 or above. Enjoy high quality video! </div> <!-- flowplayer configuration --> <script> // Flowplayer installation with Flashembed parameters
flowplayer("player", { // our Flash component
src: "/swf/flowplayer-3.2.7.swf", // we need at least this version
version: [9, 115], // older versions will see a custom message
onFail: function() { document.getElementById("info").innerHTML = "You need the latest Flash version to view MP4 movies. " + "Your version is " + this.getVersion() ; } // here is our third argument which is the Flowplayer configuration
}, { clip: "http://blip.tv/file/get/KimAronson-TwentySeconds6421.m4v" }); </script> </body> </html>

mardi 6 septembre 2011

j2ee : retourner du JSON simplement dans une servlet

Voici un exemple cours qui, montre comment retourner simplement du JSON avec une servlet et les lib adéquates : protected String returnJson(HttpServletRequest request, HttpServletResponse response, JSONObject json) { try { response.setContentType("application/json;charset=iso-8859-1"); PrintWriter writer = response.getWriter(); writer.write(json.toString()); writer.close(); return null; } catch (IOException e) { request.getParameterMap().put("json_response", json); return "/json_response.jsp"; } }

mercredi 31 août 2011

web : plugins de developpement JS / CSSsur IE 7

Voici, un lien permettant d'installer le plugin de developpement sous IE 7 (cette dernière étant intégré nativement dans les versions ultérieures

http://www.microsoft.com/download/en/details.aspx?id=18359

jquery : validation plugin

Voici un exemple d'utilisation de jquery validate plugin :


<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
"http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<script src="js/jquery-1.5.1.js"></script>
<script type="text/javascript" src="js/jquery.validate.js"></script>
<style type="text/css">
* { font-family: Verdana; font-size: 96%; }
label { width: 10em; float: left; }
label.error { float: none; color: red; padding-left: .5em; vertical-align: top; }
p { clear: both; }
.submit { margin-left: 12em; }
em { font-weight: bold; padding-right: 1em; vertical-align: top; }
</style>
<script>
$(document).ready(function(){

$('#commentForm').validate( {
rules: {
comment : {
required: true,
email: true
},
comment2 : {
required: true,
url: true
}}
});
});
</script>

</head>
<body>


<form class="cmxform" id="commentForm" method="get" action="">
<fieldset>
<legend>A simple comment form with submit validation and default messages</legend>
<!-- <p>
<label for="cname">Name</label>
<em>*</em><input id="cname" name="name" size="25" class="required" minlength="20" />
</p>
<p>
<label for="cemail">E-Mail</label>
<em>*</em><input id="cemail" name="email" size="25" class="required email" />
</p>
<p>
<label for="curl">URL</label>
<em> </em><input id="curl" name="url" size="25" class="url" value="" />
</p>
<p>
<label for="ccomment">Your comment</label>
<em>*</em><textarea id="ccomment" name="comment" cols="22" class="required"></textarea>
</p>
<p> -->

<p>
<label for="ctest">Your comment</label>
<em>t*</em><input type="text" id="ctest" name="comment" cols="22" minlength="2" size="25" ></textarea>
</p>
<p>
<label for="ctest2">Your comment</label>
<em>t*</em><input type="text" id="ctest2" name="comment2" cols="22" minlength="2" size="25" ></textarea>
</p>
<input class="submit" type="submit" value="Submit"/>
</p>
</fieldset>
</form>
</body>
</html>

mardi 30 août 2011

java : reflexion / instantiation ./ construction

Voici comment créer une instance d'une classe interne via un constructeur quin'est pas celui par défaut.

A noter qu'il est nécessaire pour les classes interne de passer une instance de la classe englobante comme le montre l'exemple suivant :


package com.ldu.divers;

import java.lang.reflect.Constructor;
import java.lang.reflect.InvocationTargetException;

public class Test {

public class UnDTO2 {
private String lastName = "";
private String firstName = "";
public UnDTO2(String lastName,String firstName) {
this.lastName = lastName;
this.firstName = firstName;
}
public String getLastName() {
return lastName;
}
public void setLastName(String lastName) {
this.lastName = lastName;
}
public String getFirstName() {
return firstName;
}
public void setFirstName(String firstName) {
this.firstName = firstName;
}
}

/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub

Class c = UnDTO2.class;
Constructor [] cos = c.getDeclaredConstructors();
for (Constructor constructor : cos) {
System.err.println(constructor.toString());
}

try {
Constructor constr = c.getConstructor(Test.class, String.class,String.class);
UnDTO2 dto = constr.newInstance(new Test(), "monNom","Enwoo");

} catch (SecurityException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (NoSuchMethodException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IllegalArgumentException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (InstantiationException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IllegalAccessException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (InvocationTargetException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}

jeudi 4 août 2011

Unix/Linux : comment savoir qu'un repertoire est un filer

Regulièrement, lors de l'écritur de script, je me demande si je peux pointer vers tel endroit ou non sur mon fileSystem, et aussi parfois entre 2 machines.

Un moyen simple de le savoir, et aussi de savoir si 2 répertoires différents montés sur 2 points montages différents correspondent à la même machine, et la commade mount.

$mount

/dev/sda1 on / type ext3 (rw)
none on /proc type proc (rw)
/dev/sda2 on /usr type ext3 (rw)
/dev/sda3 on /var type ext3 (rw)
/dev/sda4 on /tmp type ext3 (rw)
/dev/sda6 on /usr/local/MIDDLELOGS type ext3 (rw)
none on /sys type sysfs (rw)
none on /dev/pts type devpts (rw)
dmz-data45:/vol/vol5/stockage_system on /LOCAL/system type nfs (ro,nfsvers=3,addr=172.168.200.215)


Comme on peut le remarquer, le réperoire monter en "/LOCAL/system" est en fait une machine distante dont l'IP est 172.168.200.215, et le nom symbolique est dmz-data45, et le répertoire physique est /vol/vol5/stockage

Et voilà, je sait maintenant que je peut mutualiser des choses sur cette machine

vendredi 29 juillet 2011

mysql : faire un dump

il faut utiliser l'utilitaire mysqldump :


mysqldump --complete-insert --compact --add-drop-table --compatible=mysql40 -uMASTLogin -pmonLogin -hMonPassword maBDD >> monFichier.dump


Ensuite, il est nécessaire de l'importer :

/usr/bin/mysql -uMonLogin -pMonPassword -hMonServeur monSchema < monDump.dump

mercredi 20 juillet 2011

bash : copie de répertoires distants

Pour cela, on peut utiliser la commande scp avec l'option -r

Ce qui donne par exemple :
scp -r www@monHote:/usr/local/framework/lib .

Cet exemple effectue une copie recursive de l'ensemble du contenu du répertoire "/usr/local/framework/lib" sur la machine "monHote" vers le répertoire local courant

bash : faire un tar a partir d'une liste de fichiers

La commande tar permet de réaliser une archive de fichier à partir de la commande suivante :

Tout d'abord une commande utilse pour créer une liste de fichier, et j'insiste bien sur une liste de fichiers:


Dans l'exemple suivant, on exclut le répertoire "lib" :
find -type f | egrep -v "^\.\/lib\/" > ../liste.txt


Puis on lance la commande tar avec l'option -T qui prend une liste de fichiers ... (de fichiers en chemin absolu ou relatif):

tar -cvf ../monfichier.tar -T ../liste.txt

mardi 7 juin 2011

jquery : astuce ajax ...

Une méthode simple pour faire de jolie objets, et de l'ajax simplement :

tout d'abord une astuce sympa pour configurer tous les appels ajax avec une conf par defaut :

$.ajaxSetup({
type: 'POST'
url: 'test.php',
timeout: 3500
});



Une seconde façon, pour faire des appels ajax, via un objets :

var GALLERY = {
container: "#gallery",
url: "getImages",
delay: 5000,
load: function() {
// faire l'appel ajax
},
display: function(image_url) {
// traiter les donnees, et leur affichage

}
};



load: function() {
var _gallery = this;
$.ajax({
type:"get",
url: this.url,
success: function(data) {
var images = data.split('|');
$.each(images, function() {
_gallery.display(this);
});
}
});
}



display: function(image_url) {
$('')
.attr('src', 'images/' + data)
.hide()
.load(function() {
$(this).fadeIn();
})
.appendTo(this.container);
}



$(document).ready(function() {
GALLERY.load();
});

service Rest avec Spring MVC et jquery

Avec Spring 3.0, il est vraiment simple de faire des services RESTFull, voici, un exemple très simple de d'un controller spring qui propose 2 methodes :
La première par un GET permettant de recuperer une personne en JSON
et la seconde de sauver un tableau de personnes. Pour cette dernière, il faut noter l'utilisation d'un POST, et la recupération de l'objet par ResquestBody :

A noter, que JSON ne supporte que très peu de type (par exemple pas de liste, seulement des tableaux:


@Controller
public class MonServices {

@Resource(name = "Modele")
private Modele modele;

@RequestMapping(value = "**/{instance}/personne/{name}", method = RequestMethod.GET)
public @ResponseBody Personne getPersonne(HttpServletRequest request,
HttpServletResponse response, @PathVariable String instance,
@RequestParam(required = false) String httpCode,@PathVariable String name) {

setHTTPStatus(response, "200");
Personne p = new Personne("john",name);
System.out.println("JSON => " + p.toString());
return p;
}

@RequestMapping(value = "**/{instance}/personne/save", method = RequestMethod.POST)
public @ResponseBody Personne [] savePersonne(@RequestBody Personne [] p,HttpServletRequest request,
HttpServletResponse response) {
setHTTPStatus(response, "200");
for (Personne personne : p) {
personne.setFirstname("postOK" + personne.getName());
}
return p;
}
}


Voici le bean Personne, en java :

public class Personne extends ModeleBean{

public Personne() {
// TODO Auto-generated constructor stub
}

public Personne(String firstname, String name) {
this.name = name;
this.firstname = firstname;
}

/**
* @return the name
*/
public String getName() {
return name;
}

/**
* @param name
* the name to set
*/
public void setName(String name) {
this.name = name;
}

/**
* @return the firstname
*/
public String getFirstname() {
return firstname;
}

/**
* @param firstname
* the firstname to set
*/
public void setFirstname(String firstname) {
this.firstname = firstname;
}

private String name;
private String firstname;
}


Pour la parti javascript, je vous conseille JQuery, et les plugins jquery.postJSON :

Pour le GET:

$.getJSON('instance/personne/toto.smvc', function(data) {
var items = [];

$.each(data, function(key, val) {
items.push('>li id="' + key + '"<' + val + '>/li<');
});

$('>ul/<', {
html : items.join('')
}).appendTo('body');
});


Pour le POST:

function postData() {
var personnes = new Array();
personnes[0] = {
name : "duc",
firstname : "lolo"
};
personnes[1] = {
name : "duc",
firstname : "franck"
};

$.postJSON("instance/personne/save.smvc", personnes, function(data) {
var items = [];

$.each(data, function(key, val) {
items.push('>li id="' + key + '"<' + val + '>/li<');
});

$('>ul/<', {
html : items.join('')
}).appendTo('body');
});
return false;
}

lundi 30 mai 2011

web : test de sites avec plusieurs navigateurs IE

Parfois , il est nécessaire de tester des sites avec plusieurs navigateurs IE. il est difficile de faire cohabiter différentes vesions de IE.

Le site Utilu propose une installation tout en un des navigateurs IE 3->IE 8, et la même chose pour Firefox ...

Ceci fonctionne très bien , et très rapide à mettre en oeuvre. Une fois télécharger et installer, vous disposez d'un icone par version de IE, ce qui vous permet de tester rapidement votre site en plusieurs versions ...

C'est simple et efficace ...

vendredi 1 avril 2011

java J2EE : tapestry et Spring

Pour utiliser Spring et Tapestry sur le même projet, il est nécessaire d'utiliser une version de tapestry < 5.1.0.18 et d'utiliser les dépendances maven suivantes :

La prise en compte de la configuration Spring par tapestry se fait en utilisant un filter org.apache.tapestry5.spring.TapestrySpringFilter et pas org.apache.tapestry5.TapestryFilter.

Attention, il est nécessaire d'ajouter la dépendance maven tapestry-spring dans votre pom.xml, et il faut noter que les bean spring sont accessibles par l'annotation @inject de tapestry !!!

Ce dernier va remplacer le listener de contexte fournit par Spring.

Les paramètres de configuration sont les mêmes que ceux fournit pour Spring, en l'occurence :

<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath*:applicationContext-front.xml</param-value>
</context-param>


et pour le web.xml


<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE web-app

PUBLIC "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN"
"http://java.sun.com/dtd/web-app_2_3.dtd">
<web-app>
<display-name>portail Tapestry 5 Application</display-name>

<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath*:applicationContext-front.xml</param-value>
</context-param>
<context-param>
<!-- The only significant configuration for Tapestry 5, this informs Tapestry
of where to look for pages, components and mixins. -->
<param-name>tapestry.app-package</param-name>
<param-value>net.portail.web</param-value>
</context-param>

<filter>
<filter-name>app</filter-name>
<filter-class>org.apache.tapestry5.spring.TapestrySpringFilter</filter-class>
</filter>

<filter-mapping>
<filter-name>app</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
</web-app>