Changer de Méthodologie, Changer D'outils, Changer de Métier
Changer de Méthodologie, Changer D'outils, Changer de Métier
Changer de Méthodologie, Changer D'outils, Changer de Métier
ou
Changer de méthodologie, changer d’outils, changer de métier
Pascal Aubry
IFSIC / Université de Rennes 1
Campus de Beaulieu – 35042 RENNES Cedex
Pascal.aubry univ-rennes1.fr
Logique applicative
1 Fédérer les développements
Si l’objectif opérationnel du consortium ESUP-Portail [1] Logique métier
était de fournir une solution logicielle pour le déploiement
de portails dans les universités, l’objectif organisationnel,
sous-jacent, était de fédérer les efforts de développement Accès aux données Accès aux services
dans la communauté de l’Enseignement Supérieur
Français.
Dès le début du projet (en 2002), la coordination technique
du consortium a, après analyse des solutions de
développements disponibles, émis des recommandations Bases de données Autres sources
concernant les formats d’échange, les plateformes, les
outils et les méthodes de développement. L’objectif était La couche présentation gère le rendu à l’utilisateur,
l’uniformisation des développements de la communauté sous une forme voulue par le client (textuelle pour les
pour : applications en ligne de commande, graphique pour les
clients dits « lourds », hypertexte pour les clients dits
– faciliter la prise en main et donc l’amélioration des « légers », …) ;
logiciels développés (contributions) ;
– La couche logique applicative est chargée des
– permettre une mobilité des développeurs entre les interactions entre l’utilisateur et l’applicatif, gérant
projets ; notamment les transitions entre les différents états de
– homogénéiser le déploiement des applications et réduire l’application ;
le spectre des compétences nécessaires pour les
exploitants.
1
Même si ces recommandations ont eu de réelles retombées, http://developers.sun.com/portalserver/reference/techart/jsr168 :
essentiellement en terme d’architecture et de formats Introducing Java Portlet Specifications: JSR 168 and JSR 286.
– La couche logique métier offre une API de gestion des XHTML
objets et procédures métier de l’application ;
– Enfin, les couches accès aux données et aux services Présentation (XSLT)
permettent les accès de bas niveau vers les couches
physiques.
XML
Dans une application dont la séparation en couches est bien
respectée, l’implémentation de chaque couche doit pouvoir Tout le reste ☺
être interchangée avec une autre implémentation, dès lors
que celle-ci respecte la même API.
Cette séparation en couches permet de séparer les tâches au
sein d’une équipe de développeurs. Les spécialistes du
rendu aux utilisateurs ne sont souvent pas les mêmes que
les spécialistes de l’accès aux données ; la programmation
en couches permet de limiter les connaissances nécessaires
lors d’un développement collaboratif. Ce point sera revu
ultérieurement. Bases de données Autres sources
Dans la pratique, beaucoup de nos applications sont peu
scrupuleuses en matière de séparation des couches : Le reste de l’application restait hélas noyé dans la masse
du code et l’adhérence entre la couche présentation et le
Application
reste de l’application était encore très importante : dans ce
modèle, les objets métiers n’étaient pas remontés jusqu’à la
couche présentation et le XML produit est souvent
dépendant de son utilisation.
Le premier pas vers cette séparation des couches est
naturellement l’utilisation d’un langage pour lequel la
notion d’interface est native, en l’occurrence Java. Notons
que l’utilisation de Java, si elle permet cette séparation en
Bases de données Autres sources couches, ne la garantit absolument pas. Une bonne
architecture logicielle demande un réel effort de la part des
Tout programmeur s’en convaincra aisément en analysant développeurs, d’autant moins contraignant qu’il est bien
ce petit exemple de programme PHP, qui en quelques compris.
lignes mélange présentation, logique applicative, logique
métier et accès aux données :
// logique applicative
3 Les choix techniques
if (!empty($_POST["userId"])) { 3.1 Portlet/servlet : même combat
// accès aux données
$c = DB::Connect( Le mode d’exécution standard des applications en
environnement J2EE est la servlet. Néanmoins, pour une
"mysql://user:passwd@host/db"); intégration directe dans le portail uPortal adopté par le
$res = $conn->Query( consortium ESUP-Portail comme base d’exécution des
"SELECT * FROM user WHERE id = '" applications, celles-ci étaient au début du projet
+ $_POST["userId"] + "'"); développées comme des canaux uPortal, c’est-à-dire des
$row = $res->FetchRow(
DB_FETCHMODE_ASSOC);
applications s’appuyant sur l’API uPortal.
// logique métier L’évolution actuelle des portails vers l’adoption de JSR-
$displayName = $row["display_name"]; 168 (et JSR-286 ultérieurement) amène naturellement les
// présentation développeurs à livrer leurs applications sous forme de
echo "Hello " . displayName . "!"; portlets. Il est cependant très intéressant de ne pas lier les
} applications avec leur mode d’exécution : nous ne
Dès le début du projet ESUP-Portail, la programmation de développons pas des servlets ou des portlets, mais plus
canaux s’appuyant sur l’API uPortal 2 avait forcé la simplement des applications, qui sont exécutées en tant que
séparation de la couche présentation, basée sur un moteur servlet ou portlet, selon l’environnement dans lequel elles
XSLT : sont déployées. D’autres modes d’exécution sont d’ailleurs
en passe d’être largement acceptés par notre communauté,
2
tel WSRP 3 .
http://www.uportal.org: Evolving portal implementations for
particpating universities and partners. Un objectif d’esup-commons était donc de dissocier ce qui
est de l’application de ce qui est de son mode de
déploiement, et de laisser ainsi le développeur se focaliser
sur l’application elle-même.
3
http://www.oasis-open.org : Web Services for Remote Portlets
Specification.
D’autres arguments militent vers cette flexibilité : Si le portage est simple, il est néanmoins nécessaire, et il
– même si une application doit être finalement livrée sous en résulte l’obligation de maintenir deux codes différents
forme d’une portlet, l’environnement de développement pour remplir notre objectif. C’est cette raison qui a amené
d’une servlet est beaucoup plus simple que celui les développeurs du projet esup-commons à choisir JSF
nécessaire pour une portlet (un portail, dans lequel la pour implémenter le MVC, car celui-ci est indépendant
portlet doit être publiée et accessible aux utilisateurs) ; du mode de déploiement. Les méthodes de transition des
contrôleurs renvoient en effet de simples chaînes de
– un exploitant peut, en installant une servlet, passer outre caractères :
les problèmes inhérents au mode d’exécution des
public class JsfController {
portlets, de leur publication et leur accessibilité ; public String callback() {
– la distribution des applications sous forme de quick- logger.info("returning hello view");
start, paquetages prêts à l’emploi et permettant return "hello";
l’installation rapide et le test d’applications, est très }
difficile à réaliser avec une portlet. Dans ce cas, }
l’utilisation d’une servlet, pré-installée dans un servlet et les transitions entre les états de l’application sont
container (tel Tomcat) rend la chose beaucoup plus externalisées dans des règles de navigation au format
simple. XML :
3.2 Le choix du MVC 4 : JSF <navigation-rule>
<from-view-id>anyView.jsp</from-view-id>
Un des objectifs fut donc, lors du choix du MVC, de faire <navigation-case>
en sorte que les applications écrites en s’appuyant sur <from-outcome>hello</from-outcome>
esup-commons puissent, par simple configuration, être <to-view-id>hello.jsp</to-view-id>
déployées tantôt comme des servlets, tantôt comme des </navigation-case>
portlets. </navigation-rule>
Dans le monde open-source berceau du projet ESUP- Ce choix crucial offre la possibilité, pour toute application
Portail, deux candidats naturels se dégageaient : Spring 5 et bâtie sur esup-commons, de spécifier le mode d’exécution
JSF 6 . seulement au moment où l’on déploie l’application, par
écriture de propriétés :
La différence essentielle entre les deux candidats tient au
# portlet deployment:
fait que le MVC de Spring est dépendant du mode de
deploy.type=portlet
déploiement : deploy.home=C:/uPortal/portlets
import org.springframework.web.servlet.*;
# servlet deployment:
public class ServletController deploy.type=servlet
implements Controller { deploy.home=C:/Tomcat/webapps
public ModelAndView handleRequest(
HttpServletRequest request, La possibilité de distribuer les applications sous forme de
HttpServletResponse response) quick-starts est native, simplifiant à l’extrême le travail de
throws ServletException, IOException { l’exploitant :
logger.info("returning hello view"); # quick-start deployment:
return new ModelAndView("hello.jsp"); quick-start=true
}
L’implémentation choisie de JSF est MyFaces 7 ,
}
implémentation libre de JSF du projet Apache.
Le contrôleur pour servlet montré ci-dessus peut être très
simplement transformé pour être déployé en portlet : 3.3 La gestion des beans : Spring
import org.springframework.web.portlet.*; Si JSF a été choisi pour le MVC, Spring n’en est pas pour
autant abandonné : depuis la version 2.0, Spring est la
public class ServletController
implements Controller {
référence en matière de gestion des beans dans le monde
public ModelAndView handleRequest( open-source.
PortletRequest request, Il apporte notamment une souplesse extrême dans la
PortletResponse response) configuration des applications, grâce à l’injection de
throws ServletException, IOException { données et de dépendances. Cette souplesse est
logger.info("returning hello view"); essentielle pour l’adaptation des applications à des
return new ModelAndView("hello.jsp"); configurations locales différentes de celles où l’application
} a été initialement développée.
}
La diffusion des applications au sein d’une communauté en
est d’autant améliorée qu’il est possible de modifier le
4
Modèle / Vue / Contrôler comportement d’une application par simple configuration,
5
http://www.springframework.com : Spring, the leading full- tout au moins sans modifier le code distribué. Cela
stack application framework.
6
http://java.sun.com/javaee/javaserverfaces : JavaServer Faces 7
Technology. http://myfaces.apache.org : MyFaces, the first free open
source Java Server Faces implementation.
prévient la création de branches dissidentes et facilite la 3.4.2 Sessions, transactions et exceptions
coopération (entraide, contributions) entre les exploitants
Du point de vue du développeur, la gestion des sessions
d’une même application.
aux bases de données et des exceptions est sans doute
3.4 L’accès aux données l’apport le plus important d’esup-commons. Le
développeur est complètement déchargé de cette partie
La séparation de la couche d’accès aux données est ingrate et délicate, implémentée sous le modèle one-
souvent la plus simple à appréhender pour le développeur session-per-request, la requête HTTP étant l’unité de
novice ; elle est aussi fondamentale pour pouvoir, par transaction.
simple configuration, changer la manière dont on accède
Nombreuses sont les applications qui interagissent avec
physiquement aux données.
plusieurs bases de données. On verra ainsi des applications
On pourra ainsi tantôt s’appuyer sur une base de données, qui stockent leurs données dans une base de données
tantôt sur un stockage dans des fichiers au format XML, propre, tout en accédant à une base de données
tantôt utiliser un annuaire LDAP, … Quelques applications institutionnelle (de type Harpège ou Apogée par exemple).
réalisées à partir d’esup-commons n’ont ainsi pas de esup-commons prend en charge ce cas de figure, grâce à la
connexion à une base de données. notion de magasin de bases de données.
Les bases de données étant néanmoins le moyen le plus
répandu pour l’accès physique aux données, esup- 4 Un projet de développeurs pour les
commons autorise l’utilisation de n’importe quel backend ;
des implémentations pour Hibernate 8 et Ibatis 9 sont ainsi développeurs et les exploitants
proposées. Il a d’ailleurs été montré comment une
application peut, par simple configuration, passer d’un 4.1 esup-commons aide les développeurs
backend Ibatis à un backend Hibernate (et inversement), Le projet esup-commons a été initié par des développeurs
montrant ainsi la souplesse extrême apportée par d’applications, dans le but d’aider les développeurs
l’injection de données et de dépendances de Spring. d’applications de la communauté ESUP-Portail. En effet,
Les choix techniques de base du projet esup-commons sont les contextes d’exécutions étant très semblables dans tous
résumés sur le schéma suivant : les établissements du consortium, les problèmes rencontrés
Requêtes web sont très souvent les mêmes.
Présentation
Prenons en exemple un problème rencontré par tous les
développeurs de canaux ou portlets, d’applications qui se
web
Logique applicative
électronique, quelque soit son but (information des
Logique métier utilisateurs, remontée d’alerte, …) est une opération dont
la longueur n’est pas négligeable. Ainsi, il est en général
Authentification
Données
impossible de demander à un canal d’envoyer plusieurs
data
Cache
portail
domain beans
LDAP
I18n
Accès
cache
LDAP
URLs
i18n