Salut,
Je veux forcer la method dans l'objet HttpServletRequest à "POST" au lieu de "GET"
NB:pas d'attribut method dans la balise <h:form>
merci
Version imprimable
Salut,
Je veux forcer la method dans l'objet HttpServletRequest à "POST" au lieu de "GET"
NB:pas d'attribut method dans la balise <h:form>
merci
Si mes souvenirs sont bons, je crois que toutes données envoyées du client au serveur via l'attribut <h:form> se fait forcément en POST.
dans mon managedBean j'ai testé ça
j'ai récupérer GETCode:
1
2
3 HttpServletRequest request = (HttpServletRequest) context .getExternalContext().getRequest(); System.out.println(request.getMethod());
Mais dans ta balise <h:form> tu as des balise du genre <h:input> ? Tu peux nous fournir ta page JSF s'il te plait.
C'est un peut compliqué mais de toute façon ce n'est autre qu'un formulaire JSF simple avec des inputs et un bouton pour générer un PDFCode:
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 <h:form id="campaign" > <ice:panelGroup style="background-color: #F9F6F6;width:815px;border: 1px solid #D9D9D9;text-align: left "> <ice:panelGrid columns="2" cellspacing="3"> <ice:panelGrid columns="2" cellspacing="3" style="width:500px"> <span><ice:outputLabel value="Nom" style="font:14px Arial ;color: #000000" /><span style="color: red">*</span></span> <ice:selectInputText id="AutoCmpTxtFace" rows="#{salesBean.selectedLength}" width="300" value="#{salesBean.selectedAccountValue}" valueChangeListener="#{salesBean.selectInputValueChanged}" listVar="acc" listValue="#{salesBean.accountMatchPossibilities}"> <f:facet name="selectInputText"> <ice:panelGrid columns="3" columnClasses="cityCol,stateCol,zipCol"> <ice:outputText id="AutoCmpCty" value="#{acc.name}" /> <ice:outputText id="AutoCmpCty" value="#{acc.category}" /> </ice:panelGrid> </f:facet> </ice:selectInputText> </ice:panelGrid> <ice:panelGrid columns="3" visible="#{productBean.popVisible}"> <ice:commandButton value="Confirmer" action="#{salesBean.generateDevisPDF}" style="width: 100px" /> <ice:commandButton value="Annuler" onclick="javascript:show_alert();" style="width: 100px" /> </ice:panelGrid> </h:form>
Ok. Alors tu n'as pas besoin d'utiliser l'Objet HttpServletRequest pour récuperer la valeur des tes inputs. Il suffit juste de récupérer la valeur directement via les attributs de ton management bean.
Non,j'ai pas un problème de récupération des attributs dans management bean juste je veut forcer l'envoi du formulaire à POST au lieu de GET.
On faite le problème c'est que je suis entrain de générer un rapport PDF avec jasper report
ce write retourne "INFO - 'POST' request expected. Dropping connection... - com.icesoft.faces.webapp.http.core.RequestVerifier "Code:
1
2
3
4
5 //... HttpServletResponse response = (HttpServletResponse) context .getExternalContext().getResponse(); response.getOutputStream().write(bytes);
et c'est tout à fait logique d'après ce lien http://sventon.icefaces.org/svn/show...tVerifier.java
et mon PDF est null
Ah ok, alors là je ne suis pas compétant, désolé.
en tout cas merci pour votre coopération!
Essaie un peu ceci:
Code:
1
2
3
4
5
6
7
8
9
10
11 FacesContext context = FacesContext.getCurrentInstance(); ExternalContext ectx = context.getExternalContext(); ... HttpServletResponse response = (HttpServletResponse) ectx.getResponse(); response.setContentLength(bytes.length); response.getOutputStream().write(bytes); response.setContentType("application/pdf"); context.responseComplete();
Voilà le code du méthode qui génère le PDF mais toujours rien ne s'affiche coté client
Code:
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 public void generateDevisPDF(){ try { Map parameters = new HashMap(); parameters.put("idDevis","D01"); Collection<Product> cp = this.serviceLocator.getProductServiceAble().getProducts();; Collection jrxmlCollection = ProductFactory.createBeanCollection(cp ); File file = new File("./jasperFile"); JasperPrint jasperPrint = JasperFillManager.fillReport( new FileInputStream(new File(file, "devis.jasper")), parameters, new JRBeanCollectionDataSource(jrxmlCollection)); byte[] bytes = JasperExportManager.exportReportToPdf(jasperPrint); FacesContext context = FacesContext.getCurrentInstance(); ExternalContext ectx = context.getExternalContext(); HttpServletResponse response = (HttpServletResponse) ectx.getResponse(); // HttpServletResponse response = (HttpServletResponse) context // .getExternalContext().getResponse(); response.addHeader("Content-disposition", "attachment;filename=devis.pdf"); response.setContentLength(bytes.length); response.getOutputStream().write(bytes); response.setContentType("application/pdf"); context.responseComplete(); //return null; } catch (JRException e) { e.printStackTrace(); } catch (Exception e) { e.printStackTrace(); } // return "devis"; }
Si tu n'as aucune autre exception, essaie d'utiliser cette instruction:
à la place de:Code:
1
2 response.addHeader("Content-disposition","inline;filename=devis.pdf");
Je crois que "attachement" pose un problème avec certains navigateurs.Code:
1
2 response.addHeader("Content-disposition","attachment;filename=devis.pdf");
voilà la declaration de mon bean dans faces-config
NB:j'utilise Spring dans mon applicationCode:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16 <managed-bean> <description> Backing bean for sales. </description> <managed-bean-name>salesBean</managed-bean-name> <managed-bean-class> view.bean.Sales.SalesBean </managed-bean-class> <managed-bean-scope>request</managed-bean-scope> <managed-property> <property-name>serviceLocator</property-name> <value>#{serviceLocatorBean}</value> </managed-property> </managed-bean>
ca ne nous avance a rien, ce qui est intéressante c'est de savoir
-> où se trouve le code qui te sort que c'est un post (parce que "dans mon managedBean", c'est vague)
-> qu'est-ce que tu fait pour déclencher l'exécution dudit code
-> ce qu'il y a dans ta méthode d'action de ton form
tu trouve dans les messages au dessus le code jsf (le formulaire)
dans n'importe quelles méthodes(actions) du management bean si j'écris ces 2 lignes
j'obtiens en tapant le bouton de l'action le mot GET sur la console de mon eclipse.Code:
1
2
3 HttpServletRequest request = (HttpServletRequest) context.getExternalContext().getRequest(); System.out.println(request.getMethod());
NB:j'ai fait ça uniquement pour savoir si la méthode est POST ou GET
quelle version de JSF utilise-tu, quelle implémentation. Parce qu'aux dernière nouvelles, h:form, ça fait du POST, pas du GET!
au fait, si tu remplace ton ice:commandebutton par un h:commandebutton, ca te dit toujours que c'est du GET?
*encore même chose
*version :C'est la 1.2
juste je me demande si tu sais l'apport de cette servlet dans mon web.xml
Code:
1
2
3
4
5
6
7
8
9
10
11 <servlet> <servlet-name>Blocking Servlet</servlet-name> <servlet-class>com.icesoft.faces.webapp.xmlhttp.BlockingServlet</servlet-class> <load-on-startup> 1 </load-on-startup> </servlet> <servlet-mapping> <servlet-name>Blocking Servlet</servlet-name> <url-pattern>/block/*</url-pattern> </servlet-mapping>
Si tu veux downloader un fichier, n'utilise pas le boutton ice qui est basé sur l'ajax, utilise un h:commandButton normal.
Si tu fais un redirect, il y'a un une requete GET qui est faite après le post.