Thanks,Evgeny! Thank for share these code! I had read them.I used TunnelService replacing custom finder that you used,'cause I think TunnelService is easy for using.But I'd learned how to using custom finder to implement same function from them.
On Fri, Feb 15, 2008 at 12:40 AM, Evgeny Shepelyuk <[EMAIL PROTECTED]> wrote: > cleverpig <greatcleverpig <at> gmail.com> writes: > > > > > > I post this draft in wiki.restlet.org--"Using AJAX in > > Restlet":http://wiki.restlet.org/docs_1.1/g1/43-restlet/52-restlet.html > > > > I will start this tutorial with a simply example-"microblog",that's a > > text based micro blog for demo how to using AJAX in Restlet. > > Demo construction: > > * Web client: call background service via JSON protocol in full > > REST way(GET/PUT/POST/DELETE). > > * Server side: uses db4o to work as store service provider,and > > expose data in RESTful way. > > * Server handle process: Application dispatch request to > > Router,Router find corresponding reource,Resource handle request and > > return representation. > > > > Pls make review and point out drawback. > > > This is an example of usign prototype without proxying methods via POST. > > 1. HTML > <html lang="en"> > <head> > <script language="javascript" type="text/javascript" src="./prototype.js"></ > script> > <script type="text/javascript" language="JavaScript"> > function callJSON() { > new Ajax.Request('/ajax', { > parameters: 'name=PUT', method: 'put', putBody: "PUT BODY", > onComplete: function (transport) { > alert(transport.responseText); > } > }); > new Ajax.Request('/ajax', { > parameters: 'name=POST', method: 'post', > onComplete: function (transport) { > alert(transport.responseText); > } > }); > new Ajax.Request('/ajax', { > parameters: 'name=DELETE', method: 'delete', > onComplete: function (transport) { > alert(transport.responseText); > } > }); > } > </script> > </head> > > <body class="callingcards"> > <input type="button" onclick="callJSON();" value="PRESSME"> > </body> > </html> > > 2. Server starting class > > import org.restlet.data.*; > import org.restlet.*; > > public class Server { > public static void main(String[] args) throws Exception { > Component component = new Component(); > component.getServers().add(Protocol.HTTP, 8182); > component.getClients().add(Protocol.FILE); > > Application application = new Application(component.getContext > ()) { > @Override > public Restlet createRoot() { > Router router = new Router(getContext()); > router.setFinderClass(PrototypeFinder.class); > > router.attach("", new Directory(getContext(), > "file:///C:/json-restlet")); > router.attach("/ajax", AjaxResource.class); > > return router; > } > }; > component.getDefaultHost().attach("", application); > component.start(); > } > } > > 3. Custom Finder > > import org.restlet.Finder; > import org.restlet.Context; > import org.restlet.Handler; > import org.restlet.data.Request; > import org.restlet.data.Response; > import org.restlet.data.Parameter; > import org.restlet.data.Method; > > public class PrototypeFinder extends Finder { > public PrototypeFinder(Context context, Class<? extends Handler> > targetClass) { > super(context, targetClass); > } > > public void handle(Request request, Response response) { > Parameter p = request.getEntityAsForm().getFirst("_method"); > request.setMethod(null != p ? Method.valueOf(p.getValue()) : > request.getMethod()); > super.handle(request, response); > } > } > > 4. Resource class > > import org.restlet.resource.*; > import org.restlet.Context; > import org.restlet.ext.json.JsonRepresentation; > import org.restlet.data.Request; > import org.restlet.data.Response; > import org.restlet.data.MediaType; > import org.json.JSONObject; > import org.json.JSONArray; > > import java.util.Arrays; > > public class AjaxResource extends Resource { > > public AjaxResource(Context context, Request request, Response > response) { > super(context, request, response); > > getVariants().add(new Variant(MediaType.TEXT_HTML)); > getVariants().add(new Variant(MediaType.TEXT_PLAIN)); > } > > public Representation represent(Variant variant) throws > ResourceException { > return new StringRepresentation("some data", > MediaType.TEXT_ALL); > } > > public void acceptRepresentation(Representation representation) throws > ResourceException { > getResponse().setEntity(new StringRepresentation("PLAIN TEXT > for POST", MediaType.TEXT_PLAIN)); > } > > public void removeRepresentations() throws ResourceException { > getResponse().setEntity(new StringRepresentation("PLAIN TEXT > for DELETE", MediaType.TEXT_PLAIN)); > } > > public void storeRepresentation(Representation representation) throws > ResourceException { > getResponse().setEntity(new StringRepresentation("PLAIN TEXT > for PUT", MediaType.TEXT_PLAIN)); > } > > public boolean allowPost() { > return true; > } > > public boolean allowDelete() { > return true; > } > > public boolean allowPut() { > return true; > } > } > > -- cleverpig Location: Beijing Address: Room 4018,No.A2 South Avenue Fuxingmen Beijing,P.R.China Zipcode: 100031 Phone: 010-66415588-1113 MSN: [EMAIL PROTECTED] QQ: 149291732 Skepe: cleverpigatmatrix My Facebook ID:cleverpig My Blog: hihere.sohu.com My Tags: del.icio.us/cleverpig My Twitter: twitter.com/cleverpig My Organization: www.beijing-open-party.org 一些值得关注的唧歪: http://jiwai.de/t/jmatrix/ http://jiwai.de/t/db4o/ http://jiwai.de/t/matrix-community/