Legelső lépésként egy hagyományos servletet kell létrehoznunk, majd a doGet metódusában megvalósítani a JavaScript futtatását.
Java kód: Compilable scriptEngine = (Compilable) new ScriptEngineManager().getEngineByName("JavaScript"); ScriptContext scriptContext = new SimpleScriptContext(); scriptContext.setWriter(response.getWriter()); scriptContext.setAttribute("config", getServletConfig(), ScriptContext.ENGINE_SCOPE); scriptContext.setAttribute("response", response, ScriptContext.ENGINE_SCOPE); scriptContext.setReader(new InputStreamReader(JSONServlet.class.getResourceAsStream("json.js"))); try { CompiledScript script = scriptEngine.compile(scriptContext.getReader()); script.eval(scriptContext); } catch (ScriptException e) {}
Látható különbség, hogy ScriptEngine helyett Compilable osztályt használunk. A Compilable interfészt megvalósító értelmező annyival nyújt több szolgáltatást, hogy a lefordított JavaScripteket újra fel lehet használni újrafordítás nélkül, így segítségével gyorsító-tárazni lehet a scipteket csökkentve a szerver terhelését. Következő lépésként, mivel most nem a JavaScript visszatérési értékére van szükségünk (és azt sem szeretnénk, hogy az alapértelmezett kimenetre írjon), hanem azt szeretnénk, hogy a JavaScript közvetlenül a servlet kimenetre írjon, példányosítanunk kell egy ScriptContext objektumot, és referenciát adnunk a ServletResponse-ra. Természetesen van lehetőségünk Java objektumok átadására a JavaScriptnek, de ebben az esetben a ScriptContext osztálynak közvetlenül adhatjuk át a paramétereket a setAttribute metódus meghívásával. Ezután nincs más dolgunk, mint megadni a JavaScript fájlunkat, és futtatni a scriptet.
JavaScript kód: response.setHeader("Cache-Control", "no-cache"); response.setContentType("application/json"); var json = { response: { status: response.getStatus(), content_type: String(response.getContentType()) }, config: { servlet: String(config.getServletName()) } }; println(json.toSource());
A scriptben jól látható miként használjuk a Java objektumokat, és végül miként írjunk a kimenetre.
A böngészőben az alábbi válasz jelenik meg: ({response:{status:200, content_type:"text/plain;charset=ISO-8859-1"}, config:{servlet:"JSONServlet"}})
Folyt köv...
A JSON-nak van ám saját MIME type-ja: "application/json"
VálaszTörlésKöszi, javítottam.
VálaszTörlés