Servlet Filter with XTP -- Vary
Resin 3.0

Features
Installation
Configuration
Web Applications
IOC/AOP
Resources
JSP
Quercus
Servlets and Filters
Databases
Admin (JMX)
CMP
EJB
Amber
EJB 3.0
Security
XML and XSLT
XTP
JMS
Performance
Protocols
Third-party
Troubleshooting/FAQ

Introduction
User's Guide
Reference
Tutorials

Varying the XSL
Tutorials
Tutorials
JMS

This example uses a servlet filter to select the stylesheet that is used for XTP pages. If the user adds the style=plain query, the page will use a plain stylesheet. Otherwise the page will use a fancy stylesheet.

The Servlet 2.3 specification creates a new way to control servlets: filters. Filters can inspect and modify the request or response before and after passing the request to the servlet.

The filter itself just looks at the "style" parameter. If it's "plain", then the filter will set the caucho.xsl.stylesheet parameter to plain.xsl. XTP uses caucho.xsl.stylesheet when it transforms the page.

test.VaryFilter.java
package test;

import java.io.*;
import javax.servlet.*;
import javax.servlet.http.*;

public class VaryFilter implements Filter {
  private FilterConfig config;

  public void init(FilterConfig config)
  {
    this.config = config;
  }

  public void doFilter(ServletRequest request,
                       ServletResponse response,
                       FilterChain next)
    throws IOException, ServletException
  {
    HttpServletRequest req = (HttpServletRequest) request;

    String style = req.getParameter("style");

    if ("plain".equals(style))
      req.setAttribute("caucho.xsl.stylesheet", "plain.xsl");
    else
      req.setAttribute("caucho.xsl.stylesheet", "default.xsl");

    next.doFilter(request, response);
  }

  public void destroy()
  {
  }
}

web.xml
<web-app>
  <filter-mapping url-pattern='*.xtp'
                  filter-name='test.VaryFilter'/>
</web-app>

The sample Serif page has a small section and some content. It's parsed as HTML before using the stylesheets. The default stylesheet will color the section header red. The plain stylesheet leaves it as black.

test.xtp
<title>A Sample Title</title>

<s1 title="A Sample Section">

Some content in the sample section.

</s1>

Unknown tags are copied from the Serif page to the generated HTML page unchanged. So you can just add rules for tags you want to change. The example forces the background of the body to white and formats a section with an H3 header colored red.

default.xsl
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
                version="1.0">

  <!-- make sure '<' is not printed as '&lt;' -->
  <xsl:output disable-output-escaping='true'/>

  <!-- copy input to output -->
  <xsl:template match='*|@*'>
    <xsl:copy>
      <xsl:apply-templates select='node()|@*'/>
    </xsl:copy>
  </xsl:template>

  <xsl:template match="body">
    <body bgcolor=white>
      <xsl:apply-templates/>
    </body>
  </xsl:template>

  <xsl:template match="s1">
    <h3><font color=red><xsl:value-of select="@title"/></font></h3>
    <xsl:apply-templates/>
  </xsl:template>
</xsl:stylesheet>

The plain stylesheet leaves the Serif page untouched except for converting the section title to use plain H3.

plain.xsl
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
                version="1.0">

  <!-- make sure '<' is not printed as '&lt;' -->
  <xsl:output disable-output-escaping='true'/>

  <!-- copy input to output -->
  <xsl:template match='*|@*'>
    <xsl:copy>
      <xsl:apply-templates select='node()|@*'/>
    </xsl:copy>
  </xsl:template>

  <xsl:template match="s1">
    <h3><xsl:value-of select="@title"/></h3>
    <xsl:apply-templates/>
  </xsl:template>
</xsl:stylesheet>


Tutorials
Tutorials
JMS
Copyright © 1998-2006 Caucho Technology, Inc. All rights reserved.
Resin® is a registered trademark, and HardCoretm and Quercustm are trademarks of Caucho Technology, Inc.