使用Nashorn从网站上读取数据

时间:2018-02-05 10:00:25

标签: javascript java nashorn

我想使用Nashorn脚本引擎从网站检索数据

我有java代码,我可以从示例网站模板中检索数据。

现在我想从java脚本文件中调用该java文件。

以下是代码:

JAVA代码(Nsample.java):

sparkContext.cancelAllJobs();
sparkContext.stop();

JAVASCRIPT代码:(sample.js)

package sample;
import java.net.*;
import java.io.*;


public class Nsample
{
public static void main(String[] args)
{
String output  = getUrlContents("https://freewebsitetemplates.com/");
System.out.println(output);
}



public static String getUrlContents(String theUrl)
{
StringBuilder content = new StringBuilder();


try
{

  URL url = new URL(theUrl);


  URLConnection urlConnection = url.openConnection();


  BufferedReader bufferedReader = new BufferedReader(new 
  InputStreamReader(urlConnection.getInputStream()));

  String line;


  while ((line = bufferedReader.readLine()) != null)
  {
    content.append(line + "\n");
  }
   bufferedReader.close();
  }
  catch(Exception e)
  {
  e.printStackTrace();
  }
  return content.toString();
  }
 }

我尝试使用命令提示符编译javascript代码,但它显示CLASSNOTFOUNDEXCEPTION。

命令是 jjs sample.js 。我假设我在Java.type()函数中犯了一些错误。

任何人都可以解决这个问题吗?

2 个答案:

答案 0 :(得分:0)

这一行是有问题的一行:

var n = Java.type('C.JavaFolder.sample.Nsample');

Java.type接受完全限定的java类型名称。根据您的Java代码,您的软件包似乎是" sample"和班级名称是" Nsample"。因此,完全限定的类名称为" sample.Nsample"。

你应该编译你的Java类并在-classpath选项中指定目录(jjs工具或你的java应用程序,如果你使用nashorn的javax.script API)。

答案 1 :(得分:0)

我没有从JavaScript调用Java,而是尝试从java调用JavaScript并且运行良好。

我在JavaScript中创建了一些函数,并从Java代码中调用了这些函数。 以下是代码。希望这有帮助。

<强> Test.java:

import javax.script.*;
import java.io.*;
import java.util.*;


public class Test{
public static void main(String[] args) throws Exception{


 ScriptEngine engine = new ScriptEngineManager().getEngineByName("Nashorn");
 engine.eval(new FileReader("test.js"));


 Invocable invoke = (Invocable)engine;

 Object res = invoke.invokeFunction("httpGet","https://www.javaworld.com");
 System.out.println(res);


}

}

<强> test.js

var httpGet = function(theUrl){
var con = new java.net.URL(theUrl).openConnection();
con.requestMethod = "GET";

return asResponse(con);
}

function asResponse(con){
var d = read(con.inputStream);

return d;
}

function read(inputStream){
var inReader = new java.io.BufferedReader(new 
java.io.InputStreamReader(inputStream));
var inputLine;
var response = new java.lang.StringBuffer();

while ((inputLine = inReader.readLine()) != null) {
       response.append(inputLine);
}
inReader.close();
return response.toString();
}