Skip to content

HTTPS clone URL

Subversion checkout URL

You can clone with
or
.
Download ZIP
Tree: a62c12d362
Fetching contributors…

Cannot retrieve contributors at this time

418 lines (281 sloc) 14.014 kB
<!DOCTYPE html>
<!--[if IEMobile 7 ]><html class="no-js iem7"><![endif]-->
<!--[if lt IE 9]><html class="no-js lte-ie8"><![endif]-->
<!--[if (gt IE 8)|(gt IEMobile 7)|!(IEMobile)|!(IE)]><!--><html class="no-js" lang="en"><!--<![endif]-->
<head>
<meta charset="utf-8">
<title>Technique de controleurs entre Hibernate et Struts - Shiny happy people coding</title>
<meta name="author" content="Cyril Mougel">
<meta name="description" content="Dans un précédent <a
href="http://shingara.free.fr/blog/index.php/?2007/01/16/138-hibernate-et-les-
mappings">billet sur Hibernate et les mappings, &hellip;">
<!-- http://t.co/dKP3o1e -->
<meta name="HandheldFriendly" content="True">
<meta name="MobileOptimized" content="320">
<meta name="viewport" content="width=device-width, initial-scale=1">
<link rel="canonical" href="http://blog.shingara.fr/technique-de-controleurs-entre-hibernate-et-struts.html">
<link href="/favicon.png" rel="icon">
<link href="/stylesheets/screen.css" media="screen, projection" rel="stylesheet" type="text/css">
<script src="/javascripts/modernizr-2.0.js"></script>
<script src="/javascripts/ender.js"></script>
<script src="/javascripts/octopress.js" type="text/javascript"></script>
<link href="/atom.xml" rel="alternate" title="Shiny happy people coding" type="application/atom+xml">
<!--Fonts from Google"s Web font directory at http://google.com/webfonts -->
<link href="http://fonts.googleapis.com/css?family=PT+Serif:regular,italic,bold,bolditalic" rel="stylesheet" type="text/css">
<link href="http://fonts.googleapis.com/css?family=PT+Sans:regular,italic,bold,bolditalic" rel="stylesheet" type="text/css">
<script type="text/javascript">
var _gaq = _gaq || [];
_gaq.push(['_setAccount', 'UA-11352302-1']);
_gaq.push(['_trackPageview']);
(function() {
var ga = document.createElement('script'); ga.type = 'text/javascript'; ga.async = true;
ga.src = ('https:' == document.location.protocol ? 'https://ssl' : 'http://www') + '.google-analytics.com/ga.js';
var s = document.getElementsByTagName('script')[0]; s.parentNode.insertBefore(ga, s);
})();
</script>
</head>
<body >
<header role="banner"><hgroup>
<h1><a href="/">Shiny happy people coding</a></h1>
<h2>Codons avec le sourire</h2>
</hgroup>
</header>
<nav role="navigation"><ul class="subscription" data-subscription="rss">
<li><a href="/atom.xml" rel="subscribe-rss" title="subscribe via RSS">RSS</a></li>
</ul>
<form action="http://google.com/search" method="get">
<fieldset role="search">
<input type="hidden" name="q" value="site:blog.shingara.fr" />
<input class="search" type="text" name="q" results="0" placeholder="Search"/>
</fieldset>
</form>
<ul class="main-navigation">
<li><a href="/">Blog</a></li>
<li><a href="/blog/archives">Archives</a></li>
</ul>
</nav>
<div id="main">
<div id="content">
<div>
<article class="hentry" role="article">
<header>
<h1 class="entry-title">Technique de controleurs entre Hibernate et Struts</h1>
<p class="meta">
<time datetime="2007-03-07T00:00:00+01:00" pubdate data-updated="true">Mar 7<span>th</span>, 2007</time>
| <a href="#disqus_thread">Comments</a>
</p>
</header>
<div class="entry-content"><p>
Dans un précédent <a
href="http://shingara.free.fr/blog/index.php/?2007/01/16/138-hibernate-et-les-
mappings">billet sur Hibernate et les mappings</a>, je me posais la question de
savoir comment séparer au maximum chaques fonctions dans une application J2EE
utilisant <a href="http://www.hibernate.org/">Hibernate</a> et <a href="http://struts.apache.org/">Struts</a>. Voici donc la
technique que j&#8217;ai fini par adopter, après réflexion. Cette technique est ma
propre technique et n&#8217;est peut-être pas la meilleure.
</p>
<h1>Contexte</h1>
<p>
Dans une application J2EE utilisant Hibernate et Struts, nous utilisons
classiquement 3 composants:
</p>
<ul>
<li>Les mappings Hibernate</li>
<li>Les DAO (Database Access Object) pour toutes les communications à la
base de donnée</li>
<li>Les actions Struts pour la gestion des requêtes HTTP de
l&#8217;utilisateur</li>
</ul>
<p>
Mais voilà avec ces 3 composants, les actions struts doivent utiliser
les mappings Hibernate et les DAO. les DAO eux devront utiliser les
mappings. Comme indiqué dans le schéma suivant :</p>
<p><img src="/blog/images/DAO-MAPPING-STRUTS.png" alt="Graphique représentant la communication DAO, Mapping et Action Struts" /></p>
<p>Il manque donc un composant intermédiaire entre les DAO et les
mappings qui sera le composant à être utilisé par les actions Struts. ce
composant est appelé «Controleur».
</p>
<h1>Les controleurs</h1>
<p>
Le but du controleur est de faire la liaison entre le mapping Hibernate et
le DAO. En effet, le mapping doit être un objet le plus léger possible et
n&#8217;avoir en conséquence que des attributs et leurs getter/setter. Par contre, les
DAO ne stocke rien à part la Session de connection à la base de donnée. Ainsi
le controleur n&#8217;a pour seul champ privé obligatoire que le mapping. On peux
aussi lui adjoindre des données complémentaires qui seront issues de
contraintes annexes et ainsi augmenter les possibilités d&#8217;attribut interne à la
classe. Mais des méthodes de confort pourront aussi lui être ajoutées comme la
méthode classique du save() qui se chargera de sauvegarder le mapping Hibernate
dans la session du DAO. Il aura ainsi plusieurs constructeurs avec différentes
possibilités. Par contre, il faudra faire attention au getter/setter de attribut
qui ne sont pas issue du mapping et qui peuvent dépendre du constructeur. Une
bonne gestion des erreurs et à prévoir. Ce système permet ainsi l&#8217;utilisation
unique du controleur dans l&#8217;actions Struts. Celui-ci n&#8217;aura qu&#8217;à construire
l&#8217;objet et l&#8217;utiliser. L&#8217;action Struts n&#8217;aura plus aucun dialogue avec les
mappings et DAO. Comme montré sur le schéma suivant :</p>
<p><img src="/blog/images/DAO-MAPPING-STRUTS-CONTROLER.png" alt="Graphique représentant la communication DAO, Mapping, Action Struts et Controleur" /></p>
<h1>Cas des listes de mapping Hibernates</h1>
<p>
Dans certain cas, on veux avoir une information supplémentaire à un
mapping et pour cela on utiliser les controleurs. Mais cette information peux
nécessité un calcul. Hors, au niveau du DAO, nous ne récupérons qu&#8217;une liste
d&#8217;objet de
mapping. Pour ajouter des informations, il faudrait alors itérer sur tous les
éléments et leur ajouter les éléments voulus. Cette technique n&#8217;est pas optimum
dans le cas d&#8217;une utilisation partielle de la liste, comme avec l&#8217;utilisation de
<a href="http://displaytag.sourceforge.net/11/">Display Tag</a> qui n&#8217;affichera
pas toutes les lignes et créera une pagination. La
technique est donc de créer un objet héritant de ArrayList et de surcharger la
méthode get(int). Au moment de l&#8217;appel de cette méthode, nous ne renvoyons plus
de mapping, mais notre controleur se construit à partir d&#8217;une liste d&#8217;objet
mapping. Le calcul des informations supplémentaires ne se fera donc plus que
sur les objets réelement demandé et non sur tous les objets de la liste
initiale.
</p>
<h1>Pourquoi cette implémentation ?</h1>
<p>
Je voulais par cette méthode n&#8217;obtenir que des objets le plus léger possible.
En effet, je préfére que mon programme utilise plus de petits objets que moins
d&#8217;objets, mais gros. Je voulais aussi que mes actions Struts soit le plus simple
possible à lire. Car sans l&#8217;utilisation de ce procédé, je me retrouvais avec
des actions comprenant énormément de ligne de code. Cette technique rend le
code plus simple à lire et à comprendre. Je voulais aussi effectuer les
traitements non nécessaire qu&#8217;à la fin pour ainsi permettre de n&#8217;effectuer que
le nécessaire et éviter ainsi le superflu.
</p>
<p>Pour les curieux, j&#8217;ai fait mes graphiques grâce à Graphivz que je ne maitrise hélas pas trop. Vous pouvez trouver les sources des scripts de création <a href="/exportation/script/dot/">ici</a></p>
</div>
<footer>
<p class="meta">
<span class="byline author vcard">Posted by <span class="fn">Cyril Mougel</span></span>
<time datetime="2007-03-07T00:00:00+01:00" pubdate data-updated="true">Mar 7<span>th</span>, 2007</time>
</p>
<div class="sharing">
<a href="http://twitter.com/share" class="twitter-share-button" data-url="http://blog.shingara.fr/technique-de-controleurs-entre-hibernate-et-struts.html" data-via="shingara" data-counturl="http://blog.shingara.fr/technique-de-controleurs-entre-hibernate-et-struts.html" >Tweet</a>
<div class="g-plusone" data-size="medium"></div>
<div class="fb-like" data-send="true" data-width="450" data-show-faces="false"></div>
</div>
<p class="meta">
<a class="basic-alignment left" href="/rubyforge-accepte-mon-whois.html" title="Previous Post: RubyForge accepte mon Whois">&laquo; RubyForge accepte mon Whois</a>
<a class="basic-alignment right" href="/pizza-on-rails-premie%CC%80re-a%CC%80-lille.html" title="Next Post: Pizza On Rails première à Lille">Pizza On Rails première à Lille &raquo;</a>
</p>
</footer>
</article>
</div>
<aside class="sidebar">
<section>
<h1>Recent Posts</h1>
<ul id="recent_posts">
<li class="post">
<a href="/pourquoi-jai-arrete-decent-exposure.html">pourquoi j'ai arrêté decent_exposure</a>
</li>
<li class="post">
<a href="/tester-ses-vues-rabl.html">tester ses vues rabl</a>
</li>
<li class="post">
<a href="/vundle-ou-le-bundler-de-vim.html">vundle ou le bundler de vim</a>
</li>
<li class="post">
<a href="/dante-pour-mettre-du-daemon-dans-son-code.html">dante pour mettre du daemon dans son code</a>
</li>
<li class="post">
<a href="/moped-le-nouveau-driver-mongodb-pour-ruby.html">moped le nouveau driver mongodb pour ruby</a>
</li>
<li class="post">
<a href="/quiet-assets-le-limiteur-de-log.html">Quiet Assets le gem qui limite les logs</a>
</li>
<li class="post">
<a href="/telecharger-fichier-de-basecamp.html">Récupération de ses fichiers sur basecamp</a>
</li>
<li class="post">
<a href="/translate-on-mongoid.html">Localize avec mongoid</a>
</li>
<li class="post">
<a href="/mailtrap-l-aide-au-staging.html">Mailtrap l'aide au staging</a>
</li>
<li class="post">
<a href="/une-journee-dediee-i-mongodb.html">Une journée dédiée à MongoDB</a>
</li>
</ul>
</section>
<section>
<h1>GitHub Repos</h1>
<ul id="gh_repos">
<li class="loading">Status updating...</li>
</ul>
<a href="https://github.com/shingara">@shingara</a> on GitHub
<script type="text/javascript">
$.domReady(function(){
if (!window.jXHR){
var jxhr = document.createElement('script');
jxhr.type = 'text/javascript';
jxhr.src = '/javascripts/libs/jXHR.js';
var s = document.getElementsByTagName('script')[0];
s.parentNode.insertBefore(jxhr, s);
}
github.showRepos({
user: 'shingara',
count: 10,
skip_forks: false,
target: '#gh_repos'
});
});
</script>
<script src="/javascripts/github.js" type="text/javascript"> </script>
</section>
<section>
<h1>Latest Tweets</h1>
<ul id="tweets">
<li class="loading">Status updating...</li>
</ul>
<script type="text/javascript">
$.domReady(function(){
getTwitterFeed("shingara", 4, false);
});
</script>
<script src="/javascripts/twitter.js" type="text/javascript"> </script>
<a href="http://twitter.com/shingara" class="twitter-follow-button" data-show-count="true">Follow @shingara</a>
</section>
</aside>
</div>
</div>
<footer role="contentinfo"><p>
Copyright &copy; 2012 - Cyril Mougel -
<span class="credit">Powered by <a href="http://octopress.org">Octopress</a></span>
</p>
</footer>
<script type="text/javascript">
var disqus_shortname = 'shinydevblog';
var disqus_script = 'count.js';
(function () {
var dsq = document.createElement('script'); dsq.type = 'text/javascript'; dsq.async = true;
dsq.src = 'http://' + disqus_shortname + '.disqus.com/' + disqus_script;
(document.getElementsByTagName('head')[0] || document.getElementsByTagName('body')[0]).appendChild(dsq);
}());
</script>
<div id="fb-root"></div>
<script>(function(d, s, id) {
var js, fjs = d.getElementsByTagName(s)[0];
if (d.getElementById(id)) {return;}
js = d.createElement(s); js.id = id;
js.src = "//connect.facebook.net/en_US/all.js#appId=212934732101925&xfbml=1";
fjs.parentNode.insertBefore(js, fjs);
}(document, 'script', 'facebook-jssdk'));</script>
<script type="text/javascript">
(function() {
var script = document.createElement('script'); script.type = 'text/javascript'; script.async = true;
script.src = 'https://apis.google.com/js/plusone.js';
var s = document.getElementsByTagName('script')[0]; s.parentNode.insertBefore(script, s);
})();
</script>
<script type="text/javascript">
(function(){
var twitterWidgets = document.createElement('script');
twitterWidgets.type = 'text/javascript';
twitterWidgets.async = true;
twitterWidgets.src = 'http://platform.twitter.com/widgets.js';
document.getElementsByTagName('head')[0].appendChild(twitterWidgets);
})();
</script>
</body>
</html>
Jump to Line
Something went wrong with that request. Please try again.