You are viewing a plain text version of this content. The canonical link for it is here.
Posted to users@myfaces.apache.org by Andreas Niemeyer <an...@gutzmann.com> on 2008/12/10 15:27:06 UTC

Re: JSF servlet request in action method or navigation rule to get binary servlet data?

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" 
>> <an...@gutzmann.com>
>> To: <us...@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
>>>>>>>
>>>>>>>
>>>>>>>
>>>>>>>
>>>>>>>
>>>>>>>
>>>>>
>>>>
>>>
>>>
>>
>>
> 
> 


Re: JSF servlet request in action method or navigation rule to get binary servlet data?

Posted by Andreas Niemeyer <an...@gutzmann.com>.
Hello Simon, hello Bernd,

It's exactly what I did. I put some session data in the session scope 
for the servlet.

Your approach sounds good. More than one solution now available :)

@Bernd: for this case with the redirect in the action method it makes no 
difference for the lifecycle behaviour.  Yes I tried it, but..


The variant with the JavaScript to `clear' the faces messages works fine 
and was at least the simplest. When validation in that action method 
fails, new faces messages appears again, the page is reloaded and the 
<div> css property for visibility is as it was declared (without that 
property)

Thank you all for your help!


Regards,
Andreas


Simon Kitching schrieb:
> 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
>>>> <an...@gutzmann.com> 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"
>>>>>>> <an...@gutzmann.com>
>>>>>>> To: <us...@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
>>>>>>>>>>>>
>>>>>>>>>>>>
>>>>>>>>>>>>
>>>>>>>>>>>>
>>>>>>>>>>>>
>>>>>>>>>>>>
>>>>>>>>>>>>                       
>>>     
>>   
> 
> 


Re: JSF servlet request in action method or navigation rule to get binary servlet data?

Posted by Simon Kitching <sk...@apache.org>.
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
>>> <an...@gutzmann.com> 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"
>>>>>> <an...@gutzmann.com>
>>>>>> To: <us...@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)


Re: JSF servlet request in action method or navigation rule to get binary servlet data?

Posted by Bernd Bohmann <be...@atanion.com>.
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
>> <an...@gutzmann.com> 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"
>>>>> <an...@gutzmann.com>
>>>>> To: <us...@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
>>>>>>>>>>
>>>>>>>>>>
>>>>>>>>>>
>>>>>>>>>>
>>>>>>>>>>
>>>>>>>>>>
>>>>>>
>>>>>
>>>>
>>>
>>
> 
> 

Re: JSF servlet request in action method or navigation rule to get binary servlet data?

Posted by Andreas Niemeyer <an...@gutzmann.com>.
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
> <an...@gutzmann.com> 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"
>>>> <an...@gutzmann.com>
>>>> To: <us...@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
>>>>>>>>>
>>>>>>>>>
>>>>>>>>>
>>>>>>>>>
>>>>>>>>>
>>>>>>>>>
>>>>>
>>>>
>>>
>>
> 


Re: JSF servlet request in action method or navigation rule to get binary servlet data?

Posted by Richard Yee <ri...@gmail.com>.
Try using divelement.style.display="none"

Regards,

Richard


On Wed, Dec 10, 2008 at 6:27 AM, Andreas Niemeyer
<an...@gutzmann.com> 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"
>>> <an...@gutzmann.com>
>>> To: <us...@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
>>>>>>>>
>>>>>>>>
>>>>>>>>
>>>>>>>>
>>>>>>>>
>>>>>>>>
>>>>>>
>>>>>
>>>>
>>>>
>>>
>>>
>>
>>
>
>