| |
Servlet Filter with XTP -- Vary |
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.
This example uses a servlet filter to select a stylesheet Serif
(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 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. Serif uses
caucho.xsl.stylesheet to transform the page to HTML.
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 '<' -->
<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 '<' -->
<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>
|
Copyright © 1998-2002 Caucho Technology, Inc. All rights reserved.
Resin® is a registered trademark,
and HardCoretm and Quercustm are trademarks of Caucho Technology, Inc. | |
|