IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

JSF Java Discussion :

Référence sur le managed-bean dans une servlet


Sujet :

JSF Java

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Janvier 2005
    Messages
    100
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2005
    Messages : 100
    Points : 61
    Points
    61
    Par défaut Référence sur le managed-bean dans une servlet
    Bonjour,

    Trop de temps passé sur un probleme
    qui parait simple.

    J'ai une appli JSF, je dois faire une extraction de donné excel
    j'ai crée un servlet qui utilise jxlapi

    impossible de recuperer une référence sur le managed-bean en session:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    public void doGet(HttpServletRequest request, HttpServletResponse response)
    	 throws ServletException, IOException
    	 {
    		 ServletContext sc=getServletContext();
    		FacesContext context = FacesContext.getCurrentInstance();
                //// context  est toujours null ? 
    	    ExpressionFactory expressionFactory = context.getApplication().getExpressionFactory();
    	    ValueExpression valueExpression = expressionFactory.createValueExpression(context.getELContext(), "#{It01ComptesHandler}", It01ComptesHandler.class);
    	    It01ComptesHandler iIt01ComptesHandler = (It01ComptesHandler) valueExpression.getValue(context.getELContext());
    Help me if you can i am feeling baddddd.

  2. #2
    Expert éminent
    Avatar de djo.mos
    Profil pro
    Inscrit en
    Octobre 2004
    Messages
    4 666
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2004
    Messages : 4 666
    Points : 7 679
    Points
    7 679
    Par défaut
    Bonjour,
    Il me semble que le facesContext est stocké dans un ThreadLocal, et que puisque ta Servlet tourne sur un autre thread, elle ne peut pas accéder au facesContext.

    Mais pourquoi passer par une autre Servlet ? Tu peux ecrire ce que tu veux dans la response depuis un managed bean JSF, comme montré dans cet article

  3. #3
    Membre du Club
    Profil pro
    Inscrit en
    Janvier 2005
    Messages
    100
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2005
    Messages : 100
    Points : 61
    Points
    61
    Par défaut
    Merci de ton explication djo.mos

    J'ai lu cet article avec beaucoup d'intéret, et je me suis orienté
    vers une solution similaire :

    JSF:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    			            <h:commandLink  styleClass="sectiontitle" action="#{It01ComptesHandler.onGenerateExcelWorkbook}" >
    			            <h:outputText  style="{white-space: nowrap; text-align: center;}" value="ExportContact.xls"/>
    			            </h:commandLink>
    et dans le managed-bean :


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
       public String onGenerateExcelWorkbook() {
     
     
            // initialisation des contextes et parametres 
            FacesContext localcontext = FacesContext.getCurrentInstance();
            ExternalContext localexternalContext = localcontext.getExternalContext();
     
            HttpServletResponse localresponse = (HttpServletResponse) localexternalContext.getResponse();
     
    //    	create workbook and sheet for output
        	WritableWorkbook workbook = null;
        	try {
    	    	//create workbook and sheet for output
    	    	//HttpServletResponse response = (HttpServletResponse)context.getExternalContext().getResponse();
        		localresponse.setContentType("application/vnd.ms-excel");
        		localresponse.setHeader("Content-disposition", "inline;filename=\"ExportContact.xls\"");
    	    	//response.setContentType("application/xls");
    	    	workbook = Workbook.createWorkbook(response.getOutputStream());
    	    	//workbook = Workbook.createWorkbook(new File("excelExport.xls"));
    	    	WritableSheet sheet =  workbook.createSheet("maintenances", 0);
     
    	    	sheet.addCell(new Label(0, 0, "Hello World"));
     
        	} 
        	catch (Exception e) {    	e.printStackTrace();    	}
        	//WritableSheet sheet = workbook.getSheet(0);
     
     
        	try {
        	workbook.write();
        	workbook.close();
        	 //context.getExternalContext().redirect("/"); 
        	localcontext.responseComplete();
        	} catch (Exception e) {   	e.printStackTrace();    	}
           return "success" ;
        	}
    cela fonctionne
    ATTENTION au FacesContext localcontext = FacesContext.getCurrentInstance();
    Si il n'est pas local je le retrouve null, le localcontext.responseComplete(); est dans les choux et j'ai un
    java.lang.IllegalStateException: Impossible d'utiliser faire-suivre (forward) après que la réponse ait été envoyée

    qui m'a encore couté trop de temps

    Quand je dit que cela fonctionne c'etait sans compter sur le misérable IE qui ignore le setContentType("application/vnd.ms-excel");

    et donc comme tous les clients du monde sont sur IE c'est KO

    je crois qu'il y a une solution avec les filtres, mais j'aurrais peut être besoin
    d'une référence sur le managed-bean


  4. #4
    Membre du Club
    Profil pro
    Inscrit en
    Janvier 2005
    Messages
    100
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2005
    Messages : 100
    Points : 61
    Points
    61
    Par défaut La reponse
    Bonjour a tous,

    Finalement j'ai réussie a récupérer une référence sur mon managed-bean
    dans une servlet. Je poste le code un peu brut de fonderie

    ATTENTION Le premier post était du JSF 1.2
    celui la est du JSF 1.1
    parce que mon client non seulement il emploi ie mais son serveur d'appli
    weblo 9.2 ne supporte pas les JSF 1.2

    web.xml
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
     <servlet>
     <servlet-name>exportExcel</servlet-name>
     <servlet-class>app.entite.It01ComptesRechercheResultatExporter</servlet-class>
    </servlet>
     
    <servlet-mapping>
    <servlet-name>exportExcel</servlet-name>
    <url-pattern>/exportExcel.xls</url-pattern>
    </servlet-mapping>

    la servlet
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
     
    package app.entite;
     
    import javax.faces.FactoryFinder;
    import javax.faces.context.FacesContext;
    import javax.faces.context.FacesContextFactory;
    import javax.faces.el.ValueBinding;
    import javax.faces.lifecycle.Lifecycle;
    import javax.faces.lifecycle.LifecycleFactory;
    import javax.faces.model.SelectItem;
    	import javax.naming.*;
    	import javax.servlet.*;
    	import javax.servlet.http.*;
    	import javax.sql.*;
    	import app.entite.It01ComptesHandler;
     
    import java.util.Iterator;
    	import java.util.List;
    	import java.io.IOException;
    	import java.io.OutputStream;
     
    	import javax.servlet.ServletException;
    	import javax.servlet.http.HttpServlet;
    	import javax.servlet.http.HttpServletRequest;
    	import javax.servlet.http.HttpServletResponse;
     
    import matta.bd.UtilisateurIdent;
     
    	import jxl.Workbook;
    	import jxl.write.Label;
    	import jxl.write.WritableSheet;
    import jxl.write.WritableWorkbook;	
     
    	public class It01ComptesRechercheResultatExporter extends HttpServlet
    	{
     
     
     
    //	It01ComptesHandler iIt01ComptesHandler;
    //	FacesContext context ;
    //	ExpressionFactory expressionFactory;
    //	ValueExpression valueExpression;
     
     
     
    	 public void doGet(HttpServletRequest request, HttpServletResponse response)
    	 throws ServletException, IOException
    	 {
     
    		FacesContextFactory factory = (FacesContextFactory) 	FactoryFinder.getFactory(FactoryFinder.FACES_CONTEXT_FACTORY);
    		LifecycleFactory factory2 = (LifecycleFactory) 	    	FactoryFinder.getFactory(FactoryFinder.LIFECYCLE_FACTORY);
    		Lifecycle lifecycle = factory2.getLifecycle	    (LifecycleFactory.DEFAULT_LIFECYCLE);
    		FacesContext context = factory.getFacesContext(	    this.getServletContext(), request, response, lifecycle);
     
    		context = factory.getFacesContext(	    this.getServletContext(), request, response, lifecycle);
    		context = FacesContext.getCurrentInstance();
    		ValueBinding valueBinding = context.getApplication().createValueBinding("#{It01ComptesHandler}");
    		It01ComptesHandler iIt01ComptesHandler = (It01ComptesHandler) valueBinding.getValue(context);
     
    	  OutputStream out = null;
    	  try
    	  {
    	   response.setContentType("application/vnd.ms-excel");
    	   response.setHeader("Content-Disposition", "attachment; filename=contact.xls");
    	   WritableWorkbook w = Workbook.createWorkbook(response.getOutputStream());
    	   WritableSheet s = w.createSheet("Demo", 0);
     
    	   List listit01comptesfull = iIt01ComptesHandler.getlistit01comptesfull();
     
     
    	    Iterator iter = listit01comptesfull.iterator();
    	    int x=0; // horizontal X
    	    int y=0; // vertical Y
    	    while ( iter.hasNext() ) 
    	    {	
    	        app.hb.It01Comptes iIt01Comptes = (app.hb.It01Comptes) iter.next();
    	        s.addCell(new Label(x, y, iIt01Comptes.getit01nom()));
    	        x = x+1;y = y+1;
    	    }
     
    //	   s.addCell(new Label(0, 0, "Hello World"));
    //	   s.addCell(new Label(1, 1, "Hello World"));
    //	   s.addCell(new Label(2, 2, "Hello World"));
     
    	   w.write();
    	   w.close();
    	  } catch (Exception e)
    	  {
    	   throw new ServletException("Exception in Excel Sample Servlet", e);
    	  } finally
    	  {
    	   if (out != null)
    	    out.close();
    	  }
    	 }
    	  public void doPost(HttpServletRequest request, HttpServletResponse response) throws
          ServletException, IOException {
     
         // a faire recuperation
         // a partir de la base serv_ft de nom, passwd, serv_id dula table tmp
         // passage des argument a doPost
    	  	doGet(request, response);
      } //do get
    	}
    Voila en espérant aider quelqu'un

  5. #5
    Membre averti Avatar de danyboy85
    Homme Profil pro
    Développeur Java
    Inscrit en
    Décembre 2005
    Messages
    548
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur Java

    Informations forums :
    Inscription : Décembre 2005
    Messages : 548
    Points : 312
    Points
    312
    Par défaut
    Citation Envoyé par matta Voir le message
    Quand je dit que cela fonctionne c'etait sans compter sur le misérable IE qui ignore le setContentType("application/vnd.ms-excel");

    et donc comme tous les clients du monde sont sur IE c'est KO
    Je relance un topic qui date un peu mais je voulais savoir si tu avais trouvé une solution pour que cela fonctionne sous IE ?

    Car j'ai le même problème : l'export Excel fonctionne bien sous Firefox mais pas sous IE...
    "Wash me away Clean your body of me Erase all the memories They'll only bring us pain And I've seen All i'll ever need"

  6. #6
    Candidat au Club
    Inscrit en
    Juillet 2010
    Messages
    2
    Détails du profil
    Informations forums :
    Inscription : Juillet 2010
    Messages : 2
    Points : 3
    Points
    3
    Par défaut
    Merci matta tu m'a sauvé

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Déclarer un managed bean dans une servlet
    Par scorplayer dans le forum JSF
    Réponses: 4
    Dernier message: 10/09/2010, 11h34
  2. Réponses: 7
    Dernier message: 26/08/2009, 13h44
  3. Problème sur un champ SELECT dans une servlet
    Par kcizth dans le forum Servlets/JSP
    Réponses: 1
    Dernier message: 13/03/2008, 16h47
  4. opération sur un bean dans une jsp
    Par spaceyoyo dans le forum Struts 1
    Réponses: 4
    Dernier message: 03/02/2007, 02h56
  5. [AJAX] Récupérer paramètre sur POST dans une servlet
    Par _beber85 dans le forum Servlets/JSP
    Réponses: 1
    Dernier message: 05/04/2006, 11h52

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo