You are viewing a plain text version of this content. The canonical link for it is here.
Posted to users@myfaces.apache.org by "Hoehmann, Andreas" <an...@siemens.com> on 2008/03/31 17:42:57 UTC

Exclude servlet-response from extension-filter

Hello,

How can i exclude the response of a download-action for the
extension-filter?

My bean write the result directly to the faces-response:

private boolean writeOutContent(final HttpServletResponse res, final
File content, final String theFilename) {
    boolean result = true;
    if (content != null) {
      try {
        res.reset();
        final WritableByteChannel writeChannelOut =
Channels.newChannel(res.getOutputStream());
        final ReadableByteChannel readChannelIn =
Channels.newChannel(new FileInputStream(content));
        res.setHeader("Pragma", "no-cache");
        res.setDateHeader("Expires", 0);
        // set content type so that the browser shows xml filter in save
dialog
        res.setContentType("text/xml");
        res.setHeader("Content-disposition", "attachment; filename=" +
theFilename);
        ChannelTools.fastChannelCopy(readChannelIn, writeChannelOut);
      } catch (final IOException e) {
        result = false;
      }
    } else {
      result = false;
    }
    return result;
  }

  private String download() {
    final FacesContext facesContext = FacesContext.getCurrentInstance();
    writeOutContent(getServletResponse(), new File(this.filename),
getFilename());
    facesContext.responseComplete();
    return null;
  }

I found these lines in ExtensionFilter:

public boolean isValidContentType(String contentType)
    {
        return contentType.startsWith("text/html") ||
                contentType.startsWith("text/xml") ||
                contentType.startsWith("application/xhtml+xml") ||
                contentType.startsWith("application/xml");
    }

I must return a text/xml but i dont want filter the content with the
extension-filter. Is this possible?

My web.xml:

<filter-mapping>
    <filter-name>MyFacesExtensionsFilter</filter-name>
    <servlet-name>FacesServlet</servlet-name>
  </filter-mapping>
  <filter-mapping>
    <filter-name>MyFacesExtensionsFilter</filter-name>
    <url-pattern>*.jsf</url-pattern>
  </filter-mapping>

Regards
hoehmi

AW: Exclude servlet-response from extension-filter

Posted by "Hoehmann, Andreas" <an...@siemens.com>.
> -----Ursprüngliche Nachricht-----
> Von: simon [mailto:simon.kitching@chello.at] 
> Gesendet: Montag, 31. März 2008 21:50
> An: MyFaces Discussion
> Betreff: Re: Exclude servlet-response from extension-filter
> 
> 
> On Mon, 2008-03-31 at 17:42 +0200, Hoehmann, Andreas wrote:
> > Hello,
> > 
> > How can i exclude the response of a download-action for the
> > extension-filter?
> > 
> > My bean write the result directly to the faces-response:
> > 
> > private boolean writeOutContent(final HttpServletResponse res, final
> > File content, final String theFilename) {
> >     boolean result = true;
> >     if (content != null) {
> >       try {
> >         res.reset();
> >         final WritableByteChannel writeChannelOut =
> > Channels.newChannel(res.getOutputStream());
> >         final ReadableByteChannel readChannelIn =
> > Channels.newChannel(new FileInputStream(content));
> >         res.setHeader("Pragma", "no-cache");
> >         res.setDateHeader("Expires", 0);
> >         // set content type so that the browser shows xml 
> filter in save
> > dialog
> >         res.setContentType("text/xml");
> >         res.setHeader("Content-disposition", "attachment; 
> filename=" +
> > theFilename);
> >         ChannelTools.fastChannelCopy(readChannelIn, 
> writeChannelOut);
> >       } catch (final IOException e) {
> >         result = false;
> >       }
> >     } else {
> >       result = false;
> >     }
> >     return result;
> >   }
> > 
> >   private String download() {
> >     final FacesContext facesContext = 
> FacesContext.getCurrentInstance();
> >     writeOutContent(getServletResponse(), new File(this.filename),
> > getFilename());
> >     facesContext.responseComplete();
> >     return null;
> >   }
> > 
> > I found these lines in ExtensionFilter:
> > 
> > public boolean isValidContentType(String contentType)
> >     {
> >         return contentType.startsWith("text/html") ||
> >                 contentType.startsWith("text/xml") ||
> >                 contentType.startsWith("application/xhtml+xml") ||
> >                 contentType.startsWith("application/xml");
> >     }
> > 
> > I must return a text/xml but i dont want filter the content with the
> > extension-filter. Is this possible?
> > 
> > My web.xml:
> > 
> > <filter-mapping>
> >     <filter-name>MyFacesExtensionsFilter</filter-name>
> >     <servlet-name>FacesServlet</servlet-name>
> >   </filter-mapping>
> >   <filter-mapping>
> >     <filter-name>MyFacesExtensionsFilter</filter-name>
> >     <url-pattern>*.jsf</url-pattern>
> >   </filter-mapping>
> 
> Why does it matter? If your page contains no components that register
> resources to be inserted, then the output you generate will not be
> modified.

I got a error from myfaces:

10:18:34 ERROR - org.apache.myfaces.renderkit.html.util.ReducedHTMLParser:653 - Malformed end tag at line 41; skipping p
arsing

I want separate my download-function (rich:htmlCommandlink) which returns a xml-file from the rest of my application/ui.
It should doesn't matter which other components used on the page with the download-link. The download-bean reset the 
faces-response and return a none-faces-xml-content ... 

exists a "Best Practice" for such a scenario?

> 
> If for some reason you really care, then you can switch to using the
> StreamingAddResources implementation rather than the 
> DefaultAddResources
> one. This has some limitations (esp. not supporting components
> registering stylesheets for themselves), but does not buffer output.
> 

I don't want code a face-component ... So this is not a solution for my problem :-)

> This is all explained in the javadoc for the ExtensionsFilter class in
> svn trunk; see the current javadocs on the tomahawk website.
> 
> Regards,
> Simon

Regards
hoehmi

Re: Exclude servlet-response from extension-filter

Posted by simon <si...@chello.at>.
On Mon, 2008-03-31 at 17:42 +0200, Hoehmann, Andreas wrote:
> Hello,
> 
> How can i exclude the response of a download-action for the
> extension-filter?
> 
> My bean write the result directly to the faces-response:
> 
> private boolean writeOutContent(final HttpServletResponse res, final
> File content, final String theFilename) {
>     boolean result = true;
>     if (content != null) {
>       try {
>         res.reset();
>         final WritableByteChannel writeChannelOut =
> Channels.newChannel(res.getOutputStream());
>         final ReadableByteChannel readChannelIn =
> Channels.newChannel(new FileInputStream(content));
>         res.setHeader("Pragma", "no-cache");
>         res.setDateHeader("Expires", 0);
>         // set content type so that the browser shows xml filter in save
> dialog
>         res.setContentType("text/xml");
>         res.setHeader("Content-disposition", "attachment; filename=" +
> theFilename);
>         ChannelTools.fastChannelCopy(readChannelIn, writeChannelOut);
>       } catch (final IOException e) {
>         result = false;
>       }
>     } else {
>       result = false;
>     }
>     return result;
>   }
> 
>   private String download() {
>     final FacesContext facesContext = FacesContext.getCurrentInstance();
>     writeOutContent(getServletResponse(), new File(this.filename),
> getFilename());
>     facesContext.responseComplete();
>     return null;
>   }
> 
> I found these lines in ExtensionFilter:
> 
> public boolean isValidContentType(String contentType)
>     {
>         return contentType.startsWith("text/html") ||
>                 contentType.startsWith("text/xml") ||
>                 contentType.startsWith("application/xhtml+xml") ||
>                 contentType.startsWith("application/xml");
>     }
> 
> I must return a text/xml but i dont want filter the content with the
> extension-filter. Is this possible?
> 
> My web.xml:
> 
> <filter-mapping>
>     <filter-name>MyFacesExtensionsFilter</filter-name>
>     <servlet-name>FacesServlet</servlet-name>
>   </filter-mapping>
>   <filter-mapping>
>     <filter-name>MyFacesExtensionsFilter</filter-name>
>     <url-pattern>*.jsf</url-pattern>
>   </filter-mapping>

Why does it matter? If your page contains no components that register
resources to be inserted, then the output you generate will not be
modified.

If for some reason you really care, then you can switch to using the
StreamingAddResources implementation rather than the DefaultAddResources
one. This has some limitations (esp. not supporting components
registering stylesheets for themselves), but does not buffer output.

This is all explained in the javadoc for the ExtensionsFilter class in
svn trunk; see the current javadocs on the tomahawk website.

Regards,
Simon