I know WOXMLRPCTest is a completely useless example. Here's a slightly better example: ======================================================================= import com.apple.yellow.foundation.*; // this class will be used as a "handler" public class SillyExample extends Object { private int total; private int count; private NSMutableArray numbers; public SillyExample() { super(); count = 0; total = 0; numbers = NSMutableArray(); } public int getCount() { return count; } public boolean rememberThisNumber (int x) { numbers.addObject(new Integer(x)); count++; total += x; return true; } public int getTotal() { return total; } public NSArray getNumbers() { return numbers; } public int sum(int a, int b) { return a+b; } public String coerceNumberToString(int a) { return Integer.toString(a); } } ======================================================================= import com.roepcke.jim.xmlrpc.*; import com.apple.yellow.webobjects.*; // note: you could make DirectAction.java extends WOXmlRpc instead! public class YourDAClass extends WOXmlRpc { public XmlRpcDirectAction(WORequest aRequest) { super(aRequest); } // inherits RPC2Action from WOXmlRpc } ======================================================================= import com.roepcke.jim.xmlrpc.*; import com.apple.yellow.webobjects.*; public class Application extends WOApplication { super(); XmlRpc.setDriver(com.ibm.xml.parsers.SAXParser.class); WOXmlRpc.addHandler("sillymath", new SillyExample()); } ======================================================================= Basically, you can make ANY object a handler on your XmlRpcServer, it doesn't have to implement XmlRpcHandler... XmlRpcServer will figure out how to call the methods on your object by using Java Reflection. If your handler object DOES implement XmlRpcHandler, XmlRpcServer will call execute(String method, NSArray params) instead of the other methods in the class. This way you have full control over the method name and parameters, making things more dynamic. SillyExample is a little contrived because it actually stores STATE, but they don't have to. A lot of handlers are just query systems, for example... no state, just a bunch of methods which churn and return objects. BTW, to CALL those methods you'd access: http://localhost/cgi-bin/WebObjects/App.woa/wa/YourDAClass/RPC2 ...with your XmlRpcClient. The method would be "sillymath.whatever", where whatever is the name of the method you're calling. For example, "sillymath.rememberThisNumber". For the params to the client, you pass an NSArray of the parameters in the order they appear in the method signature. You have to wrap numbers and booleans in their object wrappers, for example: NSMutableArray params = new NSMutableArray(); params.addObject(new Integer(1)); params.addObject(new Integer(2)); String url; url = "http://localhost/cgi-bin/WebObjects/App.woa/wa/YourDAClass/RPC2" try { XmlRpcClient client = new XmlRpcClient(url); // can throw MalformedURLException Integer value = client.execute("sillymath.sum", params); // can throw XmlRpcException, IOException System.out.println("value: " + value.toString()); } catch (MalformedURLException mu_e) { System.out.println("mu_e: " + mu_e.getMessage()); } catch (XmlRpcException xmlrpc_e) { System.out.println("xmlrpc_e: " + xmlrpc_e.getMessage()); } catch (IOException io_e) { System.out.println("io_e: " + io_e.getMessage()); }