Ajaxservlet

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:

  1. goto http://www.bodd.co.kr/member_register (only korean site)

  2. click image button.

  3. input "신림9" and click first button

-- whitekid