Return-Path: Delivered-To: apmail-jakarta-taglibs-dev-archive@apache.org Received: (qmail 11498 invoked from network); 24 Jan 2002 19:28:07 -0000 Received: from unknown (HELO nagoya.betaversion.org) (192.18.49.131) by daedalus.apache.org with SMTP; 24 Jan 2002 19:28:07 -0000 Received: (qmail 25677 invoked by uid 97); 24 Jan 2002 19:27:30 -0000 Delivered-To: qmlist-jakarta-archive-taglibs-dev@jakarta.apache.org Received: (qmail 25600 invoked by uid 97); 24 Jan 2002 19:27:29 -0000 Mailing-List: contact taglibs-dev-help@jakarta.apache.org; run by ezmlm Precedence: bulk List-Unsubscribe: List-Subscribe: List-Help: List-Post: List-Id: "Tag Libraries Developers List" Reply-To: "Tag Libraries Developers List" Delivered-To: mailing list taglibs-dev@jakarta.apache.org Received: (qmail 25522 invoked from network); 24 Jan 2002 19:27:29 -0000 From: Christopher Lenz To: Tag Libraries Developers List Date: Thu, 24 Jan 2002 20:28:19 +0100 X-Priority: 3 (Normal) Message-Id: <3XWV1T08A0B9SPA08NM41PJRQEURJG.3c506053@athlon> Subject: [standard] [PATCH] More EcmaScript improvements MIME-Version: 1.0 Content-Type: multipart/mixed; boundary="----------u8SBS05cQLLmxuMluIM49D" X-Mailer: Opera 6.0 build 1010 X-Spam-Rating: daedalus.apache.org 1.6.2 0/1000/N X-Spam-Rating: daedalus.apache.org 1.6.2 0/1000/N ------------u8SBS05cQLLmxuMluIM49D Content-Type: text/plain; charset="windows-1252" Hi all, Seeing that my other changes to the EcmaScript in JSTL support were committed, I'm sending another patch. This time it's a pretty complete overhaul of the way the JavascriptExpressionEvaluator is implemented: - Multiple scopes for script execution: Inspired by the tips and guidelines in the "Embedding Rhino" section of the Rhino documentation, I've split the execution scope for scripts into three parts: Global (cached as application context attribute), Page (cached as page context attribute) and Local (created for every expression evaluation). This improves performance because the standard JavaScript objects only need to be initialized once during the application lifecycle. - Custom scope to represent the JSP PageContext: The Page scope mentioned above is not a standard JavaScript object like the global and the local scope, but rather a custom implementation of the Scriptable interface which wraps around the PageContext (called ScriptablePageContext). First and foremost it provides access to all the attributes without having to add them to the scope for every page or even every evaluation (i.e. they are retrieved on request). In addition, it provides access to host objects, which are currently Maps of the request parameters, request headers, cookies and context initialization parameters. - Separation of compilation and execution of scripts: Expressions are not now longer directly evaluated, but rather first compiled into "Script" objects and stored in a cache. This is functionaly equivalent to how the SPEL Evaluator works. The caching introduces a huge performance gain of course. - Proper cleanup of Rhino contexts: Rhino "Context" objects are now 'closed' using the Context.exit() method after Script execution. This lets Rhino do the cleanup it deems necessary. - Implementation of the validate() method: The EcmaScript Evaluator now implements the validation method by trying to compile the expression. This also puts the resulting Script object in the cache, so theoretically the cache should be populated by the time the page is executed. However, I couldn't get the validate() method to actually get called :P - JavascriptExpressionEvaluator now extends Evaluator Instead of creating an instance of the SPEL Evaluator for every evaluation of a literal, we can now simply delegate to the super-class for that task. Ideally there'd be an AbstractEvaluator or something like that, of course. All in all I think this implementation performs far better than the current simpler implementation. Most of the source is pretty extensively commented. The archive contains a patch for JavascriptExpressionEvaluator, the new ScriptablePageContext class and changes to the examples webapp (ParameterAccess.jsp replaced by SpecialObjects.jsp, which contains examples of accessing parameters, headers, cookies and init-parameters). What do you think? -chris ________________________________________________________________ cmlenz at gmx.de ------------u8SBS05cQLLmxuMluIM49D Content-Disposition: attachment; filename="EcmaScriptPatches.zip" Content-Type: application/zip; name="EcmaScriptPatches.zip" Content-Transfer-Encoding: Base64 UEsDBAoAAAAAAKGiOCwAAAAAAAAAAAAAAAASAAAAc3RhbmRhcmQvZXhhbXBs ZXMvUEsDBAoAAAAAAKWiOCwAAAAAAAAAAAAAAAAWAAAAc3RhbmRhcmQvZXhh bXBsZXMvd2ViL1BLAwQKAAAAAACvojgsAAAAAAAAAAAAAAAAIQAAAHN0YW5k YXJkL2V4YW1wbGVzL3dlYi9lY21hc2NyaXB0L1BLAwQUAAAACACwkDgsIumN KXEEAAC3DwAAMwAAAHN0YW5kYXJkL2V4YW1wbGVzL3dlYi9lY21hc2NyaXB0 L1NwZWNpYWxPYmplY3RzLmpzcMVX32/bNhB+919x09amBRIpQfuUycKCwUM6 dGtRb9hDkAeKYiKmlMiSlBP3r9/xhy3ZcjI7LbAgSEiJ9913dx+PVP7iF7Dk VvASlGY3/GGa0AQ6zadJba06z7I7siCp6dqUyia7M1ZkjGRUapbAi2IyyWvb iAL/MVIVE4DccitY8fv8r/fnMKMNmVPNlYXZe5h3Sklt4eQE5opRTgR8KO8Y tQZmD6RRguVZsJ7kWcDLS1ktobylUkg9TX78zf8kzt9ZsQWCNmf4QhXvWrA1 Aypbyx4syBtwbI7ByIaBiUYYbYXxtqwCGUkQzaAhFQOMmAtSCpbmmXIxltp5 1D7cN8Un9qVjxsJHoknDLNMGXuVUVqxQ7gkS8ZPXSOiNM1EuLysj1RtR0kKJ 3ihlxiAPW2vZ3dZA4A+iIitcJAS+Q4SXXzppfw4uwjiFOWM+1pxAjeWbJmh5 4fHSO6OSwgGFeZ6RAp3fMriR2sHxFgcNsVy2gL+1vAcrXdIWrOWstWIZmQ3Y mBQuDOhxKIjnoqnJAlPYCcuxmLAgAtcde4INYiCo5izkmVDbYWToQ2uyNK44 fh1vK/bg4KRimlik2jJWGUcNU9X5NMkVMWcQgMAgdHsbXLqKu1drfunE1zEU Yoaq0JjjsNQlY2NtTLPFAMPoGO5rTmu450I4DhU3SpBlqEnJBOatM863rTlS YrRuOeZn5dMlOewLJygopa4YKvk0AcqEMIpQtF3PFakqPz87TZyVs9MF+JEb V+sxznirOgt2qdg0cUpPwPCvOH6LYC1G454afOojnSYREA0zWxUDyN2Ipisb bldI8ziLWHE6RsSR9uFmPl63k0MGcnrOsSxIaJr8FEScuhn8MIW2E8JjYYUu GaqDm62ieLfnPqOjVJ4NMrWOqi5mD7jFjUF5I5d6+OZDZzHM/umK8xZEVYRN HdleHTm6R9dXp9dxg2/nEUNk6HSVo7FdkhXjTD3t1efoUJcro53+1pVxQ6fQ zFVm3OV+lfKz262xtdEw3dnbVksPaWhhc0XU2M4Q6rkNbUc3Q7Q9Gtoktvio PNebwuHhiQXJ7RRc3pevXtUsWKVuy/QFqx9b5ov2xLrI4Wq43GNf7zRdF5ie Yy5mBHvWgiDdYJ4At6wxqJEIu2vXjAU18p0AHpsEW/w0kVKZDYntAeH/Phfj 8VQ8hdgLf50Yp/q4Cx473C/x/jE42eswffJoj2ued65H4//tYO/3QYB1J5q/ K91wuops392wq/W655+YwRKN9NqbrptfdJjW0thR69slkKHBQAyv/pRwiY9e DxSxh9+rI7xp6BNMaoud+xACm5ZbTP7GV3DhXo35DASJN1jrLj++gAsWLigH lmAjnvQzWz7Vj+KqQ5pKMOmbSqS3X1PpWR3eCYZcv9+u/4eVRCl413KLHwf8 a0j++ILPccHHxy/5zv6bb/i9j29pBgj3yLl4UDPYoUS+GeSBilxH91+i7Bce osu1VS/NPp/7qXOD4eEC3eL9nTSauQ9h/13sP7f/BVBLAwQKAAAAAADqojgs AAAAAAAAAAAAAAAADQAAAHN0YW5kYXJkL3NyYy9QSwMECgAAAAAA7KI4LAAA AAAAAAAAAAAAABEAAABzdGFuZGFyZC9zcmMvb3JnL1BLAwQKAAAAAADwojgs AAAAAAAAAAAAAAAAGAAAAHN0YW5kYXJkL3NyYy9vcmcvYXBhY2hlL1BLAwQK AAAAAADyojgsAAAAAAAAAAAAAAAAIAAAAHN0YW5kYXJkL3NyYy9vcmcvYXBh Y2hlL3RhZ2xpYnMvUEsDBAoAAAAAAPSiOCwAAAAAAAAAAAAAAAApAAAAc3Rh bmRhcmQvc3JjL29yZy9hcGFjaGUvdGFnbGlicy9zdGFuZGFyZC9QSwMECgAA AAAA9qI4LAAAAAAAAAAAAAAAAC4AAABzdGFuZGFyZC9zcmMvb3JnL2FwYWNo ZS90YWdsaWJzL3N0YW5kYXJkL2xhbmcvUEsDBAoAAAAAAPiiOCwAAAAAAAAA AAAAAAA5AAAAc3RhbmRhcmQvc3JjL29yZy9hcGFjaGUvdGFnbGlicy9zdGFu ZGFyZC9sYW5nL2phdmFzY3JpcHQvUEsDBAoAAAAAAAOjOCwAAAAAAAAAAAAA AABBAAAAc3RhbmRhcmQvc3JjL29yZy9hcGFjaGUvdGFnbGlicy9zdGFuZGFy ZC9sYW5nL2phdmFzY3JpcHQvYWRhcHRlci9QSwMEFAAAAAgAA5o4LHC8LMYg CgAA4SEAAFsAAABzdGFuZGFyZC9zcmMvb3JnL2FwYWNoZS90YWdsaWJzL3N0 YW5kYXJkL2xhbmcvamF2YXNjcmlwdC9hZGFwdGVyL1NjcmlwdGFibGVQYWdl Q29udGV4dC5qYXZhxVhrc5tIFv3uX9GrnaqxMwqa7ONDbMc1WMI2KVnSAnI2 NTVV00ItiRgB2yA7zlb++57bNAIkZMtOUktVLALd577OfTSdVwfsFfMWgpkJ 9/HjxrPsnkvB+oEvolS02Y2QaRBH7I3xBmtpeTdOHmQwX2Ts0D9ib96+fduI cBGvoinPsNdgzAxDpvakjCCkSIW8E1NDQzpiGqSZDCYrWs94NGWrVLAgYmm8 kr5QTyZBxOUDm8VymbbZfZAtWCzVb7zKCGUZT4NZ4CuZbUY6JEIugywTU5bI +C6Y4iZb8Ax/BHDCML4Pojnz42ga0KaUUGjfUmTHWrU3xoZ2KYtnhVp+PMXi VZrBooxDXQLmk/iOXmkvEQiuKM7g0jZWBCkLgUcwpWRlYV0tCPVDHiyFNJhW 5m/bykBoxTGFMjB3uoKCP0YfCNUotGIa+6uliDJexK6DsMR4I9mSZ0IGPExL /6u44aUGqBpTsOHvhiKUiKavwQK5ISCI/HBVRYK5VZQ2C2YanEcP7dwjetOG Rdy/jeL7UMwFwR8zpvfhannkl9yN6+0p4q7ZPRV3IowTqDF5UKjl1kcygR0u siw57nTu7+8NrpYZsZx3joyW3m+G8FgEt4UPOjZ1JeHSB8aTRHCKgpK81inI UhHO2hopmKkY3iMO0FWydOWTuwI5fZ1wmT1sAKdghFzyMCzgi2j8I49GxJew v0W37/ktADgbyfiT8LNWG4/jJfIOdySyteEArVDphlYeFFCQTQRlOqgWU7xj iawHe+D3ZZyJwv8p3C0D1AuNNMPr3Dlr23UZwI6AioKkrI/y/E9TVYMuKs81 Tvm6zZJQ8JTSBDxDxPPg/FbGqHDHPw2yu6ZVkz4UJm2fD6eKtVeKQMPbalHx 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 HQKZ3S9Bu24rPKoA7bx+2wECzVsTenGG3q12TI3OmV0zHdbEPbkQs/el61vX kcAGH0WxF6Ej73p3i4t7p1PHt8PVC/UWbQ26WoD647dAB2QAcah700MVmhjz LR4dINC+694FJBUBSUOpnpvDtTG7F9pLIP5c0Pb3P0Cl4oR8RbNxlvn+3Lzr QG1q36lwl+ceBKuZt7uW+oTP+ZNGluTdV6Jpo4IrMM+rdAaTW/KSzfGOQUat kZi+hlqycWTtXUQ239pQxr/zUAVqe/t7ru4Wq8MfA3Zv9S2GmkNjdztQ3AYj DwHVl64FNDAr05j8rLPzl43/AVBLAQIUAAoAAAAAAKGiOCwAAAAAAAAAAAAA AAASAAAAAAAAAAAAEAD/QQAAAABzdGFuZGFyZC9leGFtcGxlcy9QSwECFAAK AAAAAAClojgsAAAAAAAAAAAAAAAAFgAAAAAAAAAAABAA/0EwAAAAc3RhbmRh cmQvZXhhbXBsZXMvd2ViL1BLAQIUAAoAAAAAAK+iOCwAAAAAAAAAAAAAAAAh AAAAAAAAAAAAEAD/QWQAAABzdGFuZGFyZC9leGFtcGxlcy93ZWIvZWNtYXNj cmlwdC9QSwECFAAUAAAACACwkDgsIumNKXEEAAC3DwAAMwAAAAAAAAABACAA toGjAAAAc3RhbmRhcmQvZXhhbXBsZXMvd2ViL2VjbWFzY3JpcHQvU3BlY2lh bE9iamVjdHMuanNwUEsBAhQACgAAAAAA6qI4LAAAAAAAAAAAAAAAAA0AAAAA AAAAAAAQAP9BZQUAAHN0YW5kYXJkL3NyYy9QSwECFAAKAAAAAADsojgsAAAA AAAAAAAAAAAAEQAAAAAAAAAAABAA/0GQBQAAc3RhbmRhcmQvc3JjL29yZy9Q SwECFAAKAAAAAADwojgsAAAAAAAAAAAAAAAAGAAAAAAAAAAAABAA/0G/BQAA c3RhbmRhcmQvc3JjL29yZy9hcGFjaGUvUEsBAhQACgAAAAAA8qI4LAAAAAAA AAAAAAAAACAAAAAAAAAAAAAQAP9B9QUAAHN0YW5kYXJkL3NyYy9vcmcvYXBh Y2hlL3RhZ2xpYnMvUEsBAhQACgAAAAAA9KI4LAAAAAAAAAAAAAAAACkAAAAA AAAAAAAQAP9BMwYAAHN0YW5kYXJkL3NyYy9vcmcvYXBhY2hlL3RhZ2xpYnMv c3RhbmRhcmQvUEsBAhQACgAAAAAA9qI4LAAAAAAAAAAAAAAAAC4AAAAAAAAA AAAQAP9BegYAAHN0YW5kYXJkL3NyYy9vcmcvYXBhY2hlL3RhZ2xpYnMvc3Rh bmRhcmQvbGFuZy9QSwECFAAKAAAAAAD4ojgsAAAAAAAAAAAAAAAAOQAAAAAA AAAAABAA/0HGBgAAc3RhbmRhcmQvc3JjL29yZy9hcGFjaGUvdGFnbGlicy9z dGFuZGFyZC9sYW5nL2phdmFzY3JpcHQvUEsBAhQACgAAAAAAA6M4LAAAAAAA AAAAAAAAAEEAAAAAAAAAAAAQAP9BHQcAAHN0YW5kYXJkL3NyYy9vcmcvYXBh Y2hlL3RhZ2xpYnMvc3RhbmRhcmQvbGFuZy9qYXZhc2NyaXB0L2FkYXB0ZXIv UEsBAhQAFAAAAAgAA5o4LHC8LMYgCgAA4SEAAFsAAAAAAAAAAQAgALaBfAcA AHN0YW5kYXJkL3NyYy9vcmcvYXBhY2hlL3RhZ2xpYnMvc3RhbmRhcmQvbGFu Zy9qYXZhc2NyaXB0L2FkYXB0ZXIvU2NyaXB0YWJsZVBhZ2VDb250ZXh0Lmph dmFQSwECFAAKAAAAAADmojgsAAAAAAAAAAAAAAAACQAAAAAAAAAAABAA/0EV EgAAc3RhbmRhcmQvUEsBAhQAFAAAAAgAMKE4LLAHbjURAgAAYQYAABMAAAAA AAAAAQAgALaBPBIAAGluZGV4X2h0bWxfZGlmZi50eHRQSwECFAAUAAAACAAj oTgsBPn1OFUPAADDPAAAKwAAAAAAAAABACAAtoF+FAAASmF2YXNjcmlwdEV4 cHJlc3Npb25FdmFsdWF0b3JfamF2YV9kaWZmLnR4dFBLBQYAAAAAEAAQACUF AAAcJAAAAAA= ------------u8SBS05cQLLmxuMluIM49D Content-Type: text/plain; charset=us-ascii -- To unsubscribe, e-mail: For additional commands, e-mail: ------------u8SBS05cQLLmxuMluIM49D--