<?xml version="1.0" encoding="UTF-8"?><!-- generator="wordpress.com" -->
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	>

<channel>
	<title>jsf-myfaces &amp;laquo; WordPress.com Tag Feed</title>
	<link>http://en.wordpress.com/tag/jsf-myfaces/</link>
	<description>Feed of posts on WordPress.com tagged "jsf-myfaces"</description>
	<pubDate>Sun, 29 Nov 2009 01:48:47 +0000</pubDate>

	<generator>http://en.wordpress.com/tags/</generator>
	<language>en</language>

<item>
<title><![CDATA[Utilisation des messages d’erreur JSF :]]></title>
<link>http://mondossierweb.wordpress.com/2007/05/14/utilisation-des-messages-d%e2%80%99erreur-jsf/</link>
<pubDate>Mon, 14 May 2007 13:52:08 +0000</pubDate>
<dc:creator>Charlie Dubois</dc:creator>
<guid>http://mondossierweb.wordpress.com/2007/05/14/utilisation-des-messages-d%e2%80%99erreur-jsf/</guid>
<description><![CDATA[Jusqu’à aujourd’hui les erreurs possibles lors du remplissage des trois formulaires de l’application]]></description>
<content:encoded><![CDATA[<div class='snap_preview'><p class="MsoNormal">Jusqu’à aujourd’hui les erreurs possibles lors du remplissage des trois formulaires de l’application étaient gérées ‘manuellement’. Le contrôleur vérifiait les paramètres renseignés, et construisait un message d’erreur ainsi qu’un booléen ‘erreur’ en attribut. Puis on vérifiait, dans la page xhtml, la valeur du booléen ‘erreur’ : si il était ‘vrai’ on affichait le message en rouge.</p>
<p class="MsoNormal">&#160;</p>
<p class="MsoNormal">Tout ceci a été modifié afin d’utiliser les fonctionnalités offertes par JSF. Grâce à cela, la méthode du contrôleur qui vérifie les champs est moins complexe car elle contient moins de boucle ‘if’ imbriquées (nécessaires à la construction d’un message d’erreur présentable dans une seule ‘String’) et la page xhtml voit ces trois lignes de code (contenant la condition d’affichage du message d’erreur dans un attribut ‘rendered’) nécessaire au message d’erreur simplifiées en une seule, très courte. De plus le contrôleur n’a plus besoin d’avoir les variables ‘String message’ et ‘boolean erreur’ en attribut car la page xhtml n’a plus besoin d’y accéder.</p>
<p class="MsoNormal">&#160;</p>
<p class="MsoNormal"><strong>Voici un exemple du code obtenu pour un formulaire simple (1 seul champ):</strong></p>
<p class="MsoNormal"><u>La méthode du contrôleur :</u></p>
<p class="MsoNormal">
<table>
<tr>
<td bgcolor="#c0c0c0">
<p class="MsoNormal"><font size="1"><strong><span>public String chercher() {</span></strong></font></p>
<p class="MsoNormal"><font size="1"><strong><span> </span></strong></font></p>
<p class="MsoNormal"><font size="1"><strong><span><span>                        </span>String message = &#8220;&#8221;;</span></strong></font></p>
<p class="MsoNormal"><font size="1"><strong><span><span>                        </span>if (codetu != null &#38;&#38; !codetu.equals(&#8220;&#8221;)) {</span></strong></font></p>
<p class="MsoNormal"><font size="1"><strong><span><span>                                   </span>String codindetu = service.getCodIndFromCodEtu(codetu);</span></strong></font></p>
<p class="MsoNormal"><font size="1"><strong><span><span>                                   </span>if (codindetu != null) {</span></strong></font></p>
<p class="MsoNormal"><font size="1"><strong><span><span>                                               </span>return etatcivilcontroller.lienEnterNumero(codindetu);</span></strong></font></p>
<p class="MsoNormal"><font size="1"><strong><span><span>                                   </span></span>} </strong></font></p>
<p class="MsoNormal"><font size="1"><strong><span>                                   </span><em>message = &#8220;Etudiant &#8221; + codetu + &#8221; inexistant&#8221;;</em></strong></font></p>
<p class="MsoNormal" style="margin-left:106.2pt;text-indent:0.3pt;"><em><font size="1"><strong><span>FacesMessage messageX = new FacesMessage(FacesMessage.SEVERITY_ERROR, message, message);</span></strong></font></em></p>
<p class="MsoNormal"><em><font size="1"><strong><span><span>            </span><span>          </span><span>              </span></span>FacesContext.getCurrentInstance().addMessage(null, messageX);</strong></font></em></p>
<p class="MsoNormal"><font size="1"><strong><span>                                   </span></strong></font></p>
<p class="MsoNormal"><font size="1"><strong><span>                        </span>} else {</strong></font></p>
<p class="MsoNormal"><font size="1"><strong><span>                                   </span><em>message = &#8220;Veuillez rentrer un identifiant.&#8221;;</em></strong></font></p>
<p class="MsoNormal"><em><font size="1"><strong><span>                                   </span></strong><strong><span>FacesMessage messageX = new FacesMessage(FacesMessage.SEVERITY_ERROR, message, message);</span></strong></font></em></p>
<p class="MsoNormal"><em><font size="1"><strong><span><span>            </span></span>FacesContext.getCurrentInstance().addMessage(null, messageX);</strong></font></em></p>
<p class="MsoNormal"><font size="1"><strong><span>             </span></strong></font></p>
<p class="MsoNormal"><font size="1"><strong><span>                        </span>}</strong></font></p>
<p class="MsoNormal"><font size="1"><strong><span>                        </span>return View.CHERCHE_NUM;</strong></font></p>
<p class="MsoNormal"><font size="1"><strong> </strong></font></p>
<p class="MsoNormal"><font size="1"><strong> </strong></font></p>
<p class="MsoNormal"><font size="1"><strong><span>            </span>}</strong></font></p>
<p class="MsoNormal"><font size="1"> </font></p>
<p class="MsoNormal"><font size="1"> </font></p>
</td>
</tr>
</table>
<p class="MsoNormal"><u>L’affichage du message d’erreur dans page xhtml :</u></p>
<p class="MsoNormal">&#160;</p>
<p class="MsoNormal">
<table>
<tr>
<td bgcolor="#c0c0c0">
<p class="MsoNormal"><font size="1"><strong><span>&#60;h:form id=&#8221;formRechDossierWeb&#8221;&#62;</span></strong></font></p>
<p class="MsoNormal"><em><font size="1"><strong><span>&#60;h:messages id=&#8221;champMessages&#8221; errorStyle=&#8221;color: red&#8221;<span>  </span>/&#62;</span></strong></font></em></p>
<p class="MsoNormal"><font size="1"><strong>…</strong></font></p>
<p class="MsoNormal"><font size="1"> </font></p>
</td>
</tr>
</table>
<p class="MsoNormal">Et voici le résultat pour un formulaire un peu plus complexe (3 champs) :</p>
<p class="MsoNormal"> <a href="http://mondossierweb.files.wordpress.com/2007/05/messageserreur.jpg" title="Messages d’erreur"><img src="/files/2007/05/messageserreur.thumbnail.jpg" alt="Messages d’erreur" /></a></p>
<p class="MsoNormal">&#160;</p>
</div>]]></content:encoded>
</item>
<item>
<title><![CDATA[Téléchargement de fichiers (servlet et portlet)]]></title>
<link>http://mondossierweb.wordpress.com/2007/04/19/telechargement-de-fichiers-servlet-et-portlet/</link>
<pubDate>Thu, 19 Apr 2007 07:44:58 +0000</pubDate>
<dc:creator>Charlie Dubois</dc:creator>
<guid>http://mondossierweb.wordpress.com/2007/04/19/telechargement-de-fichiers-servlet-et-portlet/</guid>
<description><![CDATA[MonDossierWeb doit proposé de télécharger des fichier excel et pdf : trombinoscope d’une liste d’étu]]></description>
<content:encoded><![CDATA[<div class='snap_preview'><p class="MsoNormal">MonDossierWeb doit proposé de télécharger des fichier excel et pdf : trombinoscope d’une liste d’étudiants en pdf, une liste d’inscrits en excel, etc.</p>
<p class="MsoNormal">Ces fichiers doivent être générés ( par un ‘controller’ par exemple) au moment du téléchargement.</p>
<p class="MsoNormal">Au départ nous avions réussi à faire un téléchargement pour le fonctionnement en servlet. Il fonctionnait de la manière suivante :</p>
<table>
<tr>
<td bgcolor="#c0c0c0">
<p class="MsoNormal"><font size="1"><strong>//récupération de l’objet ‘HttpServletResponse’</strong></font></p>
<p class="MsoNormal"><font size="1"><strong>FacesContext context = FacesContext.getCurrentInstance();</strong></font></p>
<p class="MsoNormal"><font size="1"><strong>ExternalContext external = context.getExternalContext();</strong></font></p>
<p class="MsoNormal"><font size="1"><strong>HttpServletResponse response = (HttpServletResponse) external.getResponse();</strong></font></p>
<p class="MsoNormal"><font size="1"><strong> </strong></font></p>
<p class="MsoNormal"><font size="1"><strong>//formatage de la réponse</strong></font></p>
<p class="MsoNormal"><font size="1"><strong><span>response.setContentType(&#8220;application/octet-stream&#8221;);</span></strong></font></p>
<p class="MsoNormal"><font size="1"><strong><span>response.setHeader (&#8220;Content-Disposition&#8221;, &#8220;attachment; filename=\&#8221;test.xls\&#8221;" );</span></strong></font></p>
<p class="MsoNormal"><font size="1"><strong><span>ByteArrayOutputStream baos = new ByteArrayOutputStream(1024);</span></strong></font></p>
<p class="MsoNormal"><font size="1"><strong><span> </span></strong></font></p>
<p class="MsoNormal"><font size="1"><strong><span>//création du fichier excel</span></strong></font></p>
<p class="MsoNormal"><font size="1"><strong><span>HSSFWorkbook wb=creerExcel();</span></strong></font></p>
<p class="MsoNormal"><font size="1"><strong><span> </span></strong></font></p>
<p class="MsoNormal"><font size="1"><strong>// Ecriture du fichier dans l&#8217;outputstream de la réponse </strong></font></p>
<p class="MsoNormal"><font size="1"><strong><span>ServletOutputStream out;</span></strong></font></p>
<p class="MsoNormal"><font size="1"><strong><span>try {</span></strong></font></p>
<p class="MsoNormal"><font size="1"><strong><span><span>            </span>out = response.getOutputStream();</span></strong></font></p>
<p class="MsoNormal"><font size="1"><strong><span><span>            </span>wb.write(baos);</span></strong></font></p>
<p class="MsoNormal"><font size="1"><strong><span><span>            </span>baos.writeTo(out);</span></strong></font></p>
<p class="MsoNormal"><font size="1"><strong><span><span>            </span>baos.flush();</span></strong></font></p>
<p class="MsoNormal" style="text-indent:35.4pt;"><font size="1"><strong>//on ‘courcircuite’ le cycle de vie JSF :</strong></font></p>
<p class="MsoNormal"><font size="1"><strong><span>            </span>context.responseComplete();</strong></font></p>
<p class="MsoNormal"><font size="1"><strong>} catch (IOException e) {</strong></font></p>
<p class="MsoNormal"><font size="1"><strong><span>            </span>e.printStackTrace();</strong></font></p>
<p class="MsoNormal"><font size="1"><strong>}</strong></font></p>
<p class="MsoNormal"><font size="1"><strong> </strong></font></p>
</td>
</tr>
</table>
<p class="MsoNormal">Evidemment cette méthode de fonctionne pas en portlet car on ne peut récupérer l’objet ‘HttpServletResponse’. Il a donc fallu trouver une autre solution.</p>
<p class="MsoNormal">Il s’avère en fait que le téléchargement de fichiers placés dans la ‘response’ est impossible en portlet. La solution est donc de passer par une servlet. Nous avons l’avantage d’utiliser esup-commons, qui propose une telle servlet : « DownloadServlet ». Voici comment cela fonctionne en portlet :</p>
<table>
<tr>
<td bgcolor="#c0c0c0">
<p class="MsoNormal"><font size="1"><strong>//récupération de la session :</strong></font></p>
<p class="MsoNormal"><font size="1"><strong>FacesContext context = FacesContext.getCurrentInstance();</strong></font></p>
<p class="MsoNormal"><font size="1"><strong>ExternalContext external = context.getExternalContext();</strong></font></p>
<p class="MsoNormal"><font size="1"><strong>ActionRequest request = (ActionRequest) external.getRequest();</strong></font></p>
<p class="MsoNormal"><font size="1"><strong><span>PortletSession sessionp = request.getPortletSession();</span></strong></font></p>
<p class="MsoNormal"><font size="1"><strong><span>try {</span></strong></font></p>
<p class="MsoNormal"><font size="1"><strong><span><span>            </span>ByteArrayOutputStream baos = new ByteArrayOutputStream(1024);</span></strong></font></p>
<p class="MsoNormal"><font size="1"><strong><span> </span></strong></font></p>
<p class="MsoNormal" style="margin-left:35.4pt;"><font size="1"><strong><span>//création du fichier excel:</span></strong></font></p>
<p class="MsoNormal"><font size="1"><strong><span><span>            </span>HSSFWorkbook wb=creerExcel();</span></strong></font></p>
<p class="MsoNormal"><font size="1"><strong><span> </span></strong></font></p>
<p class="MsoNormal"><font size="1"><strong><span><span>            </span></span>//récupération du fichier en tableau de bytes</strong></font></p>
<p class="MsoNormal"><font size="1"><strong><span>            </span></strong><strong><span>wb.write(baos);</span></strong></font></p>
<p class="MsoNormal"><font size="1"><strong><span><span>            </span>byte[] bytes=baos.toByteArray();</span></strong></font></p>
<p class="MsoNormal"><font size="1"><strong><span> </span></strong></font></p>
<p class="MsoNormal"><font size="1"><strong><span><span>            </span></span>//on place le tableau de bytes dans la session :</strong></font></p>
<p class="MsoNormal"><font size="1"><strong><span>            </span></strong><strong><span>sessionp.setAttribute(&#8220;downloadData&#8221;, bytes, PortletSession.APPLICATION_SCOPE);</span></strong></font></p>
<p class="MsoNormal"><font size="1"><strong><span><span>            </span></span>//on renseigne le ‘contenttype’ dans la session :</strong></font></p>
<p class="MsoNormal"><font size="1"><strong><span>            </span></strong><strong><span>sessionp.setAttribute(&#8220;downloadContentType&#8221;, &#8220;application/octet-stream&#8221;, PortletSession.APPLICATION_SCOPE);</span></strong></font></p>
<p class="MsoNormal"><font size="1"><strong><span><span>            </span></span>//on place le nom du fichier dans la session :</strong></font></p>
<p class="MsoNormal"><font size="1"><strong><span>            </span></strong><strong><span>sessionp.setAttribute(&#8220;downloadFilename&#8221;, &#8220;test.xls&#8221;, PortletSession.APPLICATION_SCOPE);</span></strong></font></p>
<p class="MsoNormal"><font size="1"><strong><span> </span></strong></font></p>
<p class="MsoNormal"><font size="1"><strong><span><span>            </span></span>//on redirige vers la servlet:</strong></font></p>
<p class="MsoNormal"><font size="1"><strong><span>            </span></strong><strong><span>external.redirect(external.getRequestContextPath() + &#8220;/download&#8221;);</span></strong></font></p>
<p class="MsoNormal"><font size="1"><strong><span>} catch (DownloadException e) {</span></strong></font></p>
<p class="MsoNormal"><font size="1"><strong><span><span>            </span>e.printStackTrace();</span></strong></font></p>
<p class="MsoNormal"><font size="1"><strong><span>} catch (IOException e) {</span></strong></font></p>
<p class="MsoNormal"><font size="1"><strong><span><span>            </span>e.printStackTrace();</span></strong></font></p>
<p class="MsoNormal"><font size="1"><strong>}</strong></font></p>
<p class="MsoNormal"><font size="1"><strong> </strong></font></p>
<p class="MsoNormal"><font size="1"><strong>//on ‘courcircuite’ le cycle de vie JSF :</strong></font></p>
<p class="MsoNormal"><font size="1"><strong>context.responseComplete();</strong></font></p>
</td>
</tr>
</table>
<p class="MsoNormal">Evidemment il faut auparavant déclarer la servlet dans le web.xml :</p>
<table>
<tr>
<td bgcolor="#c0c0c0">
<p class="MsoNormal"><font size="1"><strong><span>&#60;servlet&#62;</span></strong></font></p>
<p class="MsoNormal"><font size="1"><strong><span><span>            </span>&#60;servlet-name&#62;Download Servlet&#60;/servlet-name&#62;</span></strong></font></p>
<p class="MsoNormal"><font size="1"><strong><span><span>            </span>&#60;servlet-class&#62;</span></strong></font></p>
<p class="MsoNormal"><font size="1"><strong><span><span>                        </span>org.esupportail.commons.web.servlet.DownloadServlet</span></strong></font></p>
<p class="MsoNormal"><font size="1"><strong><span><span>            </span>&#60;/servlet-class&#62;</span></strong></font></p>
<p class="MsoNormal"><font size="1"><strong><span>&#60;/servlet&#62;</span></strong></font></p>
<p class="MsoNormal"><font size="1"><strong><span>&#60;servlet-mapping&#62;</span></strong></font></p>
<p class="MsoNormal"><font size="1"><strong><span><span>            </span>&#60;servlet-name&#62;Download Servlet&#60;/servlet-name&#62;</span></strong></font></p>
<p class="MsoNormal"><font size="1"><strong><span><span>            </span>&#60;url-pattern&#62;/download&#60;/url-pattern&#62;</span></strong></font></p>
<p class="MsoNormal"><font size="1"><strong><span>&#60;/servlet-mapping&#62;</span></strong></font></p>
</td>
</tr>
</table>
<p class="MsoNormal"><span> </span></p>
<p class="MsoNormal">Voici maintenant le fonctionnement de la servlet :</p>
<table>
<tr>
<td bgcolor="#c0c0c0">
<p class="MsoNormal"><font size="1"><strong><span>public void service(final ServletRequest servletRequest, </span></strong></font></p>
<p class="MsoNormal" style="margin-left:70.8pt;text-indent:35.4pt;"><font size="1"><strong><span>final ServletResponse servletResponse) throws ServletException {</span></strong></font></p>
<p class="MsoNormal"><font size="1"><strong><span> </span></strong></font></p>
<p class="MsoNormal"><font size="1"><strong><span>HttpServletRequest request = (HttpServletRequest) servletRequest;</span></strong></font></p>
<p class="MsoNormal"><font size="1"><strong><span>HttpServletResponse response = (HttpServletResponse) servletResponse;</span></strong></font></p>
<p class="MsoNormal"><font size="1"><strong><span>try {</span></strong></font></p>
<p class="MsoNormal"><font size="1"><strong><span> </span></strong></font></p>
<p class="MsoNormal"><font size="1"><strong><span><span>            </span>//récupération du contenttype</span></strong></font></p>
<p class="MsoNormal"><font size="1"><strong><span><span>            </span>String contentType = (String) HttpUtils.getSessionAttribute(request, downloadContentType);</span></strong></font></p>
<p class="MsoNormal"><font size="1"><strong><span><span>                                   </span></span></strong></font></p>
<p class="MsoNormal"><font size="1"><strong><span><span>            </span>if (contentType != null) {</span></strong></font></p>
<p class="MsoNormal"><font size="1"><strong><span><span>                        </span>//formatage de la réponse</span></strong></font></p>
<p class="MsoNormal"><font size="1"><strong><span><span>                        </span>response.setContentType(contentType);</span></strong></font></p>
<p class="MsoNormal"><font size="1"><strong><span><span>            </span>}</span></strong></font></p>
<p class="MsoNormal"><font size="1"><strong><span><span>            </span></span></strong></font></p>
<p class="MsoNormal"><font size="1"><strong><span><span>            </span></span>//recuperation du nom du fichier<span>      </span></strong></font></p>
<p class="MsoNormal"><font size="1"><strong><span>            </span></strong><strong><span>String filename = (String) HttpUtils.getSessionAttribute(request, downloadFilename);</span></strong></font></p>
<p class="MsoNormal"><font size="1"><strong><span><span>                                   </span></span></strong></font></p>
<p class="MsoNormal"><font size="1"><strong><span><span>            </span>if (filename != null) {</span></strong></font></p>
<p class="MsoNormal" style="margin-left:35.4pt;text-indent:35.4pt;"><font size="1"><strong>//formatage de la réponse</strong></font></p>
<p class="MsoNormal"><font size="1"><strong><span>            </span><span>            </span>response.setHeader(&#8220;Content-disposition&#8221;, &#8220;inline; filename=\&#8221;" + filename + &#8220;\&#8221;");</strong></font></p>
<p class="MsoNormal"><font size="1"><strong><span>            </span>}</strong></font></p>
<p class="MsoNormal"><font size="1"><strong><span>            </span></strong></font></p>
<p class="MsoNormal"><font size="1"><strong><span>            </span>//récupération du fichier sous forme d’un tableau de bytes<span>                      </span></strong></font></p>
<p class="MsoNormal"><font size="1"><strong><span>            </span></strong><strong><span>byte [] data = (byte []) HttpUtils.getSessionAttribute(request, downloadData);</span></strong></font></p>
<p class="MsoNormal"><font size="1"><strong><span><span>                                   </span></span></strong></font></p>
<p class="MsoNormal"><font size="1"><strong><span><span>            </span>if (data == null) {</span></strong></font></p>
<p class="MsoNormal"><font size="1"><strong><span><span>                        </span>throw new DownloadException(&#8220;data is null, can not download&#8221;);</span></strong></font></p>
<p class="MsoNormal"><font size="1"><strong><span><span>            </span>}</span></strong></font></p>
<p class="MsoNormal"><font size="1"><strong><span><span>            </span></span></strong></font></p>
<p class="MsoNormal"><font size="1"><strong><span><span>            </span></span>// Ecriture du fichier dans l&#8217;outputstream de la réponse </strong></font></p>
<p class="MsoNormal"><font size="1"><strong><span>            </span></strong><strong><span>response.setContentLength(data.length);</span></strong></font></p>
<p class="MsoNormal"><font size="1"><strong><span><span>            </span>ServletOutputStream out = response.getOutputStream();</span></strong></font></p>
<p class="MsoNormal"><font size="1"><strong><span><span>            </span>out.write(data);</span></strong></font></p>
<p class="MsoNormal"><font size="1"><strong><span> </span></strong></font></p>
<p class="MsoNormal"><font size="1"><strong><span>} catch (Exception e) {</span></strong></font></p>
<p class="MsoNormal"><font size="1"><strong><span><span>            </span>Exception de = new DownloadException(e);</span></strong></font></p>
<p class="MsoNormal"><font size="1"><strong><span><span>            </span>ExceptionUtils.catchException(getServletContext(), de, request);</span></strong></font></p>
<p class="MsoNormal"><font size="1"><strong><span><span>            </span>throw new ServletException(de);</span></strong></font></p>
<p class="MsoNormal"><font size="1"><strong><span>}</span></strong></font></p>
<p class="MsoNormal"><font size="1"><strong><span> </span></strong></font></p>
<p class="MsoNormal"><font size="1"><strong>}</strong></font></p>
</td>
</tr>
</table>
<p class="MsoNormal">Vous remarquerez que cette servlet utilise la méthode getSessionAttribute(HttpServletRequest request, String name)</p>
<p class="MsoNormal">de la classe HttpUtils. Voici son fonctionnement :</p>
<table>
<tr>
<td bgcolor="#c0c0c0">
<p class="MsoNormal"><font size="1"><strong><span>public static Object getSessionDownloadAttribute(final HttpServletRequest request, </span></strong></font></p>
<p class="MsoNormal" style="margin-left:283.2pt;text-indent:35.4pt;"><font size="1"><strong><span>final String name) {</span></strong></font></p>
<p class="MsoNormal"><font size="1"><strong><span><span>                        </span><br />
HttpSession session = request.getSession();<br />
if (session == null) {<br />
LOG.warn(&#8220;no session, can not get session attribute [" + name + "]&#8220;);<br />
return null;<br />
}</span></strong></font></p>
<p><font size="1"><strong>return session.getAttribute(name);<br />
</strong></font></p>
<p class="MsoNormal"><font size="1"><strong><span> </span></strong></font></p>
<p class="MsoNormal"><font size="1"><strong><span><span>            </span><span>            </span></span></strong></font></p>
<p class="MsoNormal"><font size="1"><strong><span><span>                        </span></span></strong></font></p>
<p class="MsoNormal"><font size="1"><strong>}</strong></font></p>
</td>
</tr>
</table>
<p class="MsoNormal">En fait, cette méthode va aller chercher l’attribut de session souhaité dans la request placée en paramètre.</p>
<p class="MsoNormal">Nous avons donc utilisé cette technique pour les deux types de contexte. Ainsi, le code décrit en début de Post pour le fonctionnement servlet devient :</p>
<table>
<tr>
<td bgcolor="#c0c0c0">
<p class="MsoNormal"><font size="1"><strong>//on récupère la session :</strong></font></p>
<p class="MsoNormal"><font size="1"><strong>FacesContext context = FacesContext.getCurrentInstance();</strong></font></p>
<p class="MsoNormal"><font size="1"><strong>ExternalContext external = context.getExternalContext();</strong></font></p>
<p class="MsoNormal"><font size="1"><strong>HttpServletRequest request = (HttpServletRequest) external.getRequest();</strong></font></p>
<p class="MsoNormal"><font size="1"><strong>HttpSession sessions = request.getSession();</strong></font></p>
<p class="MsoNormal"><font size="1"><strong> </strong></font></p>
<p class="MsoNormal"><font size="1"><strong>try {</strong></font></p>
<p class="MsoNormal"><font size="1"><strong><span>            </span></strong><strong><span>ByteArrayOutputStream baos = new ByteArrayOutputStream(1024);</span></strong></font></p>
<p class="MsoNormal"><font size="1"><strong><span> </span></strong></font></p>
<p class="MsoNormal"><font size="1"><strong><span><span>            </span>//creation du fichier:</span></strong></font></p>
<p class="MsoNormal"><font size="1"><strong><span><span>            </span>HSSFWorkbook wb=creerExcel();</span></strong></font></p>
<p class="MsoNormal"><font size="1"><strong><span> </span></strong></font></p>
<p class="MsoNormal"><font size="1"><strong><span><span>            </span></span>//récupération du fichier en tableau de bytes</strong></font></p>
<p class="MsoNormal"><font size="1"><strong><span>            </span></strong><strong><span>wb.write(baos);</span></strong></font></p>
<p class="MsoNormal"><font size="1"><strong><span><span>            </span>byte[] bytes=baos.toByteArray();</span></strong></font></p>
<p class="MsoNormal"><font size="1"><strong><span><span>            </span></span>//on place les informations nécessaire et le fichier en session:</strong></font></p>
<p class="MsoNormal" style="text-indent:35.4pt;"><font size="1"><strong><span>sessions.setAttribute(&#8220;downloadData&#8221;, bytes);</span></strong></font></p>
<p class="MsoNormal"><font size="1"><strong><span><span>            </span>sessions.setAttribute(&#8220;downloadContentType&#8221;, &#8220;application/octet-stream&#8221;);</span></strong></font></p>
<p class="MsoNormal"><font size="1"><strong><span><span>            </span>sessions.setAttribute(&#8220;downloadFilename&#8221;, &#8220;test.xls&#8221;);<span>  </span></span></strong></font></p>
<p class="MsoNormal"><font size="1"><strong><span> </span></strong></font></p>
<p class="MsoNormal"><font size="1"><strong><span><span>            </span>//redirection vers la servlet:</span></strong></font></p>
<p class="MsoNormal"><font size="1"><strong><span><span>            </span>external.redirect(external.getRequestContextPath() + &#8220;/download&#8221;);</span></strong></font></p>
<p class="MsoNormal"><font size="1"><strong><span>} catch (DownloadException e) {</span></strong></font></p>
<p class="MsoNormal"><font size="1"><strong><span><span>            </span>e.printStackTrace();</span></strong></font></p>
<p class="MsoNormal"><font size="1"><strong><span>} catch (IOException e) {</span></strong></font></p>
<p class="MsoNormal"><font size="1"><strong><span><span>            </span>e.printStackTrace();</span></strong></font></p>
<p class="MsoNormal"><font size="1"><strong>}</strong></font></p>
<p class="MsoNormal"><font size="1"><strong> </strong></font></p>
<p class="MsoNormal"><font size="1"><strong>//on ‘courcircuite’ le cycle de vie JSF :</strong></font></p>
<p class="MsoNormal"><font size="1"><strong>context.responseComplete();</strong></font></p>
</td>
</tr>
</table>
<p class="MsoNormal">Et voila. Il ne reste qu’à déterminer le ‘context’ (servlet ou portlet) au moment du téléchargement pour exécuter le bon bout de code.</p>
<p class="MsoNormal"><strong><u>ATTENTION :</u></strong> pour que cela fonctionne en portlet il faut impérativement penser à indiquer :</p>
<p class="MsoNormal"><strong> emptySessionPath=&#8221;true&#8221;</strong> dans la déclaration du &#8216;Connector&#8217; dans le server.xml de Tomcat. <u>Ex:</u></p>
<table>
<tr>
<td bgcolor="#c0c0c0"><font size="1"><br />
&#60;Connector port=&#8221;8080&#8243; maxHttpHeaderSize=&#8221;8192&#8243;<br />
maxThreads=&#8221;150&#8243; minSpareThreads=&#8221;25&#8243; maxSpareThreads=&#8221;75&#8243;<br />
enableLookups=&#8221;false&#8221; redirectPort=&#8221;8443&#8243; acceptCount=&#8221;100&#8243;<br />
connectionTimeout=&#8221;20000&#8243; disableUploadTimeout=&#8221;true&#8221;<br />
<strong> emptySessionPath=&#8221;true&#8221;</strong> /&#62; </font></td>
</tr>
</table>
<p>Sans cela la portlet et la servlet auront une Session différente et le code ne fonctionnera, générant probablement une erreur du type &#8220;can not download data is null&#8221;  (voir code de la DownloadServlet) ou  &#8220;prepare method was not called&#8221;</p>
</div>]]></content:encoded>
</item>
<item>
<title><![CDATA[Creation d'un fichier excel retourné (servlet)]]></title>
<link>http://mondossierweb.wordpress.com/2007/03/27/creation-dun-fichier-excel-retourne-servlet/</link>
<pubDate>Tue, 27 Mar 2007 08:14:04 +0000</pubDate>
<dc:creator>Charlie Dubois</dc:creator>
<guid>http://mondossierweb.wordpress.com/2007/03/27/creation-dun-fichier-excel-retourne-servlet/</guid>
<description><![CDATA[Après les tests pour générer du pdf, MonDossierWeb doit générer des fichier excel, nous avons testé ]]></description>
<content:encoded><![CDATA[<div class='snap_preview'><p class="MsoNormal">Après les tests pour générer du pdf, MonDossierWeb doit générer des fichier excel, nous avons testé POI. Apres quelques essais nous avons réussi à obtenir le résultat voulu grâce à la librairie POI. Voici comment sont implantées les choses :</p>
<p class="MsoNormal">Tout d’abord il faut penser à importer la librairie poi-2.5.1-final-20040804.jar disponible <a href="http://www.ibiblio.org/maven/poi/jars/">ici</a> dans le projet.</p>
<p class="MsoNormal">Puis, dans notre Controller qui contient (en attribut : nne, nom, dossier, annee etc.) les informations affichées à l’écran, nous ajoutons la méthode exportExcel():</p>
<p class="MsoNormal"><strong>public String exportExcel(){</strong></p>
<p>FacesContext context = FacesContext.getCurrentInstance();<br />
ExternalContext external = context.getExternalContext();<br />
HttpServletResponse response = (HttpServletResponse) external.getResponse();</p>
<p><strong>     //formatage de la réponse</strong><br />
response.setContentType(&#8220;application/octet-stream&#8221;);<br />
response.setHeader (&#8220;Content-Disposition&#8221;, &#8220;attachment; filename=\&#8221;test.xls\&#8221;" );<br />
ByteArrayOutputStream baos = new ByteArrayOutputStream(1024);</p>
<p><strong> //creation du fichier excel</strong><br />
HSSFWorkbook wb = new HSSFWorkbook();<br />
HSSFSheet sheet = wb.createSheet(&#8220;etat-civil&#8221; );</p>
<p><strong> //formatage taille de la premiere colonne</strong><br />
sheet.setColumnWidth((short)0,(short)(20*256));</p>
<p><strong>// Creation des colonnes</strong><br />
HSSFRow row     = sheet.createRow((short)0);<br />
HSSFRow row1     = sheet.createRow((short)1);<br />
HSSFRow row2     = sheet.createRow((short)2);<br />
HSSFRow row3     = sheet.createRow((short)3);<br />
HSSFRow row4     = sheet.createRow((short)4);<br />
HSSFRow row5     = sheet.createRow((short)5);<br />
HSSFRow row6     = sheet.createRow((short)6);<br />
HSSFRow row7     = sheet.createRow((short)7);</p>
<p><strong> //CREATION DES STYLES:<br />
//STYLE1:</strong><br />
HSSFCellStyle headerStyle = wb.createCellStyle();<br />
headerStyle.setFillBackgroundColor((short) HSSFColor.DARK_RED.index);<br />
headerStyle.setFillForegroundColor(HSSFColor.DARK_RED.index);<br />
headerStyle.setFillPattern(HSSFCellStyle.SOLID_FOREGROUND);<br />
HSSFFont font = wb.createFont();<br />
font.setColor(HSSFColor.WHITE.index);<br />
font.setBoldweight((short) 10);<br />
headerStyle.setFont(font);<br />
<strong>            //bordure style1</strong><br />
headerStyle.setBorderBottom(HSSFCellStyle.BORDER_MEDIUM);<br />
headerStyle.setBottomBorderColor(HSSFColor.BLACK.index);<br />
headerStyle.setBorderLeft(HSSFCellStyle.BORDER_MEDIUM);<br />
headerStyle.setLeftBorderColor(HSSFColor.BLACK.index);<br />
headerStyle.setBorderRight(HSSFCellStyle.BORDER_MEDIUM);<br />
headerStyle.setRightBorderColor(HSSFColor.BLACK.index);<br />
headerStyle.setBorderTop(HSSFCellStyle.BORDER_MEDIUM);<br />
headerStyle.setTopBorderColor(HSSFColor.BLACK.index);</p>
<p><strong>  //STYLE2:</strong><br />
HSSFCellStyle headerStyle2 = wb.createCellStyle();<br />
headerStyle2.setFillBackgroundColor((short) HSSFColor.BLUE.index);<br />
headerStyle2.setFillForegroundColor(HSSFColor.BLUE.index);<br />
headerStyle2.setFillPattern(HSSFCellStyle.SOLID_FOREGROUND);<br />
headerStyle2.setFont(font);<br />
<strong>      //bordure style2</strong><br />
headerStyle2.setBorderBottom(HSSFCellStyle.BORDER_MEDIUM);<br />
headerStyle2.setBottomBorderColor(HSSFColor.BLACK.index);<br />
headerStyle2.setBorderLeft(HSSFCellStyle.BORDER_MEDIUM);<br />
headerStyle2.setLeftBorderColor(HSSFColor.BLACK.index);<br />
headerStyle2.setBorderRight(HSSFCellStyle.BORDER_MEDIUM);<br />
headerStyle2.setRightBorderColor(HSSFColor.BLACK.index);<br />
headerStyle2.setBorderTop(HSSFCellStyle.BORDER_MEDIUM);<br />
headerStyle2.setTopBorderColor(HSSFColor.BLACK.index);</p>
<p><strong>//Creation des cellules</strong><br />
HSSFCell cellLib = row.createCell((short) 0);<br />
cellLib.setCellStyle(headerStyle);<br />
cellLib.setCellValue(&#8220;ETAT-CIVIL&#8221; );</p>
<p>HSSFCell cellLib2 = row1.createCell((short) 0);<br />
cellLib2.setCellStyle(headerStyle2);<br />
cellLib2.setCellValue(&#8220;GENERALITES&#8221; );</p>
<p>row2.createCell((short)0).setCellValue(&#8220;Dossier &#8220;);<br />
row2.createCell((short)1).setCellValue(dossier);<br />
row3.createCell((short)0).setCellValue(&#8220;NNE &#8220;);<br />
row3.createCell((short)1).setCellValue(nne);<br />
row4.createCell((short)0).setCellValue(&#8220;Nom &#8220;);<br />
row4.createCell((short)1).setCellValue(nom);</p>
<p>HSSFCell cellLib3 = row5.createCell((short) 0);<br />
cellLib3.setCellStyle(headerStyle2);<br />
cellLib3.setCellValue(&#8220;INSCRIPTION UNIVERSITAIRE&#8221; );</p>
<p>row6.createCell((short)0).setCellValue(&#8220;Anee &#8220;);<br />
row6.createCell((short)1).setCellValue(annee);<br />
row7.createCell((short)0).setCellValue(&#8220;Etablissement &#8220;);<br />
row7.createCell((short)1).setCellValue(etablissement);</p>
<p><strong>     //FUSION des CELLULES:</strong><br />
Region reg=new Region(0,(short)0,0,(short)2);<br />
Region reg2=new Region(1,(short)0,1,(short)2);<br />
Region reg3=new Region(5,(short)0,5,(short)2);<br />
sheet.addMergedRegion(reg);<br />
sheet.addMergedRegion(reg2);<br />
sheet.addMergedRegion(reg3);</p>
<p><strong>        // Ecriture dans l&#8217;output </strong><br />
ServletOutputStream out;<br />
try {<br />
out = response.getOutputStream();<br />
wb.write(baos);<br />
baos.writeTo(out);<br />
baos.flush();<br />
context.responseComplete();<br />
} catch (IOException e) {</p>
<p>e.printStackTrace();<br />
}<br />
return null;<br />
<strong> }</strong></p>
<p class="MsoNormal"> Enfin, il ne reste plus qu’à ajouter un lien dans notre page xhtml, qui va nous proposer d’enregistrer le pdf généré:</p>
<p class="MsoNormal"><strong>&#60;h:commandLink id=&#8221;link&#8221; action=&#8221;#{controller.exportExcel}&#8221;&#62;<br />
EXCEL  </strong></p>
<p class="MsoNormal"><strong>&#60;/h:commandLink&#62; </strong></p>
<p class="MsoNormal">Ainsi, en cliquant sur le lien ‘EXCEL’ vous aurez l’invitation suivante :</p>
<p class="MsoNormal"> <a href="http://mondossierweb.files.wordpress.com/2007/03/invitexcel.JPG" title="InvitationExcel"><img src="/files/2007/03/invitexcel.thumbnail.JPG" alt="InvitationExcel" /></a></p>
<p class="MsoNormal">Il ne reste plus qu’à enregistrer le fichier. <a href="http://mondossierweb.files.wordpress.com/2007/03/testexcel.JPG" title="testExcel">Voir le resultat<br />
</a></p>
<p class="MsoNormal">&#160;</p>
<p class="MsoNormal">&#160;</p>
</div>]]></content:encoded>
</item>
<item>
<title><![CDATA[Génération d’un PDF retourné (servlet) :]]></title>
<link>http://mondossierweb.wordpress.com/2007/03/23/generation-d%e2%80%99un-pdf-retourne-servlet/</link>
<pubDate>Fri, 23 Mar 2007 10:50:42 +0000</pubDate>
<dc:creator>Charlie Dubois</dc:creator>
<guid>http://mondossierweb.wordpress.com/2007/03/23/generation-d%e2%80%99un-pdf-retourne-servlet/</guid>
<description><![CDATA[Le futur MonDossierWeb (Facelets) aura besoin de reprendre les fonctionnalités de l’ancien canal Mon]]></description>
<content:encoded><![CDATA[<div class='snap_preview'><p class="MsoNormal">Le futur MonDossierWeb (Facelets) aura besoin de reprendre les fonctionnalités de l’ancien canal MonDossierWeb ; comme la génération en pdf des informations affichées à l’écran. Apres quelques essais nous avons réussi à obtenir le résultat voulu grâce à la librairie iText. Voici comment sont implantées les choses :</p>
<p class="MsoNormal">Tout d’abord il faut penser à importer la librairie itext-2.0.1.jar disponible <a href="http://www.lowagie.com/iText/download.html">ici</a> dans le projet.</p>
<p class="MsoNormal">Puis, dans notre Controller qui contient (en attribut : nne, nom, dossier, annee etc.) les informations affichées à l’écran, nous ajoutons la méthode export() :</p>
<p class="MsoNormal">&#160;</p>
<p class="MsoNormal">public String export() {</p>
<p class="MsoNormal"><span>        </span>try {</p>
<p class="MsoNormal"><span>               </span><span>               </span>FacesContext context = FacesContext.getCurrentInstance();</p>
<p class="MsoNormal"><span>               </span><span>               </span>ExternalContext external = context.getExternalContext();</p>
<p class="MsoNormal"><span>               </span><span>               </span>HttpServletResponse response = (HttpServletResponse) external.getResponse();<span><br />
</span></p>
<p class="MsoNormal"><span>            </span><span>               </span><span>               </span>response = configureResponse(response , &#8220;TEST PDF&#8221;);</p>
<p class="MsoNormal"><span>            </span><span>               </span><strong>// <span> </span>création du document.</strong></p>
<p class="MsoNormal"><span>    </span><span>        </span><span>               </span><span>               </span>Document document = new Document(PageSize.A4,10,10,20,20);</p>
<p class="MsoNormal"><span>           </span><span>   <strong>            </strong></span><strong>// Document d = new Document(PageSize.A4); //portrait</strong></p>
<p class="MsoNormal"><span>          </span><span>               </span><strong>//<span>  </span>Document d = new Document(PageSize.A4.rotate()); //paysage<br />
<span> </span></strong></p>
<p class="MsoNormal"><span>               </span><strong>// configuration du document</strong></p>
<p class="MsoNormal"><span>            </span><span>               </span><span>               </span>document = configureDocument(11.5f, 14f, 0.5f);<span><br />
</span></p>
<p class="MsoNormal"><span>            </span><span>               </span><strong><span>// redirection du pdf.</span></strong></p>
<p class="MsoNormal"><span>               </span><span>               </span><span>ByteArrayOutputStream baos = new ByteArrayOutputStream(1024);</span></p>
<p class="MsoNormal"><span>               </span><span>               </span><span>PdfWriter writer = PdfWriter.getInstance(document, baos);</span></p>
<p class="MsoNormal"><span>               </span><span>               </span><span>writer.setStrictImageSequence(true);</span></p>
<p class="MsoNormal"><span><span>            </span></span><span>   <strong>            </strong></span><strong>// <span> </span>ouverture du document.</strong></p>
<p class="MsoNormal"><span>            </span><span>               </span><span>               </span>document.open();</p>
<p class="MsoNormal"><span>            </span><span>               </span><strong>// configuration des fonts</strong></p>
<p class="MsoNormal"><span>            </span><span>               </span><span>               </span>Font normal = FontFactory.getFont(FontFactory.TIMES_ROMAN, 8, Font.NORMAL);</p>
<p class="MsoNormal"><span>        </span><span>    </span><span>               </span><span>               </span>Font titre = FontFactory.getFont(FontFactory.TIMES_ROMAN, 10, Font.NORMAL);</p>
<p class="MsoNormal"><span>            </span><span>               </span><span>               </span>Font header = FontFactory.getFont(FontFactory.TIMES_ROMAN, 12, Font.BOLD);</p>
<p class="MsoNormal"><span>            </span><span>               </span><strong>//ajout image test</strong></p>
<p class="MsoNormal"><span>            </span><span>               </span><span>               </span>Image image1 = Image.getInstance(&#8220;http://www.univ-nancy2.fr/images/logo_nu_n2.gif&#8221;);</p>
<p class="MsoNormal"><span>            </span><span>               </span><span>               </span>image1.scaleAbsolute(100, 20);</p>
<p class="MsoNormal"><span>            </span><span>               </span><span>               </span>document.add(image1);<span><br />
</span></p>
<p class="MsoNormal"><span>            </span><span>   <strong>            </strong></span><strong>//nouveau paragraphe</strong></p>
<p class="MsoNormal"><span>            </span><span>               </span><span>               </span>Paragraph p=new Paragraph(&#8220;ETAT CIVIL\n\n&#8221;,header);</p>
<p class="MsoNormal"><span>            </span><span>               </span><span>               </span><span>p.indentationLeft();</span></p>
<p class="MsoNormal"><span>               </span><span>               </span><span>document.add(p);</span></p>
<p class="MsoNormal"><span>               </span><strong><span>//paragraphe GENERALITES</span></strong></p>
<p class="MsoNormal"><span>               </span><span>               </span><span>Chunk c1=new Chunk(&#8220;GENERALITES: &#8220;, titre);</span></p>
<p class="MsoNormal"><span>               </span><span>               </span><span>c1.setBackground(Color.cyan);</span></p>
<p class="MsoNormal"><span><span>            </span></span><span>               </span><span>               </span>Chunk c2=new Chunk(&#8220;\nDossier : &#8220;+dossier,normal);</p>
<p class="MsoNormal"><span>            </span><span>               </span><span>               </span><span>Chunk c3=new Chunk(&#8220;\nNNE : &#8220;+nne,normal);</span></p>
<p class="MsoNormal"><span>               </span><span>               </span><span>Chunk c4=new Chunk(&#8220;\nNom : &#8220;+nom,normal);</span></p>
<p class="MsoNormal"><span>               </span><span>               </span><span>Paragraph p1=new Paragraph();</span></p>
<p class="MsoNormal"><span>               </span><span>               </span><span>p1.add(c1);p1.add(c2);p1.add(c3);p1.add(c4);</span></p>
<p class="MsoNormal"><span><span>            </span></span><span>               </span><span>               </span>document.add(p1);<br />
<span> </span></p>
<p class="MsoNormal"><span>            </span><span>   <strong>            </strong></span><strong>//paragraphe INSCRIPTION UNIVERSITAIRE</strong></p>
<p class="MsoNormal"><span>            </span><span>               </span><span>               </span><span>Chunk c5=new Chunk(&#8220;INSCRIPTION UNIVERSITAIRE: &#8220;, titre);</span></p>
<p class="MsoNormal"><span>               </span><span>               </span><span>c5.setBackground(Color.cyan);</span></p>
<p class="MsoNormal"><span>               </span><span>               </span><span>Chunk c6=new Chunk(&#8220;\nAnnee : &#8220;+annee,normal);</span></p>
<p class="MsoNormal"><span><span>            </span></span><span>               </span><span>               </span>Chunk c7=new Chunk(&#8220;\nEtablissement : &#8220;+etablissement,normal);<span><br />
</span></p>
<p class="MsoNormal"><span>            </span><span>               </span><span>               </span><span>Paragraph p2=new Paragraph();</span></p>
<p class="MsoNormal"><span>               </span><span>               </span><span>p2.add(c5);p2.add(c6);p2.add(c7);</span></p>
<p class="MsoNormal"><span>               </span><span>               </span><span>document.add(p2);</span></p>
<p class="MsoNormal"><span>               </span><strong><span>//paragraphe BAC</span></strong></p>
<p class="MsoNormal"><span>               </span><span>               </span><span>Chunk c8=new Chunk(&#8220;BAC: &#8220;, titre);</span></p>
<p class="MsoNormal"><span>               </span><span>               </span><span>c8.setBackground(Color.cyan);</span></p>
<p class="MsoNormal"><span>               </span><span>               </span><span>Chunk c9=new Chunk(&#8220;\nBac : &#8220;+bac,normal);</span></p>
<p class="MsoNormal"><span>               </span><span>               </span><span>Chunk c10=new Chunk(&#8220;\nObtenu en : &#8220;+anneeobtentionbac,normal);</span></p>
<p class="MsoNormal"><span>               </span><span>               </span><span>Paragraph p3=new Paragraph();</span></p>
<p class="MsoNormal"><span>               </span><span>               </span><span>p3.add(c8);p3.add(c9);p3.add(c10);</span></p>
<p class="MsoNormal"><span><span>            </span></span><span>               </span><span>               </span>document.add(p3);</p>
<p class="MsoNormal"><span>            </span><span>  <strong>             </strong></span><strong>// fermeture du document.</strong></p>
<p class="MsoNormal"><span>            </span><span>               </span><span>               </span>document.close();</p>
<p class="MsoNormal"><span>            </span><span>   <strong>            </strong></span><strong>// préparation de la reponse</strong></p>
<p class="MsoNormal"><span>            </span><span>               </span><span>               </span><span>response.setContentLength(baos.size());</span></p>
<p class="MsoNormal"><span>   <strong>            </strong></span><strong><span>// retour du ByteArrayOutputStream en ServletOutputStream</span></strong></p>
<p class="MsoNormal"><span>               </span><span>               </span><span>ServletOutputStream out = response.getOutputStream();</span></p>
<p class="MsoNormal"><span>               </span><span>               </span><span>baos.writeTo(out);</span></p>
<p class="MsoNormal"><span>               </span><span>               </span><span>baos.flush();</span></p>
<p class="MsoNormal"><span>               </span><span>               </span><span>context.responseComplete();</span></p>
<p class="MsoNormal"><span><span>        </span>} catch (Exception e) {</span></p>
<p class="MsoNormal"><span>               </span><span>               </span><span>e.printStackTrace();</span></p>
<p class="MsoNormal"><span><span>        </span>}</span></p>
<p class="MsoNormal"><span>               </span><span>               </span><span>return null;</span></p>
<p class="MsoNormal"><span><span>    </span>}</span></p>
<p class="MsoNormal"><span><span> </span></span></p>
<p class="MsoNormal">Vous aurez remarqué que la méthode export appelle les deux méthodes suivantes, qu’il faut donc implémenter dans le Controller:</p>
<p class="MsoNormal"><span>    </span><span>private HttpServletResponse configureResponse(HttpServletResponse response, String fileName) {</span></p>
<p class="MsoNormal"><span>               </span><span>               </span><span>response.setHeader(&#8220;Expires&#8221;, &#8220;0&#8243;);</span></p>
<p class="MsoNormal"><span>               </span><span>               </span><span>response.setHeader(&#8220;Cache-Control&#8221;,<span>  </span>&#8220;must-revalidate, post-check=0, pre-check=0&#8243;);</span></p>
<p class="MsoNormal"><span>               </span><span>               </span><span>response.setHeader(&#8220;Pragma&#8221;, &#8220;public&#8221;);</span></p>
<p class="MsoNormal"><span>               </span><span>               </span><span>response.setContentType(&#8220;application/pdf&#8221;);</span></p>
<p class="MsoNormal"><span>               </span><span>               </span><span>response.addHeader(&#8220;Content-disposition&#8221;, &#8220;attachment; filename=\&#8221;" + fileName +&#8221;.pdf\&#8221;");</span></p>
<p class="MsoNormal"><span>               </span><span>               </span><span>return response;</span></p>
<p class="MsoNormal"><span><span>    </span>}</span></p>
<p class="MsoNormal"><span><span>    </span></span></p>
<p class="MsoNormal"><span></span><span>private Document configureDocument(float width, float height, float margin) {</span></p>
<p class="MsoNormal"><span>               </span><span>               </span><span>Document document = new Document();</span></p>
<p class="MsoNormal"><span>               </span><span>               </span><span>float widhtPage = (width / 2.54f) * 72f;</span></p>
<p class="MsoNormal"><span>               </span><span>               </span><span>float heightPage = (height / 2.54f) * 72f;</span></p>
<p class="MsoNormal"><span>               </span><span>               </span><span>document.setPageSize(new Rectangle(widhtPage,heightPage));</span></p>
<p class="MsoNormal"><span><span>        </span></span><span>               </span><span>               </span>float marginPage = (margin / 2.54f) * 72f;</p>
<p class="MsoNormal"><span>        </span><span>               </span><span>               </span>document.setMargins(marginPage, marginPage, marginPage, marginPage);</p>
<p class="MsoNormal"><span>        </span><span>               </span><span>               </span>return document;</p>
<p class="MsoNormal"><span>    </span>}</p>
<p class="MsoNormal">&#160;</p>
<p class="MsoNormal"><span></span>Enfin, il ne reste plus qu’à ajouter un lien dans notre page xhtml, qui va nous proposer d’enregistrer le pdf généré:</p>
<p class="MsoNormal"><span>               </span><span>&#60;h:commandLink id=&#8221;pdfLink&#8221; action=&#8221;#{Controller.export}&#8221;&#62;</span></p>
<p class="MsoNormal"><span><span>                                               </span></span><span>   </span><span>               </span><span>               </span><span>            </span>PDF</p>
<p class="MsoNormal"><span>               </span>&#60;/h:commandLink&#62;</p>
<p class="MsoNormal">Ainsi, en cliquant sur le lien ‘PDF’ vous aurez l’invitation suivante :</p>
<p class="MsoNormal"> <a href="http://mondossierweb.files.wordpress.com/2007/03/pdf1.JPG" title="pdfSaveAs"><img src="/files/2007/03/pdf1.thumbnail.JPG" alt="pdfSaveAs" /></a></p>
<p class="MsoNormal">&#160;</p>
<p class="MsoNormal">&#160;</p>
<p class="MsoNormal">&#160;</p>
<p class="MsoNormal">&#160;</p>
<p class="MsoNormal">&#160;</p>
<p class="MsoNormal">Il ne reste plus qu’à enregistrer le pdf et voilà, le tour et joué. <a href="http://mondossierweb.files.wordpress.com/2007/03/test-pdf.pdf" title="TESTpdf">Voir le résultat</a>.</p>
<p class="MsoNormal">Il reste maintenant à obtenir le même résultat en mode portlet, car vous aurez remarqué qu’on le sert de l’objet HttpServletResponse pour retourner le pdf.</p>
</div>]]></content:encoded>
</item>
<item>
<title><![CDATA[Un point sur les facelets et JSF]]></title>
<link>http://mondossierweb.wordpress.com/2007/03/21/un-point-sur-les-facelets-et-jsf/</link>
<pubDate>Wed, 21 Mar 2007 09:15:27 +0000</pubDate>
<dc:creator>Charlie Dubois</dc:creator>
<guid>http://mondossierweb.wordpress.com/2007/03/21/un-point-sur-les-facelets-et-jsf/</guid>
<description><![CDATA[Pour mener à terme le développement de MonDossierWeb en portlet , plusieurs questions se posent: -Es]]></description>
<content:encoded><![CDATA[<div class='snap_preview'><p style="text-indent:35.4pt;">Pour  mener à terme le développement de MonDossierWeb en portlet , plusieurs questions se posent:</p>
<p>-Est-il possible de faire marcher les tags ADF (la librairie de tag d&#8217;Oracle) en facelets?</p>
<p>-Comment avoir un système de template qui fonctionne pour portlet et servlet?</p>
<p>-Peut-on faire sans les tags esup utilisés dans esup-example ?</p>
<p>-Peut-on faire un Look-and-feel proche de l&#8217;original?</p>
<p>-Comment peut-on générer des fichiers pdf et excel sans passer par le xsl comme c&#8217;était le cas dans MonDossierWeb jusqu&#8217;ici?</p>
<p>Voici, pour l’instant, où en est notre réflexion :</p>
<p><u>-Est-il possible de faire marcher les tags ADF (la librairie de tag d’Oracle) en facelets ? </u></p>
<p class="MsoNormal">Sur ce point, il n’y a aucun problème car il existe une librairie <a href="https://facelets.dev.java.net/servlets/ProjectDocumentList?folderID=3990&#38;expandFolder=3990&#38;folderID=3990"><span style="color:windowtext;text-decoration:none;"></span></a>(adf-facelets.jar) qui fournie les tags ADF pour facelets. Nous ne l’avons pas encore testée mais nous le ferons d’ici peu. Voici un lien qui en explique rapidement le fonctionnement : <a href="http://www.it-eye.nl/weblog/2007/03/07/using-facelets-with-adf-faces/">lien</a></p>
<p class="MsoNormal">&#160;</p>
<p><u>-Comment avoir un système de template qui fonctionne pour portlet et servlet? </u></p>
<p class="MsoNormal">Cette question est primordiale et voici comment nous avons pensé la résoudre : Chaque page xhtml se compose de la manière suivante :</p>
<p class="MsoNormal">&#60;div xmlns:h=&#8221;http://java.sun.com/jsf/html&#8221;</p>
<p class="MsoNormal"><span>            </span>xmlns:e=&#8221;http://commons.esup-portail.org&#8221;</p>
<p class="MsoNormal"><span>            </span>xmlns:ui=&#8221;http://java.sun.com/jsf/facelets&#8221;&#62;</p>
<p class="MsoNormal"><span>            </span>&#60;ui:composition template=&#8221;template.xhtml&#8221;&#62;</p>
<p class="MsoNormal"><span>                        </span>&#60;ui:define name=&#8221;body&#8221;&#62;</p>
<p class="MsoNormal"><span>                                   </span>[CODE DE LA PAGE]</p>
<p class="MsoNormal" style="margin-left:35.4pt;text-indent:35.4pt;">&#60;/ui:define&#62;</p>
<p class="MsoNormal" style="text-indent:35.4pt;">&#60;/ui:composition&#62;</p>
<p class="MsoNormal">&#60;/div&#62;</p>
<p class="MsoNormal">De cette façon il suffit de modifier le ‘template.xhtml’ pour qu’il corresponde aux servlets (avec balise &#60;html&#62;) ou aux portlets (sans balise &#60;html&#62;). Nous avons donc créé deux templates (template-servlet.xhtml et template-portlet.xhtml) et il suffit de copier celui désiré en ‘template.xhtml’.</p>
<p class="MsoNormal">Voici un exemple basique (ce n’est pas le template final qui affiche le menu de la portlet) du template-servlet.xhmtl :</p>
<p class="MsoNormal">&#160;</p>
<p class="MsoNormal">&#60;!DOCTYPE html PUBLIC &#8220;-//W3C//DTD XHTML 1.0 Transitional//EN&#8221; &#8220;http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd&#8221;&#62;</p>
<p class="MsoNormal">&#60;html xmlns=&#8221;http://www.w3.org/1999/xhtml&#8221;</p>
<p class="MsoNormal"><span>      </span>xmlns:ui=&#8221;http://java.sun.com/jsf/facelets&#8221;</p>
<p class="MsoNormal"><span>      </span>xmlns:h=&#8221;http://java.sun.com/jsf/html&#8221;</p>
<p class="MsoNormal"><span>      </span>xmlns:f=&#8221;http://java.sun.com/jsf/core&#8221;&#62;</p>
<p class="MsoNormal"><span>&#60;head&#62;</span></p>
<p class="MsoNormal"><span><span> </span>&#60;title&#62;&#60;ui:insert name=&#8221;pageTitle&#8221;&#62;MonDossierWeb&#60;/ui:insert&#62;&#60;/title&#62;</span></p>
<p class="MsoNormal"><span>&#60;/head&#62;</span></p>
<p class="MsoNormal"><span>&#60;body&#62;</span></p>
<p class="MsoNormal"><span><span>  </span>&#60;p&#62;&#60;ui:insert name=&#8221;body&#8221;&#62;Page Body&#60;/ui:insert&#62;&#60;/p&#62;</span></p>
<p class="MsoNormal">&#60;/body&#62;</p>
<p class="MsoNormal">&#60;/html&#62;</p>
<p class="MsoNormal">&#160;</p>
<p class="MsoNormal">Et voici maintenant un exemple de template-portlet.xhtml</p>
<p class="MsoNormal">&#160;</p>
<p class="MsoNormal">&#60;div xmlns:h=&#8221;http://java.sun.com/jsf/html&#8221;</p>
<p class="MsoNormal"><span>                        </span>xmlns:e=&#8221;http://commons.esup-portail.org&#8221;</p>
<p class="MsoNormal"><span>                        </span>xmlns:ui=&#8221;http://java.sun.com/jsf/facelets&#8221;&#62;</p>
<p class="MsoNormal"><span>  </span><span>&#60;h1&#62;&#60;ui:insert name=&#8221;pageHeader&#8221;&#62;MonDossierWeb&#60;/ui:insert&#62;&#60;/h1&#62;</span></p>
<p class="MsoNormal"><span><span>  </span>&#60;p&#62;&#60;ui:insert name=&#8221;body&#8221;&#62;Page Body&#60;/ui:insert&#62;&#60;/p&#62;</span></p>
<p class="MsoNormal">&#60;/div&#62;</p>
<p class="MsoNormal">&#160;</p>
<p><u>-Peut-on faire sans les tags esup utilisés dans esup-example ?</u></p>
<p class="MsoNormal">Pour savoir si il était possible de faire sans les tags esup (qui sont des tag jsf, donc difficilement utilisables en facelets) nous les avons listés et pour chacun d’eux, nous avons défini son rôle afin de déterminer si il nous était utile et si c’était le cas, si nous pouvions nous arranger pour obtenir le même résultat par un moyen détourné.</p>
<p class="MsoNormal">Il s’est avéré<span>  </span>que la plupart d’entre eux sont effectivement utiles mais qu’il est possible d’obtenir le même résultat avec des tags ‘normaux’ html. Le seul qui soit vraiment compliqué est le tag ‘page’ qui initialise un certain nombre de paramètres. Peut-être devrons nous créer notre tag facelets qui fait la même chose…</p>
<p class="MsoNormal">&#160;</p>
<p><u>-Peut-on faire un Look-and-feel proche de l&#8217;original? </u></p>
<p class="MsoNormal">Comme MonDossierWeb est à l’origine basé sur du xsl, il est tout à fait possible de récupérer les tags html de ces fichiers, et comme le css de uportal ne change pas cela fonctionne très bien. On peut donc, en changeant quelques tags qui ne fonctionnent pas en facelets bien sur, notamment pour afficher les attributs d’une classe, obtenir un rendu quasi identique à l’application de départ. En voici la preuve après une après midi de test de mise au point des templates :</p>
<p class="MsoNormal"> <a href="http://mondossierweb.files.wordpress.com/2007/03/look1.JPG" title="lookANdFeel1"><img src="/files/2007/03/look1.thumbnail.JPG" alt="lookANdFeel1" /></a></p>
<p class="MsoNormal">&#160;</p>
<p class="MsoNormal">Le rendu est effectivement très proche de l’original.</p>
<p class="MsoNormal">&#160;</p>
<p><u>-Comment peut-on générer des fichiers pdf et excel sans passer par le xsl comme c&#8217;était le cas dans la MonDossierWeb jusqu&#8217;ici?</u></p>
<p class="MsoNormal">Sur ce point rien n’est encore défini car s’il est vrai que l’on peut facilement créer des fichiers excel et pdf en java, est-il possible de le faire depuis le rendu html de notre page pour le retourner ensuite à l’utilisateur. Nous allons nous pencher sur <a href="http://www.jfree.org/jfreereport/index.php">JFree</a> qui est une librairie java qui permet de faire des sorties pdf et excel en se basant sur du xml.</p>
</div>]]></content:encoded>
</item>

</channel>
</rss>
