W3C home > Mailing lists > Public > www-forms@w3.org > October 2008

Re: sending xml response from servlet

From: Aaron Reed <aaronr@us.ibm.com>
Date: Wed, 08 Oct 2008 01:52:25 -0500
To: www-forms@w3.org
Message-ID: <gchlgk$83q$1@ger.gmane.org>

Hi Celarin,

It took me a while to find it.  I don't have it currently running on a 
server to test it, but it should work.  Let me know if it doesn't. 
Don't forget to fix the line wrapping before you try to use it.

import java.io.IOException;
import java.io.InputStream;

import javax.servlet.ServletException;
import javax.servlet.ServletOutputStream;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;

import org.apache.xml.serialize.DOMSerializer;
import org.apache.xml.serialize.OutputFormat;
import org.apache.xml.serialize.XMLSerializer;
import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;

/**
  * @version 	1.0
  * @author
  */
public class ChangePassword extends HttpServlet {

	/**
	* @see javax.servlet.http.HttpServlet#void 
(javax.servlet.http.HttpServletRequest, 
javax.servlet.http.HttpServletResponse)
	*/
	public void doGet(HttpServletRequest req, HttpServletResponse resp)
		throws ServletException, IOException {
			
			System.out.println("doGet hit");
			doWork(req, resp);

	}

	/**
	* @see javax.servlet.http.HttpServlet#void 
(javax.servlet.http.HttpServletRequest, 
javax.servlet.http.HttpServletResponse)
	*/
	public void doPost(HttpServletRequest req, HttpServletResponse resp)
		throws ServletException, IOException {
			
			System.out.println("doPost hit");
			doWork(req, resp);

	}
	
	public void doWork(HttpServletRequest req, HttpServletResponse resp)
		throws ServletException, IOException {
			
	  String contentType = req.getContentType();
	  if(contentType.equalsIgnoreCase("text/xml") || 
contentType.equalsIgnoreCase("application/xml")) {
	  	InputStream inputStream = req.getInputStream();
	    DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
	    try {
	      DocumentBuilder docBuilder = factory.newDocumentBuilder();
	      Document doc = docBuilder.parse(inputStream);
	      if(doc != null) {
	      	boolean result = changePassword(doc);
	      	if (result == true) {
	          resp.setContentType(contentType);
	          // following code serializes dom to xml file

               OutputFormat of =  new OutputFormat(doc);
               of.setIndenting(false);
               ServletOutputStream outputStream = resp.getOutputStream();
               XMLSerializer serializer = new XMLSerializer();
               serializer.setOutputFormat(of);
               serializer.setOutputByteStream(outputStream);
               DOMSerializer domSerializer = serializer.asDOMSerializer();
               domSerializer.serialize(doc);
               outputStream.flush();
               outputStream.close();
	      	}
	      }
	    }
	    catch (Exception e) {
	    	e.printStackTrace();
	    }
	  }

	}
	
	public boolean changePassword(Document doc) {
	  Element rootElement = doc.getDocumentElement();
	  if (rootElement != null) {
	    NodeList list = rootElement.getElementsByTagName("password");
	  	if (list != null ) {
	  	  int len = list.getLength();
	  	  for (int i=0; i < len; i++) {
	  	    Node password = list.item(i);
	  	    Node passwordText = password.getFirstChild();
	  	
	  	    if (passwordText.getNodeType()!=Node.TEXT_NODE) {
	  	      return false;
	  	    }
	  	    String value = passwordText.getNodeValue();
	  	    StringBuffer strbuff = new StringBuffer(value);
	  	    int valueLen = strbuff.length();
	  	    for (int j=0; j < valueLen; j++) {
	  	      char oldchar = strbuff.charAt(j);
	  	      strbuff.setCharAt(j, (char)(oldchar+1));
	  	    }
	  	
	  	    passwordText.setNodeValue(strbuff.toString());
	  	  }
	    }
	  }
	  return true;
	}

}

--Aaron

celarin wrote:
> Hi Aaron,
>    Could you please post your whole servlet code with the sevlet doPost?It
> would be really helpful.
> Thank You.
> Celarin
> 
> Aaron Reed wrote:
>>
>> Hi Iñaki,
>>
>> I am no servlet or java guru by any stretch of the imagination, but this 
>> is what I did to build a simple servlet that got a xml document from 
>> xforms, tweaked a few text nodes in it (via the method 
>> changePassword()), and then sent back a xml response to replace the 
>> instance that was sent:
>>
>> public void doWork(HttpServletRequest req, HttpServletResponse resp)
>> 		throws ServletException, IOException {
>> 			
>> 	  String contentType = req.getContentType();
>> 	  if(contentType.equalsIgnoreCase("text/xml") || 
>> contentType.equalsIgnoreCase("application/xml")) {
>> 	  	InputStream inputStream = req.getInputStream();
>> 	    DocumentBuilderFactory factory =
>> DocumentBuilderFactory.newInstance();
>> 	    try {
>> 	      DocumentBuilder docBuilder = factory.newDocumentBuilder();
>> 	      Document doc = docBuilder.parse(inputStream);
>> 	      if(doc != null) {
>> 	      	boolean result = changePassword(doc);
>> 	      	if (result == true) {
>> 	          resp.setContentType(contentType);
>> 	          // following code serializes dom to xml file
>>
>>                OutputFormat of =  new OutputFormat(doc);
>>                of.setIndenting(false);
>>                ServletOutputStream outputStream = resp.getOutputStream();
>>                XMLSerializer serializer = new XMLSerializer();
>>                serializer.setOutputFormat(of);
>>                serializer.setOutputByteStream(outputStream);
>>                DOMSerializer domSerializer = serializer.asDOMSerializer();
>>                domSerializer.serialize(doc);
>>                outputStream.flush();
>>                outputStream.close();
>> 	      	}
>> 	      }
>> 	    }
>> 	    catch (Exception e) {
>> 	    	e.printStackTrace();
>> 	    }
>> 	  }
>>
>> 	}
>>
>> Again, I don't know if this is the way a 'real' app designer would do 
>> it, but it worked for me in my little test scenario.
>>
>> Good luck,
>> --Aaron
>>
>>
>> Iñaki Salinas Bueno wrote:
>>> Hello,
>>>
>>> Can someone recommend me a set of libraries that allow a servlet 
>>> receive/send XML documents from/to xforms? I have found several 
>>> libraries, but I don't know which is more adapted for what I want to do.
>>>
>>> I'm using xforms in client side and a servlet for xindice (DB manager) 
>>> calls in server side.
>>>
>>> The servlet gets the xml document from xforms and add it in the DB 
>>> correctly (I used a Xindice web application example and the tip 'Xforms 
>>> tip: Accepting XForms data in Java 
>>> <http://www-128.ibm.com/developerworks/java/library/x-xformstipjava/index.html>' 
>>> for its construction), but I don't know how can I get a XML document 
>>> from DB and put it in the response object of the servlet.
>>>
>>> The example of the tip works with strings, so following it for the 
>>> response I would have to take the XML document of the DB, transform it 
>>> into a string, and then send it. Cannot be the XML document sent as 
>>> application/xml without transforming it into a string?
>>>
>>> Maybe questions are more java related than xforms, but they are 
>>> working-with-xml related so I think that I can found help in this forum.
>>>
>>> Thanks
>>> Iñaki
>>
>>
>>
>>
> 
Received on Wednesday, 8 October 2008 18:43:18 GMT

This archive was generated by hypermail 2.2.0+W3C-0.50 : Saturday, 10 March 2012 06:22:14 GMT