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