I think that what Andreas is doing is:

(1) access a JSF page --> renders html
(2) click on command-component in page, causing a submit
(3) in action-handler method, send an http-redirect to the browser
(4) browser then does a GET to the redirect address, which maps to a servlet
(5) the servlet generates a PDF as response, with appropriate http-headers
(6) the server sees that the response mime-type is not HTML, so creates
a new window to hold the PDF. The original browser window is left with
the same HTML it had at (1)

The browser window has simply not changed at all since (1), although a
JSF lifecycle has run on the server. So of course any messages are still
displayed.

Andreas, I have had to do something similar in the past, but took a
different approach. In the action-handler method I just put some data in
session-scope, and then rendered a JSF page that contains some
javascript to do a GET request to the pdf-generation servlet (a META
refresh tag might also work). The PDF servlet then used the
session-scoped data to generate the appropriate PDF document.

Regards,
Simon

Bernd Bohmann schrieb:
> Hello Andreas,
>
> is your action immediate=true ?
>
> Regards
>
> Bernd
>
> Andreas Niemeyer schrieb:
>   
>> yippi :)
>>
>> Thank you all!
>>
>> Regards,
>> Andreas
>>
>> Richard Yee schrieb:
>>     
>>> Try using divelement.style.display="none"
>>>
>>> Regards,
>>>
>>> Richard
>>>
>>>
>>> On Wed, Dec 10, 2008 at 6:27 AM, Andreas Niemeyer
>>> <[EMAIL PROTECTED]> wrote:
>>>       
>>>> Hi,
>>>>
>>>> It works.
>>>>
>>>> The only problem is the left space from the invisible <div> tag.
>>>>
>>>>
>>>> Regards,
>>>> Andreas
>>>>
>>>>
>>>>
>>>> <div id="error_messages" style="color: darkred;visibility: visible" >
>>>>        <t:messages id="error_messages" showDetail="true"
>>>> showSummary="false"
>>>> />
>>>> </div>
>>>>
>>>> ....
>>>> <h:commandButton id="reportbutton"
>>>> onclick="clearMessages('error_messages')"
>>>> value="#{msgs.CreateReportButton}"
>>>> action="#{pdfreport.createPDFReport}" />
>>>>
>>>>
>>>>
>>>> JavaScript:
>>>>
>>>> function clearMessages(aMessagesID) {
>>>>        var divelement = document.getElementById(aMessagesID);
>>>>        divelement.style.visibility='hidden';
>>>> }
>>>>
>>>>
>>>> Andreas Niemeyer schrieb:
>>>>         
>>>>> Hello Helmut,
>>>>>
>>>>> Good proposal to handle this about JavaScript before send the form.
>>>>> I'll
>>>>> give it a trial.
>>>>>
>>>>> Kind regards,
>>>>> Andreas
>>>>>
>>>>>
>>>>> Helmut Swaczinna schrieb:
>>>>>           
>>>>>> Hello Andreas,
>>>>>>
>>>>>> I don't think Tobago or JSF can clear the messages for you. But you
>>>>>> can
>>>>>> clear the messages on the page  yourself  with
>>>>>> some javascript before the action for the PDF generation gets
>>>>>> submitted.
>>>>>>
>>>>>> For example:
>>>>>>
>>>>>> ...
>>>>>> action="controller.createPDF"
>>>>>> onclick="clearMessagesAndSubmit('@autoId')"
>>>>>> ...
>>>>>>
>>>>>> function clearMessagesAndSubmit(actionId) {
>>>>>>  // Find messages and clear them
>>>>>>  Var message = document.getElenemtById('page:message');
>>>>>>  message.value = "";
>>>>>>  Tobago.submitAction(actionId, false);
>>>>>> }
>>>>>>
>>>>>> I haven't tried this, but I think it should work.
>>>>>>
>>>>>> Regards
>>>>>> Helmut
>>>>>>
>>>>>> ----- Original Message ----- From: "Andreas Niemeyer"
>>>>>> <[EMAIL PROTECTED]>
>>>>>> To: <users@myfaces.apache.org>
>>>>>> Sent: Wednesday, December 10, 2008 11:11 AM
>>>>>> Subject: Re: JSF servlet request in action method or navigation
>>>>>> rule to
>>>>>> get binary servlet data?
>>>>>>
>>>>>>
>>>>>>             
>>>>>>> Hello Bernd,
>>>>>>>
>>>>>>> Yes, I did.
>>>>>>>
>>>>>>> There seems to be no way to get previous messages away due I don't
>>>>>>> get
>>>>>>> the page reloaded.
>>>>>>>
>>>>>>> I'll open a new thread and try to describe in more detail the
>>>>>>> "requirements".
>>>>>>>
>>>>>>>
>>>>>>> Thank you.
>>>>>>>
>>>>>>> Regards,
>>>>>>> Andreas
>>>>>>>
>>>>>>>
>>>>>>>
>>>>>>> Bernd Bohmann schrieb:
>>>>>>>               
>>>>>>>> Hello Andreas,
>>>>>>>>
>>>>>>>> are you calling
>>>>>>>> FacesContext.getCurrentInstance().responseComplete() ?
>>>>>>>>
>>>>>>>> Regards
>>>>>>>>
>>>>>>>> Bernd
>>>>>>>>
>>>>>>>>
>>>>>>>> Andreas Niemeyer schrieb:
>>>>>>>>                 
>>>>>>>>> Hello Bernd,
>>>>>>>>>
>>>>>>>>> Thank you for response.
>>>>>>>>>
>>>>>>>>> Unfortunatly I have to use this servlet as a pdf dynamic provider.
>>>>>>>>>
>>>>>>>>> The redirect works fine so far, but another thing happened.
>>>>>>>>>
>>>>>>>>> Due some validation rules in the same method, a previous custom
>>>>>>>>> FacesMessage stays displayed and only after a page reload it goes
>>>>>>>>> away.
>>>>>>>>>
>>>>>>>>> Have someone an idea?
>>>>>>>>>
>>>>>>>>> Regards,
>>>>>>>>> Andreas
>>>>>>>>>
>>>>>>>>>
>>>>>>>>>
>>>>>>>>> Bernd Bohmann schrieb:
>>>>>>>>>                   
>>>>>>>>>> Hello Andreas,
>>>>>>>>>>
>>>>>>>>>> maybe this help:
>>>>>>>>>>
>>>>>>>>>> http://wiki.apache.org/myfaces/Sending_Files
>>>>>>>>>>
>>>>>>>>>> You don't need a Servlet for sending binary data from jsf.
>>>>>>>>>>
>>>>>>>>>> The magic is the responseComplete() method.
>>>>>>>>>>
>>>>>>>>>> Please look at the Section
>>>>>>>>>>
>>>>>>>>>> 2.1.3 Faces Request Generates Non-Faces Response
>>>>>>>>>>
>>>>>>>>>> of the jsf 1.1 spec.
>>>>>>>>>>
>>>>>>>>>> Regards
>>>>>>>>>>
>>>>>>>>>> Bernd
>>>>>>>>>>
>>>>>>>>>> Andreas Niemeyer schrieb:
>>>>>>>>>>                     
>>>>>>>>>>> Hi,
>>>>>>>>>>>
>>>>>>>>>>> I would like to send form data from a JSF page for a servlet
>>>>>>>>>>> request
>>>>>>>>>>> with a navigation rule.
>>>>>>>>>>>
>>>>>>>>>>> The servlet returns a content type of "application/pdf" and is
>>>>>>>>>>> running
>>>>>>>>>>> in a context path.
>>>>>>>>>>>
>>>>>>>>>>> If I call it from within a action method, it works with following
>>>>>>>>>>> code:
>>>>>>>>>>>
>>>>>>>>>>> public String createPDFReport() {
>>>>>>>>>>> ...
>>>>>>>>>>>  FacesContext context = FacesContext.getCurrentInstance();
>>>>>>>>>>>  ExternalContext ext = context.getExternalContext();
>>>>>>>>>>>
>>>>>>>>>>>  String vServletPath = "/context_path/pdf-test";
>>>>>>>>>>>  ext.redirect(ext.encodeResourceURL(vServletPath));
>>>>>>>>>>>
>>>>>>>>>>>  ...
>>>>>>>>>>>  return "call_servlet";
>>>>>>>>>>> }
>>>>>>>>>>>
>>>>>>>>>>>
>>>>>>>>>>> My context is a portal, I'm using the JSF portal bridge.
>>>>>>>>>>>
>>>>>>>>>>>
>>>>>>>>>>> The web.xml looks like:
>>>>>>>>>>>
>>>>>>>>>>> ...
>>>>>>>>>>> <servlet>
>>>>>>>>>>>  <servlet-name>pdf-test</servlet-name>
>>>>>>>>>>> <servlet-class>com.xxx.PDFTest</servlet-class>
>>>>>>>>>>>  <load-on-startup>20</load-on-startup>
>>>>>>>>>>> </servlet>    ...
>>>>>>>>>>>
>>>>>>>>>>> I would like to avoid to send a redirect and would prefer to
>>>>>>>>>>> create
>>>>>>>>>>> a
>>>>>>>>>>> navigation rule in the faces-config, but it fails with an
>>>>>>>>>>> exception
>>>>>>>>>>> arised from my GenericPortlet
>>>>>>>>>>>
>>>>>>>>>>> ...
>>>>>>>>>>>
>>>>>>>>>>> public class JSFGenericPortlet
>>>>>>>>>>>    extends org.apache.myfaces.portlet.MyFacesGenericPortlet {
>>>>>>>>>>> ...
>>>>>>>>>>> public void render(RenderRequest req, RenderResponse res)
>>>>>>>>>>>        throws IOException, PortletException {
>>>>>>>>>>> ...
>>>>>>>>>>> super.render(req, res);
>>>>>>>>>>> }
>>>>>>>>>>> ...
>>>>>>>>>>> }
>>>>>>>>>>>
>>>>>>>>>>> javax.portlet.PortletException: String index out of range: -1
>>>>>>>>>>>        at
>>>>>>>>>>>
>>>>>>>>>>> org.apache.myfaces.portlet.MyFacesGenericPortlet.handleExceptionFromLifecycle(MyFacesGenericPortlet.java:310)
>>>>>>>>>>>
>>>>>>>>>>>
>>>>>>>>>>>
>>>>>>>>>>>        at
>>>>>>>>>>>
>>>>>>>>>>> org.apache.myfaces.portlet.MyFacesGenericPortlet.facesRender(MyFacesGenericPortlet.java:502)
>>>>>>>>>>>
>>>>>>>>>>>
>>>>>>>>>>>
>>>>>>>>>>>        at
>>>>>>>>>>>
>>>>>>>>>>> org.apache.myfaces.portlet.MyFacesGenericPortlet.doView(MyFacesGenericPortlet.java:323)
>>>>>>>>>>>
>>>>>>>>>>>
>>>>>>>>>>>
>>>>>>>>>>>        at
>>>>>>>>>>> javax.portlet.GenericPortlet.doDispatch(GenericPortlet.java:328)
>>>>>>>>>>>        at
>>>>>>>>>>> javax.portlet.GenericPortlet.render(GenericPortlet.java:233)
>>>>>>>>>>>        at
>>>>>>>>>>>
>>>>>>>>>>> com.gutzmann.portlets.JSFGenericPortlet.render(JSFGenericPortlet.java:73)
>>>>>>>>>>>
>>>>>>>>>>>
>>>>>>>>>>>
>>>>>>>>>>>
>>>>>>>>>>> The navigation rule looks like:
>>>>>>>>>>>
>>>>>>>>>>>    <navigation-rule>
>>>>>>>>>>>        <from-view-id>/pages/view.xhtml</from-view-id>
>>>>>>>>>>>        <navigation-case>
>>>>>>>>>>>            <from-outcome>call_servlet</from-outcome>
>>>>>>>>>>>            <to-view-id>/pdf-test/</to-view-id>
>>>>>>>>>>>        </navigation-case>
>>>>>>>>>>>    </navigation-rule>
>>>>>>>>>>>
>>>>>>>>>>> I tried also `<to-view-id>/context_path/pdf-test/</to-view-id>' -
>>>>>>>>>>> same
>>>>>>>>>>> exception.
>>>>>>>>>>>
>>>>>>>>>>>
>>>>>>>>>>>
>>>>>>>>>>> What is the "best practice" to do such redirect / servlet calls?
>>>>>>>>>>>
>>>>>>>>>>>
>>>>>>>>>>> If request parameter should be changed, how would it work in the
>>>>>>>>>>> action
>>>>>>>>>>> method?
>>>>>>>>>>>
>>>>>>>>>>>
>>>>>>>>>>> Many thanks fro some help!
>>>>>>>>>>>
>>>>>>>>>>>
>>>>>>>>>>> Regards,
>>>>>>>>>>> Andreas
>>>>>>>>>>>
>>>>>>>>>>>
>>>>>>>>>>>
>>>>>>>>>>>
>>>>>>>>>>>
>>>>>>>>>>>
>>>>>>>>>>>                       
>>     
>
>   


-- 
-- Emails in "mixed" posting style will be ignored
-- (http://en.wikipedia.org/wiki/Posting_style)

Reply via email to