Javaから値を渡し、受け取る
スクリプトの実行そのものはとても簡単に行なえることがわかりました。けれど、このようにただ実行するだけしかできないのでは、あまり高度なことはできそうにありません。ある程度複雑なことを行なわせるためには、JavaからJavaScript側に値を渡したり、JavaScriptから結果を受け取ったり、というようにJavaとJavaScriptの間で相互に情報をやり取りする仕組みが必要でしょう。
では、こうしたJava = JavaScript間のやり取りを含めた形でJSPのソースコードを修正してみましょう。
<%@ page language="java" contentType="text/html; charset=windows-31j"
pageEncoding="windows-31j"%>
<%@ page import="javax.script.*" %>
<%
String script = request.getParameter("script");
String val = request.getParameter("val");
String result = "";
if (script != null){
ScriptEngineManager manager = new ScriptEngineManager();
ScriptEngine engine = manager.getEngineByName("JavaScript");
try {
System.out.println("val:" + val);
engine.put("X",val);
engine.eval(script);
Object obj = engine.get("result");
result = obj != null ? obj.toString() : "null";
} catch(ScriptException ex){
ex.printStackTrace();
}
}
%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=windows-31j">
<title>Insert title here</title>
</head>
<body>
※スクリプト<br>
<form method="post" action="test.jsp">
変数X:<input type="text" name="val" value="<%=val %>">
<br>
<textarea name="script" cols=60 rows=5><%=script %></textarea>
<br>
<input type="submit">
</form>
<h4>result:<%=result %></h4>
</body>
</html>
ここでは、テキストエリアの他に変数の入力用のフィールドを用意しました。ここに入力した値は、JavaScriptでは変数Xとして利用できるようになります。また、JavaScriptからの実行結果は「result」という変数として返され、表示されるようにしてあります。これでだいぶ実行できるスクリプトの幅が広がりましたね。
JavaとJavaScriptの値のやり取りは、ScriptEngineの「put」と「get」で行なうことができます。putは、JavaScriptに第1引数の名前の変数を作成し、第2引数を値として渡します。またgetは、JavaScriptから引数の名前の変数を探し、その値を返します。