怎么把JS嵌入到Java程序中

JavaScript07

怎么把JS嵌入到Java程序中,第1张

1.取得脚本解释器的管理器Manager

2.从管理器中取得js的解释器实例ScriptEngine

3.取得存储javascript变量的Bindings实例

4.把一个java.io.Reader流及Bindings传递给ScriptEngine的eval方法返回脚本运行结果,如果执行中发生错误,会抛出ScriptException异常。

例:运行javascript脚本的一个java程序

throwsIOException{ScriptEngineManagerscriptManager=newScriptEngineManager//从管理器中获取js的解释器//定义我们要运行的脚本文件Stringfilename=null//通过解释器来获得存储javascript变量的Bindings的实例,使它们提供给脚本。Bindingsbindings=js.createBindings//在map中获取和设置值的方法publicObjectget//使用我们的name/value对(即javascript变量)Bindingsbindings=newSimpleBindings(defaults)//创建一个变量,用于存放脚本执行的内容ScriptContextcontext=newSimpleScriptContext()//设置那些Bindings在Context中,使它们可读。但这样的变量定义的脚本不要放入我们的Map中context.setBindings(bindings,ScriptContext.GLOBAL_SCOPE)BufferedReaderin=newBufferedReader(newFileReader(filename))Stringlinewhile((line=in.readLine())!=null){line=line.trim()if(line.length()==0)continue//跳过空行if(line.charAt(0)==‘#‘)continue//跳过命令intpos=line.indexOf(":")if(pos==-1){thrownewIllegalArgumentException("syntax:"+line)}Stringname=line.substring(0,pos).trim()Stringvalue=line.substring(pos+1).trim()charfirstchar=value.charAt(0)intlen=value.length()charlastchar=value.charAt(len-1)if(firstchar==‘"‘&&lastchar==‘"‘){//双引号引用的值为字符串defaults.put(name,value.substring(1,len-1))}elseif(Character.isDigit(firstchar)){//如果开始是一个数字try{doubled=Double.parseDouble(value)defaults.put(name,value)}catch(NumberFormatExceptione){//没有数字,是一个stringdefaults.put(name,value)}}elseif("true".equals(value)){//处理布尔值defaults.put(name,Boolean.TRUE)}elseif("false".equals(value)){defaults.put(name,Boolean.FALSE)}elseif("null".equals(value)){//处理null值defaults.put(name,null)}elseif(firstchar==‘{‘&&lastchar==‘}‘){//如果值是在一对大括号之内,则执行javascript代码Stringscript=value.substring(1,len-1)Objectresult=engine.eval(script,context)defaults.put(name,result)}else{//其它情况,刚好是一个字符串defaults.put(name,value)}}}//一个简单的类的测试程序publicstaticvoidmain(String[]args)throwsIOException,ScriptException{Configurationdefaults=newConfiguration()defaults.load(args[0])Set

在java Web体系中,可以写自定义标签,过滤用户输入,也可以写一个filter过滤器。比如说自定义标签。

开发步骤:

1 写一个标签处理类

2  在/WEB-INF/目录下,写一个*.tld文件,目的是让Web容器知道自定义标签和标签处理类的对应关系

3 在JSP页面中,通过<%@taglib%>指令引用标签库.

4 部署web应用,访问simple.jsp即可

其中,标签处理类可以这样写,转义大于号,小于号等特殊符号。

package cn.itcast.web.jsp.tag

import java.io.IOException

import java.io.StringWriter

import javax.servlet.jsp.JspException

import javax.servlet.jsp.PageContext

import javax.servlet.jsp.tagext.JspFragment

import javax.servlet.jsp.tagext.SimpleTagSupport

//<simple:filter>标签处理类

public class FilterTag extends SimpleTagSupport {

public void doTag() throws JspException, IOException {

JspFragment jspFragment = this.getJspBody()

StringWriter writer = new StringWriter()

jspFragment.invoke(writer)

String temp = writer.getBuffer().toString()

//结果必定是转义后的字符串

temp = filter(temp)

PageContext pageContext = (PageContext) this.getJspContext()

pageContext.getOut().write(temp)

}

public String filter(String message) {

        if (message == null)

            return (null)

        char content[] = new char[message.length()]

        message.getChars(0, message.length(), content, 0)

        StringBuffer result = new StringBuffer(content.length + 50)

        for (int i = 0 i < content.length i++) {

            switch (content[i]) {

            case '<':

                result.append("&lt")

                break

            case '>':

                result.append("&gt")

                break

            case '&':

                result.append("&amp")

                break

            case '"':

                result.append("&quot")

                break

            default:

                result.append(content[i])

            }

        }

        return (result.toString())

    }

}

1.整体思路:

js调用java

首先将js代码注入到webview的页面中,然后通过修改window.location.href来向java传递参数,java端通过监听页面url的改变来识别js端传递的参数.然后再经解析数据实现java方法的调用.

java调用js

java通过webView.loadUrl("JavaScript:"+jsCode)来实现js代码的调用

2. java调用js的实现

java调用js的方法,相当简单:

String jsCode = "(function(){ /*js code here*/ })()"

webview.loadUrl("javascript:" + jsCode)

注意:要把js代码用自执行函数包裹起来

利用这种方法可以把任意代码注入到页面中

注意: 当页面刚加载时就需要把 2.1中的js代码注入到页面中,但是有时会出现页面加载完成,但是注入的代码没有执行的现象,应该是因为js没有及时加载而页面先加载完成。要解决这个问题就需要在页面加载完成时触发一个事件比如jsBridgeReady,js端通过监听jsBridgeReady事件来调用java方法。那么总体流程如下:

加载页面->注入js代码->页面加载完成->触发js注入完成事件

代码:

在BridgeWebClient中添加逻辑: 1,加载页面时注入js代码: 2,加载完成后触发加载完成事件

@Override

public void onLoadResource(WebView view, String url) {

// 注入桥接代码

// 这里通过读取js文件获得js代码

if (mFileName != null) {

view.loadUrl(mBridge.createBaseJs(mContext, mFileName))

}

super.onLoadResource(view, url)

}

@Override

public void onPageFinished(WebView view, String url) {

super.onPageFinished(view, url)

// 触发注入完成事件,用于解决 注入的代码没有及时加载成功导致无法调用的问题

view.loadUrl("(function(){if(window.UAPPJSBridgeReady){window.UAPPJSBridgeReady()}})()")

}

如果你也想从文件读取js代码,记得把读取的代码压缩一下,把注释和换行删除,不然很可能会报错

js端调用java注入的代码:

//判断代码是否注入完成

if(window.UAPPJSBridge){

//调用注入的方法

window.UAPPJSBridge.wxshare(message,success,error)

}else{

//监听注入完成的事件

window.onBridgeLoaded=function(){

if(window.UAPPJSBridge){

window.UAPPJSBridge.wxshare(message,success,error)

}

}

}