cocoon-users mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From "Andreas Hartmann" <u...@cocooncenter.de>
Subject Re: how to call a servlet from a generator, but with parameters POSTed!
Date Wed, 13 Mar 2002 18:03:31 GMT


Hi Walter,

*********** REPLY SEPARATOR  ***********

On 13.03.2002 at 18:46 Walter Gamba wrote:

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

I had the same problem some months ago. And I re-implemented my servlets :(
I'm afraid there's no really elegant way to use POST (at least there wasn't one
when I tried it).

You might have a look at
http://marc.theaimsgroup.com/?t=101098813500002&r=1&w=2 ,
this thread contains some hints other people gave me about this topic.

Greetings,
Andreas

>----------------------------------------------
>
>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 -->
>    <map:generator 
>name="testgen"        logger="sitemap.generator.testgen" 
>label="content,data"
>                   src="TestGenerator"/>
>  <!-- ...... -->
>
>         <map:match pattern="test/test.html">
>
>                 <map:generate  type="testgen" >
>                         <map:parameter name="servlet-class" 
>value="TestServlet"/>
>                 </map:generate>
>
>                 < <map:serialize type="xml"/>
>         </map:match>
>
>
>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 xml.apache.org 
>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" 
>value="TestServlet"/>
>                 </map:generate>
>                 <map:transform src="stylesheets/prova/TestServlet.xsl"/>
>                 <map:serialize type="html"/>
>         </map:match>
>
>I've made the xsl such that it works fine with our testServlet and the 
>requestGenerator:
>...
>       <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 
>down..
>
>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: 
>java.lang.NullPointerException
>javax.xml.transform.TransformerException: java.lang.NullPointerException
>         at 
>org.apache.xalan.transformer.TransformerImpl.transformNode(TransformerImpl.java:1230)
>         at 
>org.apache.xalan.transformer.TransformerImpl.run(TransformerImpl.java:3139)
>         at java.lang.Thread.run(Thread.java:484)
>---------
>java.lang.NullPointerException
>         at 
>org.apache.xalan.transformer.TransformerImpl.applyTemplateToNode(TransformerImpl.java:1887)
>         at 
>org.apache.xalan.transformer.TransformerImpl.transformNode(TransformerImpl.java:1175)
>         at 
>org.apache.xalan.transformer.TransformerImpl.run(TransformerImpl.java:3139)
>         at java.lang.Thread.run(Thread.java:484)
>
>
>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!
>Thanx
>
>Walter Gamba
>
>-----------------------
>public synchronized void outputXML(String NSURI, Document doc)
>{
>         try{
>                 super.contentHandler.startDocument();
>                 //super.contentHandler.startPrefixMapping("",NSURI);
>                 transformDOM2SAX(super.contentHandler,doc);
>                 //super.contentHandler.endPrefixMapping("");
>                 super.contentHandler.endDocument();
>         }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);
>         try{
>           parser.parse(source, sdh);
>         }
>         catch(Exception npe){
>                 log.error("Errore in PARSE:"+npe,npe);
>         }
>         //writer.close();
>         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
>walter@e-gramma.it
>E-Gramma srl
>via Palazzo di Citta' 8 - 10122 TORINO
>tel 011-5136583 fax 011-5136582
>www.e-gramma.it
>
>
>---------------------------------------------------------------------
>Please check that your question has not already been answered in the
>FAQ before posting. <http://xml.apache.org/cocoon/faqs.html>
>
>To unsubscribe, e-mail: <cocoon-users-unsubscribe@xml.apache.org>
>For additional commands, e-mail: <cocoon-users-help@xml.apache.org>




---------------------------------------------------------------------
Please check that your question has not already been answered in the
FAQ before posting. <http://xml.apache.org/cocoon/faqs.html>

To unsubscribe, e-mail: <cocoon-users-unsubscribe@xml.apache.org>
For additional commands, e-mail: <cocoon-users-help@xml.apache.org>


Mime
View raw message