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>

lundi 28 mars 2011

Java / J2EE avec Spring (rappel)

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 …)

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

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();

}

}