Come e perché invocare un metodo Java da Node Js

Come e perché invocare un metodo Java, cioè funzioni o procedure lato server da script Node js, è tra le domande più richieste del web. In ogni caso tutto è possibile nel mondo della programmazione, o quasi, quindi se vuoi conoscere il segreto che è alla base di questo meccanismo, non ti resta che continuare a leggere questo articolo.

Requisiti per l’invocazione

In realtà non è una buona idea che un’API come NodeJS richiami direttamente un metodo di una classe Java. Si prega di utilizzare l’approccio mostrato nell’articolo solo come ultima risorsa alla risoluzione di problematiche, che comunque andrebbero risolte sempre, seguendo i convenzionali pattern riconosciuti e testati da anni dagli esperti.

Oltre a questo metodo, che sto per esporti, esistono altri metodi che puoi sfruttare per far dialogare NodeJS con Java. Ad ogni modo questo è il sistema piu’ immediato per farlo.

Innanzitutto è necessario che tu esponga il tuo file jar come un eseguibile che possa essere richiamato tranquillamente da riga di comando con argomenti (proprio come si fa con il comando curl). Il tuo programma Node per fare questo può utilizzare una libreria come ShellJS, che ti permettera’ di eseguire comandi come curl direttamente da Node senza passare per il famoso terminale di linux o console dei comandi di windows per eseguirlo.

In questo video ti viene mostrato come padroneggiare CURL per effettuare richieste http da teminale.

Quindi esponi la tua classe Java come un servizio Web, che Node o qualsiasi altro client possa invocare e utilizzare, pertanto, prima di passare i comandi a Node, devi assicurarti assolutamente, come ho anticipato prima, che la classe possa essere invocata da curl eseguito da linea di comando.

La soluzione e il codice Node Js

Useremo la libreria Node Java per invocare i metodi della classe java. Per prima cosa devi installare il modulo Java con il gestore dei pacchetti di Node e cioè npm, puoi farlo digitando il seguente comando da terminale.

npm install java

Di seguito è riportato un blocco di codice che effettua delle chiamate a metodi java che pero’ devono essere dichiarati necessariamente statici, tali metodi sono dichiarati ed implementati nella classe Simple presente nel Package acme. Potrai notare che è possibile passare anche degli argomenti ai metodi Java, così come si evince dal blocco di codice seguente:

let java = require("java");

java.classpath.push("./Simple.jar");

let risultato=java.callStaticMethodSync("acme.Simple","helloWorld");
console.log (risultato);

risultato = java.callStaticMethodSync("acme.Simple", "add", 1, 2);
console.log (risultato);

risultato = java.callStaticMethodSync("acme.Simple", "getName");
console.log(risultato);

Puoi dare un’occhiata a questa libreria per Node per consultare l’elenco completo dei metodi da richiamare. Il codice funzionante completo lo puoi trovare raggiungendo il seguente percorso relativo al suo repository Github

Io, onestamente, ho sempre evitato, e a dire la verità non mi ci sono mai trovato nella condizione, di eseguire invocazioni java da Node.

Sono fermamente convinto, quindi, che l’esecuzione di codice java e l’invocazione di metodi, debba essere demandata solo ed esclusivamente al browser, sfruttando ed utilizzando le librerie in voga in questo momento, tra cui JQuery.

Quando è perché invocare codice java da Node

Per quanto riguarda l’invocazione di codice lato server da browser, possiamo dire che oggi, grazie ad alcune librerie javascript, come JQuery, questa operazione è diventata molto semplice da mettere in atto, ma anche molto sicura.

Il codice seguente ne mostra la semplicità d’uso.

Innanzitutto includi tra i tag <head> e </head>, della tua pagina html di prova, il seguente codice:

<script src="https://code.jquery.com/jquery-latest.min.js"></script>

Inoltre inserisci un tag <button id=”#bottone”>invoca servlet</button> all’interno della tua pagina html, giusto per innescare l’evento di invocazione della servlet. Anche questo blocco di codice va inserito tra i tag head.

// -------------------------------------------------
// Funzione che richiama la servlet “myservlet.java” 
// -------------------------------------------------
function saluto() {   
    $.get('${pageContext.request.contextPath}/myservlet', function(data) {
       alert(data);
    });
 }

// ---------------------------------------------
// Collego al click del bottone con id="bottone"
// il richiamo di helloworld.php
// ---------------------------------------------
$("#bottone").click(saluto);

ecco il codice presente nel file myservlet.java:

String data = "Hello World!";
response.setContentType("text/plain");
response.setCharacterEncoding("UTF-8");
response.getWriter().write(data);

È facile comprendere che, la function javascript saluto, viene richiamata dalla pressione sul pulsante “bottone”, che richiama successivamente la servlet myservlet.java, e che i dati rispediti al browser con questo comando

response.getWriter().write(data);

vengono salvati nella variabile data, e visualizzati a video dalla funzione alert di javascript.

La procedura che riguarda l’invocazione di codice lato server da client, è senz’altro da preferire, in quanto oltre ad essere più snella e semplice da gestire e senza dubbio più sicura.

Conclusioni

A parer mio la strada da preferire è sempre quella dell’invocazione di codice lato server da Javascript o da codice lato client. Progettando servlet e richiamandole all’esigenza come mostrato nel video.

Quindi, credo che, se ci si viene a trovare nella condizione di eseguire codice java da Node, la strada su cui ci siamo imbattuti ci porterà a problemi seri di sicurezza, che andrebbero subito risolti. Possiamo considerare il richiamo di metodi Java da Node un anti-pattern, cioè una procedura che va nettamente in controtendenza a quanto stabilito dai piu’ diffusi pattern.

Seguimi su

Antonio Lamorgese

Amministratore di rete, programmatore ed esperto di pratiche SEO. Dopo anni di esperienza nel settore, ho ideato un generatore di codice PHP Scopri di più su https://www.phpcodewizard.it.