Hmm, well first of all, since you're running within a portlet I'm actually surprised you're not getting class cast exceptions when casting the request and response objects to HttpServletRequest/HttpServletResponse; the portal should be ensuring that they are PortletRequest/PortletResponse objects, and not HttpServletRequest/HttpServletResponse. However, if you can forward to your word servlet, you're passing in the given request/response objects so why take the time to try to get to the text area through the value binding? It should appear as a request parameter that you could access directly (you'd have to enumerate your parameter names to find one ending with ":text1" as the parm names will have the various view root info encoded into them plus portal namespace stuff). Have you tried that? As far as the whole page as output, I'd guess that a) there is already some data in the response buffer before you start generating your word doc and/or b) you're really still within the portal itself; it is calling your portlet on it's own behalf and aggregating the resulting data from this one call with the response information from the rest of the portlets embedded on the page. -----Original Message----- From: [EMAIL PROTECTED] [mailto:[EMAIL PROTECTED] Sent: Thursday, November 23, 2006 8:35 AM To: users@myfaces.apache.org Subject: RE: response.Header() not working in JSF Portlet
Hi David, Thank you for your suggestions. I have now included the servlet and JSF portlet in the same war file and deployed on Websphere Portal Server. But currently the saving of the text area contents into word document is happening but it saves the entire portlet page instead of only the text area contents. Could you help me in my last minute hitch with the code. 1) JSF Portlet Page: ------------------------ <h:inputTextarea id="text1" value="#{pc_TextAreaView.textAreaValue}" rows="10" cols="50" /> <h:commandButton id="save1" value="Save with Servlet" action="#{pc_TextAreaView.SaveAsWord}" /> 2) Backing bean Save method: ---------------------------------------- public void SaveAsWord() { System.out.println("I invoke this"); FacesContext context = FacesContext.getCurrentInstance(); ExternalContext ctx = context.getExternalContext(); try{ HttpServletResponse response = (HttpServletResponse)ctx.getResponse(); HttpServletRequest request = (HttpServletRequest)ctx.getRequest(); RequestDispatcher view = request.getRequestDispatcher("/WordServ1"); view.forward(request,response); }catch(Exception e){e.printStackTrace();} 3) Servlet to handle the saving in word document ------------------------------------------------------------------ protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { FacesContext facesContext = FacesContext.getCurrentInstance(); ValueBinding vb = facesContext.getApplication().createValueBinding("#{pc_TextAreaView}"); TextAreaView mybean = (TextAreaView) vb.getValue(facesContext); String mytextarea = mybean.getTextAreaValue(); String filen = "default.doc"; response.setContentType("application/vnd.ms-word"); response.setHeader( "content-disposition","attachment;name=\""+filen+"\";filename=\""+filen+"\""); response.setHeader("Cache-Control", "no-cache"); try{ byte[] buf=new byte[4*1024]; InputStream inStream=new ByteArrayInputStream(mytextarea.getBytes()); OutputStream outStream=response.getOutputStream(); int sizeRead; while ( ( sizeRead=inStream.read(buf, 0, buf.length) ) != -1 ) { outStream.write(buf, 0, sizeRead); } inStream.close(); outStream.close(); } catch(IOException ex){ ex.printStackTrace();} } } Best Regards, Pallavi _____ From: Nebinger, David [mailto:[EMAIL PROTECTED] Sent: Wednesday, November 22, 2006 8:25 PM To: MyFaces Discussion Subject: RE: response.Header() not working in JSF Portlet To expand on what Stephan provided, in order to share application scope between your JSF application and a non-JSF servlet, they need to be deployed in the same war file and entered in the same web.xml. Combining them in this way will provide the connectivity you'd need based upon Stephan's original response. -----Original Message----- From: Strittmatter, Stephan [mailto:[EMAIL PROTECTED] Sent: Wednesday, November 22, 2006 6:49 AM To: MyFaces Discussion Subject: AW: response.Header() not working in JSF Portlet Hi Pallavi, I use Liferay on Tomcat. The servlet I included within my portlet war. Not in a separate war. Sorry for my short answer, but we have currently system tests with our customer... Regards, Stephan _____ Von: [EMAIL PROTECTED] [mailto:[EMAIL PROTECTED] Gesendet: Mittwoch, 22. November 2006 08:08 An: users@myfaces.apache.org Betreff: RE: response.Header() not working in JSF Portlet Hi Stephan, My concepts are not very clear regarding the portal server. I am using RAD as my IDE and Wepsphere portal server and application server(WAS). Which Portal server are you using.Are you using the same combination. I wanted to know whether you are creating a seperate war file to deploy your servlet on WAS. Then invoking a call to your servlet from your portlet. Can you show me some light on this grey area. Best Regards, Pallavi _____ From: Strittmatter, Stephan [mailto:[EMAIL PROTECTED] Sent: Tuesday, November 21, 2006 9:29 PM To: MyFaces Discussion Subject: AW: response.Header() not working in JSF Portlet Hi Pallavi, within a portlet it is not allowed to chenge the response header. Otherwise a portlet would damage the portal around your portlet. I had this problem also and created a servlet, which I assigned with the special extention. The only problem was, that I had to include the part in a verbatim tag to have a form with an own defined target probably there is a different more elegant way...: <f:verbatim> <form action="${request.contextPath}/download.xml" target="_blank" method="post"> <input type="submit" value="Download" title="Download XML file" id="execute" style="width:7em;" class="portlet-form-button" /> <input type="hidden" name="execute" value="execute" /> </form> </f:verbatim> In the web.xml you have to define then the servlet and assign it to the extention. In the servlet you can access the backing bean by following to get some values: FacesContext c = FacesContext.getCurrentInstance(); Application application = c.getApplication(); MyBackingBean bBean= (MyBackingBean) application.createValueBinding("#{MyBackingBean}").getValue(c); Regards, Stephan _____ Von: [EMAIL PROTECTED] [mailto:[EMAIL PROTECTED] Gesendet: Montag, 20. November 2006 12:25 An: users@myfaces.apache.org Betreff: response.Header() not working in JSF Portlet Hi All, I have a JSF portlet where i want to save the contents of my Text area on the click of a button to a word document. (IBM Websphere portal) <h:inputTextarea id="text1" value="#{pc_TextAreaView.textAreaValue}" rows="10" cols="50" /> <h:commandButton id="save" value="Save As Word" action="#{pc_TextAreaView.SaveAsWord}"/> In my page bean i have written the follwoing code but the response.setHeader() doesn't seem to work. I am not getting any pop dialog and i cannot save my file. Please let me know what is wrong in this code snippet.How can i make it work in my portlet. =============================================================================== public String SaveAsWord() { FacesContext context = FacesContext.getCurrentInstance(); HttpServletResponse response = (HttpServletResponse)context.getExternalContext().getResponse(); response.setContentType("application/vnd.ms-word"); response.setHeader("Content-Disposition", "attachment; filename=myfile.doc"); response.setHeader("Cache-Control", "no-cache"); try{ byte[] buf=new byte[4*1024]; InputStream inStream=new ByteArrayInputStream(textAreaValue.getBytes()); OutputStream outStream=response.getOutputStream(); int sizeRead; while ( ( sizeRead=inStream.read(buf, 0, buf.length) ) != -1 ) { outStream.write(buf, 0, sizeRead); } inStream.close(); outStream.close(); } catch(IOException ex){ ex.printStackTrace(); } return null; } Best Regards, Pallavi The information contained in this electronic message and any attachments to this message are intended for the exclusive use of the addressee(s) and may contain proprietary, confidential or privileged information. If you are not the intended recipient, you should not disseminate, distribute or copy this e-mail. Please notify the sender immediately and destroy all copies of this message and any attachments. WARNING: Computer viruses can be transmitted via email. The recipient should check this email and any attachments for the presence of viruses. The company accepts no liability for any damage caused by any virus transmitted by this email. www.wipro.com The information contained in this electronic message and any attachments to this message are intended for the exclusive use of the addressee(s) and may contain proprietary, confidential or privileged information. If you are not the intended recipient, you should not disseminate, distribute or copy this e-mail. Please notify the sender immediately and destroy all copies of this message and any attachments. WARNING: Computer viruses can be transmitted via email. The recipient should check this email and any attachments for the presence of viruses. The company accepts no liability for any damage caused by any virus transmitted by this email. www.wipro.com The information contained in this electronic message and any attachments to this message are intended for the exclusive use of the addressee(s) and may contain proprietary, confidential or privileged information. If you are not the intended recipient, you should not disseminate, distribute or copy this e-mail. Please notify the sender immediately and destroy all copies of this message and any attachments. WARNING: Computer viruses can be transmitted via email. The recipient should check this email and any attachments for the presence of viruses. The company accepts no liability for any damage caused by any virus transmitted by this email. www.wipro.com