cocoon-users mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From Walter Gamba <>
Subject how to call a servlet from a generator, but with parameters POSTed!
Date Wed, 13 Mar 2002 17:46:16 GMT

SUMMARY: How to use a servlet as a generator in Cocoon, but allowing forms 
data to be passed via POST method (And NOT GET!!)

We use Cocoon 2.0.1 and Tomcat 3.2.1, JDK 1.3.1.

I've been trying to solve this proble since a week, but I've been quite 
unlucky, everyone refers to FileGenerator and HTMLGenrator, which doesn't 
work with a Servlet that needs POSTed parameters.

I have a big servlet-based application that must be used from Cocoon. If 
possible, without rewrinting the whole application...
This servlet generates XML responses, that are translated by cocoon to HTML.
UNtil now we have used the request Action to invoke the servlet URL in the 
generator appending the query string, thus
GET ting the parameters to the servlet.

So for example the servlet is invoked in the generator by wrintig something 
like this

<map:generator src="it.test.BigServlet?{QUERY_STRING}"/>

This worked fine for a test environment, but now we must go online.. and we 
must handle submit from forms that can have long input texts. So we need to 
POST data.

I've written a generator that calls directly the (modified) Servlet code 
(that runs in the same Tomcat installation) by passing HttpRequest and 
HttpResponse to a ad-hoc service() method .. thus avoiding the overhead of 
another URL request.

THe Generator emulates instantiation of servlet, intialization(only 
once..), and service calling.. the acutal sending of SAX events in the 
pipeline is done via a callback method in the generator.
Since the servlet generates internally a Document (DOM), this Document must 
be "output" using a SAX parser, in the aforementioned  callback method of 
the generator. (see later for details)

If i put in the sitemap.xconf

<!-- define new generator -->
name="testgen"        logger="sitemap.generator.testgen" 
  <!-- ...... -->

         <map:match pattern="test/test.html">

                 <map:generate  type="testgen" >
                         <map:parameter name="servlet-class" 

                 < <map:serialize type="xml"/>

I can obtain correct XML output, provided I am happy  with the raw XML and 
i don't translate it .. (and a side question could be.. how can I make the 
transformation from DOM to SAX efficiently, using some 
library..  without serializing the DOM on a Stream and parsing it back?? 
THis brute force approach is the one I use now... but this is another 
question.. i suppose.. )

THe Problem arises when I add a Trasformer:

         <map:match pattern="prova/test.html">
                 <map:generate  type="testgen" >
                         <map:parameter name="servlet-class" 
                 <map:transform src="stylesheets/prova/TestServlet.xsl"/>
                 <map:serialize type="html"/>

I've made the xsl such that it works fine with our testServlet and the 
       <map:generate  type="request" />
      <map:transform src="stylesheets/prova/TestServlet.xsl"/>

With the request generator it works fine and I get neatly formatted HTML, 
with our servlet, that apparently generates the same kind of XMLm it breaks 

Or, to be correct, it does not match any tags. The XSL is read because in 
the browser the basic HTML tags and title of the page (as specified inthe 
top level XSL "/" template-mathcing rule) are displayed, but any further 
XML tag is ignored, and moreover cocoon complains:

FATAL_E (2002-03-13) 09:54.57:446   [core.xslt-processor] 
(/cocoon/prova/test.html) Thread-20/TraxErrorHandler: Error in 
TraxTransformer: javax.xml.transform.TransformerException: 
javax.xml.transform.TransformerException: java.lang.NullPointerException

THat's it. I enclose the bit of code of the Generator that translated a DOM 
to SAX events.. perhaps there is something here that works with raw XML but 
breaks down when SAX events are sent down the pipeline..

Any help would be appreciated!

Walter Gamba

public synchronized void outputXML(String NSURI, Document doc)
         }catch(SAXException s){
                 log.error("Errore SAX!:"+s);

private static /* synchronized */ void transformDOM2SAX(ContentHandler 
cHandler, Document doc) {
  //brute force way
try {
         //1) open stream
         CharArrayWriter writer = new CharArrayWriter();

         printDocument(writer, doc);

         //2) create SAX parserthat can read from stream
         SAXParserFactory spf = SAXParserFactory.newInstance();
         SAXParser parser = spf.newSAXParser();

         //3) build a reader and InputSource
         Reader reader = new CharArrayReader(writer.toCharArray());
         InputSource source = new InputSource(reader);

         log.debug("TestGenerator::transformDOM2SAX -> parse");
         ServletDefaultHandler sdh=new ServletDefaultHandler(cHandler);
           parser.parse(source, sdh);
         catch(Exception npe){
                 log.error("Errore in PARSE:"+npe,npe);
         log.debug("TestGenerator::transformDOM2SAX -> end parse");

catch (IOException ioe) {
         log.error("Errore in creazione reader/writer oppure in source:" + 
ioe, ioe);
catch (ParserConfigurationException pfe) {
         log.error("Errore parseconfig!:" + pfe, pfe);
catch (SAXException sax) {
         log.error("Errore sax!:" + sax, sax);

Walter Gamba
E-Gramma srl
via Palazzo di Citta' 8 - 10122 TORINO
tel 011-5136583 fax 011-5136582

Please check that your question has not already been answered in the
FAQ before posting. <>

To unsubscribe, e-mail: <>
For additional commands, e-mail: <>

View raw message