熱點推薦:
您现在的位置: 電腦知識網 >> 編程 >> Java編程 >> JSP教程 >> 正文

JS嵌入到Java程序中

2013-11-15 11:35:10  來源: JSP教程 

  隨著java的出現向java嵌入javascript腳本變的特別容易java引入了一個新的javaxscript包為腳本化語言提供了一個通用接口

  案例; 小說網java中嵌入javascript腳本的思路

  取得腳本解釋器的管理器Manager

  從管理器中取得js的解釋器實例ScriptEngine

  取得存儲javascript變量的Bindings實例

  把一個javaioReader流及Bindings傳遞給ScriptEngine的eval()方法從而運行存儲在外部文件中的腳本eval()方法返回腳本運行結果如果執行中發生錯誤會拋出ScriptException異常

  例運行javascript腳本的一個java程序

   import javaio*;   
import javaxscriptBindings;   
import javaxscriptScriptEngine;   
import javaxscriptScriptEngineManager;   
import javaxscriptScriptException;   
 /**
author by ?id= 
*/
public class RunScript {   
    public static void main(String[] args) throws IOException{   
        ScriptEngineManager scriptManager = new ScriptEngineManager();//得到解釋器的管理器裡面有很多種腳本解釋器   
        ScriptEngine js = scriptManagergetEngineByExtension(;js);//從管理器中獲取js的解釋器   
        //定義我們要運行的腳本文件   
        String filename = null;   
        //通過解釋器來獲得存儲javascript變量的Bindings的實例使它們提供給腳本   
        Bindings bindings = jscreateBindings();   
        //處理參數參數是定義的腳本的變量參數可能包括Dname/value對我們要進行處理任何參數不能以D為文件名開始   
        for(int i = ;i<argslength;i++){   
            String arg = args[i];   
            if(argstartsWith(D)){//如果參數是以D開頭則進行處理   
                int pos = argindexOf(=);   
                if(pos == ) usage();   
                String name=argsubstring(pos);   
                String value= argsubstring(pos+);   
                //注意我們定義的所有的變量是字符串如果必要的話我們可以通過javalangNumber 一個javalangBoolean任何Java對象或NULL將腳本轉換為其他類型   
                bindingsput(name value);//腳本中的變量存入bindings實例中   
            }else{   
                if(filename!=null)usage();   
                filename=arg;   
            }   
        }   
        //這裡是為了確保我們得到了一個文件的參數   
        if(filename==null){   
            usage();   
        }   
        //增加一個具有約束力的使用特殊的保留變量名稱告訴腳本引擎的文件的名稱將執行這使它能夠提供更好的錯誤信息   
        bindingsput(ScriptEngineFILENAME filename);   
        //讀取文件的流   
        Reader in = new FileReader(filename);   
        try{   
            //執行腳本並取得結果注意in就相當於js中的腳本而bindings是腳本執行所需要的變量   
            Object result = jseval(inbindings);   
            Systemoutprintln(result);   
        }catch(ScriptException ex){   
            //執行過程中出異常則顯示一個錯誤信息   
            Systemoutprintln(ex);   
        }   
    }   
    static void usage(){   
        Systemerrprintln(Usage: java RunScript[Dname=value] scriptjs);   
        Systemexit();//異常退出程序如果正常退出程序用Systemexit();   
    }   
}  

  這段代碼中所創建的Bindings對象不是靜態的JavaScript腳本所創建的所有的變量都存儲在這裡下面是一個腳本化Java的更加實用的例子它將它的Bindings對象存儲在一個具有較高的作用域的ScriptContext對象中以便可以讀取其變量但是新的變量就不存儲到Binhdings對象中這個例子實現了一個簡單的配置文件工具即一個文本文件用來定義名字/值對可以通過這裡定義的Configuration類來查詢它們值可能是字符串數字或布爾值並且如果一個值包含在花括號中那麼它就會傳遞給一個JavaScript解釋器去計算javautilMap對象保存了這些包裝在一個SimpleBindings對象中的值這樣一來JavaScript解釋器也可以訪問同一個文件中定義的其他變量的值

   import javaxscript*;   
import javautil*;   
import javaio*;   
/**
author by ;
*/
//這個類像javautilProperties 但是允許屬性值執行javascript表達式   
public class Configuration {   
    Map<StringObject> defaults = new HashMap<StringObject>();   
    //在map中獲取和設置值的方法   
    public Object get(String key){   
        return defaultsget(key);   
    }   
    public void put(String keyObject value){   
        defaultsput(key value);   
    }   
    //從map的name/value對中獲取初始化內容如果一個值在大括號內表示是一個javascript腳本計算它   
    public void load(String filename) throws IOExceptionScriptException{   
        //獲得javascript編譯器   
        ScriptEngineManager manager = new ScriptEngineManager();   
        ScriptEngine engine = managergetEngineByExtension(;js);   
           
        //使用我們的name/value對(即javascript變量)   
        Bindings bindings = new SimpleBindings(defaults);   
        //創建一個變量用於存放腳本執行的內容   
        ScriptContext context  = new SimpleScriptContext();   
        //設置那些Bindings 在Context 中使它們可讀但這樣的變量定義的腳本不要放入我們的Map中   
        contextsetBindings(bindings ScriptContextGLOBAL_SCOPE);   
        BufferedReader in  = new BufferedReader(new FileReader(filename));   
        String line;   
        while((line=inreadLine())!=null){   
            line = linetrim();   
            if(linelength()==) continue;//跳過空行   
            if(linecharAt()==#)continue;//跳過命令   
            int pos = lineindexOf(:);   
            if(pos == ){   
                throw new IllegalArgumentException(syntax:+line);   
            }   
            String name = linesubstring(pos)trim();   
            String value= linesubstring(pos+)trim();   
            char firstchar = valuecharAt();   
            int len = valuelength();   
            char lastchar = valuecharAt(len);   
            if(firstchar==&&lastchar==){   
                //雙引號引用的值為字符串   
                defaultsput(name valuesubstring(len));   
            }else if(CharacterisDigit(firstchar)){   
                //如果開始是一個數字   
                try{   
                    double d = DoubleparseDouble(value);   
                    defaultsput(name value);   
                }catch (NumberFormatException e) {   
                    //沒有數字是一個string   
                    defaultsput(name value);   
                }   
            }else if(trueequals(value)){//處理布爾值   
                defaultsput(nameBooleanTRUE);   
            }else if(falseequals(value)){   
                defaultsput(name BooleanFALSE);   
            }else if(nullequals(value)){//處理null值   
                defaultsput(name null);   
            }else if(firstchar=={&&lastchar==}){   
                //如果值是在一對大括號之內則執行javascript代碼   
                String script = valuesubstring(len);   
                Object result = engineeval(scriptcontext);   
                defaultsput(name result);   
            }else{   
                //其它情況剛好是一個字符串   
                defaultsput(name value);   
            }   
        }   
    }   
    //一個簡單的類的測試程序   
    public static void main(String[] args) throws IOExceptionScriptException{   
        Configuration defaults = new Configuration();   
        defaultsload(args[]);   
        Set<MapEntry<String Object>> entryset = defaultsdefaultsentrySet();   
        for(MapEntry<String Object> entry:entryset){   
            Systemoutprintf(%s:%s%nentrygetKey()entrygetValue());   
        }   
    }   
}


From:http://tw.wingwit.com/Article/program/Java/JSP/201311/19250.html
    推薦文章
    Copyright © 2005-2013 電腦知識網 Computer Knowledge   All rights reserved.