java解析javascript方法,scriptengine初体验,实现后台调用js方法验证。
1.js文件(放在src下)
//此处定义一个空的alert方法,否则解析下面checkRate(name)方法会报错没有定义alert(),只有这个用途;function alert() { }
//根据名字取标签的值
function getVal(name) { return document.getElementsByName(name)[0].value; }//验证邮箱格式是否合法
function checkRate(name) { var re =/^([a-zA-Z0-9_-])+@([a-zA-Z0-9_-])+(.[a-zA-Z0-9_-])+/; var nubmer =getVal(name); if (!re.test(nubmer)) { alert("请输入正确格式的邮件地址"); // document.getElementById("email").value = ""; return false; } return true; }
2.jsp页面
<html> <head> <title>Title</title> <script type="text/javascript"> function validateForm() { alert(checkRate("email")); } </script> </head> <body> 邮箱:<input type="text" name="email" id="email" onblur="checkRate("email")"><br> <input type="button" value="validate" onclick="validateForm()"/> </body> </html>
当点击button时验证输入是否合法
3.java代码
package com.test; import java.io.FileReader; import javax.script.Invocable; import javax.script.ScriptEngine; import javax.script.ScriptEngineManager; /** * Created by gaoziang on 2017/8/28. */ public class FunctionTest { public static void main(String[] args) throws Exception{ ScriptEngineManager manager = new ScriptEngineManager(); ScriptEngine engine = manager.getEngineByName("javascript"); String jsFileName = "src/JavaScript"; // 读取js文件 FileReader reader = new FileReader("src/validate.js"); // 执行指定脚本 engine.eval(reader);
//此处的email是定义在主函数里的,正常应从表单提交里接收到email文本框的值并赋值给email
String email="907273324@qq.com";
/此处重新定义一个getVal方法,这样在js里的checkRate方法就会调用下面的新的getVal方法,实现了避开document对象,如果不重写就会提示document没定义,外部js没法单独用document。 engine.eval("function getVal(name) {var json = {"name":"+"""+email+"""+"};return json[name];}"); if(engine instanceof Invocable) { Invocable invoke = (Invocable)engine; Boolean boo=(boolean)invoke.invokeFunction("checkRate","name"); System.out.println("boo="+boo); } reader.close(); } }
此时输出的就应该是 true ;
总结: 主要的一点就是重新写一个getVal方法,在jsp解析js时用js文件中的getVal通过document获得值进行邮箱正则表达式校验。 而在后台解析js时用新写的getVal方法,把通过表单提交的email值(我是模拟的)传到checkRate方法中,进行正则表达式的校验。
声明:该文观点仅代表作者本人,牛骨文系教育信息发布平台,牛骨文仅提供信息存储空间服务。