第一次用java解析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" οnblur="checkRate('email')"><br>
<input type="button" value="validate" οnclick="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方法中,进行正则表达式的校验。