从 JavaScript 调用 Java,反之亦然,为啥?

Posted

技术标签:

【中文标题】从 JavaScript 调用 Java,反之亦然,为啥?【英文标题】:Calling Java from JavaScript and vice-versa why?从 JavaScript 调用 Java,反之亦然,为什么? 【发布时间】:2014-04-28 19:39:56 【问题描述】:

我知道我们可以从 javascript 调用 Java,反之亦然,但我想知道什么时候能够获得这种能力并以健康的方式使用它。我说的是现实世界的应用程序,而不是“hello world”。

与许多开发人员一样,我通常在开发 java 和 javascript,但我没有足够的经验知道什么时候混合这些人是个好主意。

如果有一些开发人员可以分享他关于如何使用这种组合构建现实世界应用程序的知识,那就太好了:)。

抱歉,我未能以有价值的方式表达我的疑问,所以,你听说过Narshorm 吗?例如,你可以从 Java 类调用 Javascript 代码,但我没有看到具有这些功能的商业案例增加我的服务器端应用程序的价值。

这是一个 nashorn hello world,在这个应用程序中有一个 Java Main,它“评估”一个 .js 文件的内容,调用 .js 文件中的函数。

我主要怀疑这种能力何时真正有用

【问题讨论】:

查询数据库就是一个很好的例子。 Javascript 本身无法做到这一点,因此您可以通过 AJAX 调用服务器端 Java 为您执行此操作,然后将结果取回并输出。 我假设您说的是在服务器上运行的浏览器 JavaScript 和 Java。您也可以反过来使用它,在浏览器中使用 Java 小程序,将 Node.js 作为服务器系统......并不是说使用小程序是个好主意,但仍然如此。 :-) 抱歉,我没有以一种有价值的方式表达我的疑问,所以,你听说过Narshorm吗?例如,你可以从 Java 类中调用 Javascript 代码,但我没有看到业务这些功能增加了我的服务器端应用程序的价值的情况。 真正的问题是 which “Java”(例如客户端/applet/jws、服务器)被调用并且来自 which “JavaScript”环境(例如浏览器、嵌入式、节点)? 【参考方案1】:

Web 应用程序开发(这是 Java 和 JavaScript 交互的常见场景):

有两个地方可以让服务器端语言和客户端语言相互交互:

    在渲染时,即向用户生成 html 输出时。

    在运行时,即 HTML 已生成且位于客户端(例如浏览器客户端)时。

对于第一种情况,假设我们有一个 Servlet,它向请求添加属性并转发到新 (JSP) 视图。这是 servlet 的一个示例:

@WebServlet("/hello")
public class HelloServlet extends HttpServlet 

    @Override
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException 
        String name = request.getParameter("name");
        // Prepare messages.
        request.setAttribute("name", name);
        request.getRequestDispatcher("/WEB-INF/hello.jsp").forward(request, response);
    

然后在您的视图中(WEB-INF 文件夹中的 hello.jsp 文件),您有这样的代码:

<!DOCTYPE html>
<html lang="en">
    <head>
        <title>Servlet Hello World</title>
        <script>
            function changeName(var newName) 
                document.getElementById('divName').innerHtml = 'Hello ' + newName;
            
            window.onload = function () 
                changeName('$name');
            
        </script>
    </head>
    <body>
        <div id="divName">
        </div>
        <form id="name" action="hello">
            Change name to: <input type="text" name="name" />
            <br />
            <input type="text" value="Change the name" />
        </form>
    </body>
</html>

通过使用这种方法,我们可以在渲染视图时将 Java 生成的变量 (NEVER SCRIPTLETS) 直接传递给 JavaScript。因此,我们可以在创建要发送到客户端的 HTML 时访问 Java 页面、请求、会话和上下文属性。

请注意,如果您想重新执行此 Java 代码,您应该向服务器发出一个新请求以执行 Java 代码。这就是 ajax 派上用场的地方。

Ajax 允许您与服务器端异步通信,服务器将为您的请求准备响应,然后在客户端您将定义如何使用它。为此,最好使用通用格式进行通信。现在最喜欢的格式是JSON。 Ajax 与 servlet 的交互在此处广泛介绍:How to use Servlets and Ajax?(无需在本文中重新发明***)。


独立或移动应用程序中:

Java 将在客户端计算机上运行。请注意,此处 Java 可以通过 JavaScript engine 执行 JavaScript 代码,例如 Rhino 或 nashorn。当您已经用 javascript 编写了许多功能(如外部库)并且不想将所有代码迁移到 Java 时,这很有用。您可以只使用ScriptEngineManagerStringEngine 类在Java 应用程序中执行JavaScript 代码。在 Java 应用程序中使用 JavaScript 的真实示例是 Pentaho Kettle,它是用 Java 编写的,它允许通过 JavaScript 脚本对您的代码进行转换。

关于 Nashorn 的更多信息:

Oracle Nashorn: A Next-Generation JavaScript Engine for the JVM

【讨论】:

嗨@Luiggi Mendoza 非常感谢您的回答:) 现在我对这种工具的了解更多:)【参考方案2】:

Javascript 是一种客户端脚本语言。这用于与用户在网站上可以看到和执行的操作 (html) 进行交互。例如,您可以使用 javascript 在单击按钮或将鼠标悬停在菜单项上时发生某些事情。

Java 是一种服务器端语言。这是在服务器上运行的编译代码,用户通常不知道这里发生了什么。使用服务器端代码(在您的情况下为 Java)的一个很好的现实世界应用程序是用于数据库查询和更新。

例如,如果您有一个要求用户注册帐户的网页,则可能会有一个包含用户名和密码文本框的表单。当用户单击“注册”时,此信息将存储在数据库中。

在这种情况下,您的 javascript 将具有在按下按钮时执行的代码,该代码捕获此数据。然后它通过 HTTP Post 将其发送到服务器(通常使用 ajax 发送此数据)服务器获取此数据并执行您编写的 Java 代码以将其插入数据库。

一个不需要存储用户数据的非常简单的网站可能根本不需要任何服务器端代码,但在大多数现实世界的场景中,有一些服务器代码与您的 html 和 javascript 一起工作

【讨论】:

抱歉,我未能以有价值的方式表达我的疑问,所以,您听说过Narshorm吗?例如,您可以从 Java 类中调用 Javascript 代码,但我没有看到业务这些功能增加了我的服务器端应用程序的价值的情况。 “Java 是一种服务器端语言”是完全不正确的,客户端语言是/必须是“脚本化”的断言也是如此。 @user2864740 但这里的 Java 是服务器端语言。没错。 @LuiggiMendoza 否。Java 可以在服务器上使用。它还可以用作客户端(Applets 有人吗?),甚至可以在嵌入式设备上使用。 @user2864740 好吧,这取决于问题的上下文。如果我们谈论 Web 应用程序,Java 是纯粹的服务器端代码,而 JavaScript 是客户端代码。【参考方案3】:

这些技术一起使用的一个常见地方是 AJAX。服务器端 Web 服务可能用 Java 编写,而客户端 Javascript 调用 Web 服务。

值得指出的是,Java 和 Javascript 实际上是完全不同的语言。 Web 服务可以用任何语言编写。

【讨论】:

我 Barett 道歉,我没有以一种有价值的方式表达我的疑问,所以,你听说过 Narshorm 吗?例如,你可以从 Java 类中调用 Javascript 代码,但我没有看到一个商业案例,其中这些功能增加了我的服务器端应用程序的价值。 我相信 Narshorm 最初的开发目的是允许实现一个可以适当执行 Javascript 的纯 Java Web 浏览器。

以上是关于从 JavaScript 调用 Java,反之亦然,为啥?的主要内容,如果未能解决你的问题,请参考以下文章

有没有办法将变量从 javascript 导入 sass,反之亦然?

javascript从/到位浮动

使用 AJAX/XMLHttpRequest 时不调用 shouldStartLoadWithRequest

使用 Java 中的系统调用发送数据(Flex 项目)

如何在 JavaScript 函数中激活 PHP 文件

当我在 iOS7 的 iPad 中将视图从纵向旋转到横向或反之亦然时,UITextfield shouldChangeCharactersInRange 没有调用