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('')
self._respond()
self.writeln('')
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('Here is ajax response!!')
NOTE: You must call responseToElement() or responseToObject() before write something
"""
raise NotImplementedError
def responseToElement(self, elementId):
self.write('' % elementId)
def responseToObject(self, objectId):
self.write('' % 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("""')
for real working example:
1. goto http://www.bodd.co.kr/member_register (only korean site)
2. click |image| button.
3. input "신림9" and click first button
.. |image| image:: http://www.bodd.co.kr/image/btn_zipcodesearch.jpg
-- whitekid_