OpenRico is a Javascript for Rich Application library including ajax, drag&drop and many visual effects. Here explains ajax servlet with OpenRico.
The Ajax Servlet library AjaxServlet.py:
from WebKit.RPCServlet import RPCServlet class AjaxServlet(RPCServlet): def awake(self, transaction): RPCServlet.awake(self, transaction) self._response = transaction.response() self._request = transaction.request() self._session = transaction.session() self._resp = [] def sleep(self, transaction): RPCServlet.sleep(self, transaction) self._response = None self._request = None self._session = None self._resp = None def respondToGet(self, trans): try: # ajax servlet don't need cache resp = self.response() resp.setHeader('Cache-Control', 'no-cache') resp.setHeader('Pragma', 'no-cache'); self.writeln('<ajax-response>') self._respond() self.writeln('</response></ajax-response>') self.sendOK('text/xml', ''.join(self._resp), trans) finally: pass # do error handling or database release def request(self): return self._request def response(self): return self._response def transaction(self): return self._transaction def _respond(self): """ Here goes the response self.write('<span>Here is ajax response!!</span>') NOTE: You must call responseToElement() or responseToObject() before write something """ raise NotImplementedError def responseToElement(self, elementId): self.write('<response type="element" id="%s">' % elementId) def responseToObject(self, objectId): self.write('<response type="object" id="%s">' % objectId) def write(self, *args): for arg in args: self._resp.append(self.encode(str(arg))) def writeln(self, *args): self.write(*args) self.write("\n") def decode(self, str, encoding='euc-kr'): """ Decode JavaScript quoted string to native string """ ret = [] while s: if s[:2].lower() == '%u': # 유니코드 인코딩 char = s[:6] unicode_chr = int( char[2:], 16) try: ret.append( unichr(unicode_chr).encode(encoding) ) except UnicodeEncodeError: ret.append( '&#%s;' % unicode_chr ) s = s[6:] else: ret.append( s[0] ) s = s[1:] return ''.join(ret) def encode(self, str, encoding='euc-kr'): """ Encode string to HTML unicode representation """ p = string.printable ret = [] for c in unicode(str, encoding): if c in p: ret.append(c) else: ret.append( '&#%d;' % ord(c) ) return ''.join(ret)
search zipcode servlet example::
from AjaxServlet import * from Zipcode import * class ajax_search_zipcode(AjaxServlet): def _respond(self): self.responseToElement('search_result') zipcode_list = Zipcode.search(self.decode(self.request().field('dong'))) self.write("""<table cellspacing="1" cellpadding="1" width="100%" bgcolor="black" bordercolordark="#DDDDDD" bordercolorlight="#666666"> <tr align="center" bgcolor="#DDDDDD" height="22"> <td bgcolor="#DDDDDD">우편번호</td> <td bgcolor="#DDDDDD">주 소</td> <td bgcolor="#DDDDDD">선택</td> </tr>\n""") for z in zipcode_list: self.write( """<tr bgcolor="#DDDDDD"> <td bgcolor="#FFFFFF" style="white-space: nowrap;">%s</td> <td bgcolor="#FFFFFF" style="white-space: nowrap;">%s %s %s %s</td> <td bgcolor="#FFFFFF"><input type="button" value="선택" onClick="postaddr('%s', '%s');"/></td> </tr>\n""" % ( z[0], z[1], z[2], z[3], z[4], z[0], z[1] + z[2] + z[3] ) ) self.write('</table>')
for real working example:
goto http://www.bodd.co.kr/member_register (only korean site)
click button.
input "신림9" and click first button
-- whitekid