commit 3b835c296e287f213f983f771af879392e38b19a Author: DmitriyMX Date: Thu Mar 9 11:14:32 2017 +0300 First commit diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..4ca124b --- /dev/null +++ b/.gitignore @@ -0,0 +1,27 @@ +## IDEA ## +.idea/ +out/ +*.iml +*.ipr +*.iws +*.ids + +## ECLIPSE ## +.settings/ +bin/ +.classpath +.project + +## GRADLE ## +.gradle/ +build/ +gradle/ +gradlew +gradlew.bat + +## MAVEN ## +target/ + +## OTHER ## +lib/ + diff --git a/pom.xml b/pom.xml new file mode 100644 index 0000000..4ea273d --- /dev/null +++ b/pom.xml @@ -0,0 +1,43 @@ + + + 4.0.0 + + ru.dmitriymx.reactjs + reactjs-example + 0.1-SNAPSHOT + + + UTF-8 + 1.8 + + + + + + + ${project.artifactId}-${project.version} + + + org.apache.maven.plugins + maven-compiler-plugin + 3.5.1 + + ${java.version} + ${java.version} + ${project.build.sourceEncoding} + + + + org.apache.maven.plugins + maven-surefire-plugin + 2.15 + + -Dfile.encoding=${project.build.sourceEncoding} + + + + + \ No newline at end of file diff --git a/src/main/java/ru/dmitriymx/reactjs/JsTools.java b/src/main/java/ru/dmitriymx/reactjs/JsTools.java new file mode 100644 index 0000000..4c3e68c --- /dev/null +++ b/src/main/java/ru/dmitriymx/reactjs/JsTools.java @@ -0,0 +1,60 @@ +/* + * DmitriyMX + * 2017-03-06 + */ +package ru.dmitriymx.reactjs; + +import javax.script.Invocable; +import javax.script.ScriptEngine; +import javax.script.ScriptEngineManager; +import javax.script.ScriptException; +import java.io.IOException; +import java.io.InputStreamReader; +import java.net.URL; +import java.net.URLConnection; +import java.util.function.Function; + +public class JsTools { + private static ScriptEngine engine; + + public static ScriptEngine getScriptEngine() { + if (engine == null) { + engine = new ScriptEngineManager().getEngineByName("nashorn"); + try { + engine.eval("var global = this;"); + engine.eval("var console = {}; console.debug = print; " + + "console.warn = print; console.log = print; console.info = print;"); + } catch (ScriptException e) { + e.printStackTrace(); + engine = null; + } + } + return engine; + } + + public static void loadJsFromUrl(String url) throws IOException, ScriptException { + URL _url = new URL(url); + URLConnection connection = _url.openConnection(); + InputStreamReader reader = new InputStreamReader(connection.getInputStream()); + getScriptEngine().eval(reader); + reader.close(); + } + + public static void loadJsFromClasspath(String path) throws ScriptException, IOException { + InputStreamReader reader = new InputStreamReader(Sample1.class.getResourceAsStream(path)); + getScriptEngine().eval(reader); + reader.close(); + } + + public static Object invokeFunction(String functionName, Object... args) { + try { + return ((Invocable) getScriptEngine()).invokeFunction(functionName, args); + } catch (ScriptException | NoSuchMethodException e) { + throw new RuntimeException(e); + } + } + + public static T invokeFunction(String functionName, Function converter, Object... args) { + return converter.apply(invokeFunction(functionName, args)); + } +} diff --git a/src/main/java/ru/dmitriymx/reactjs/Sample1.java b/src/main/java/ru/dmitriymx/reactjs/Sample1.java new file mode 100644 index 0000000..995c941 --- /dev/null +++ b/src/main/java/ru/dmitriymx/reactjs/Sample1.java @@ -0,0 +1,32 @@ +/* + * DmitriyMX + * 2017-03-06 + */ +package ru.dmitriymx.reactjs; + +import static ru.dmitriymx.reactjs.JsTools.*; + +import javax.script.ScriptException; +import java.io.IOException; + +public class Sample1 { + public static void main(String[] args) { + try { + log("Load js"); + loadJsFromUrl("https://cdnjs.cloudflare.com/ajax/libs/react/15.4.2/react.min.js"); + loadJsFromUrl("https://cdnjs.cloudflare.com/ajax/libs/react/15.4.2/react-dom-server.min.js"); + loadJsFromClasspath("/app.js"); + + log("Call function"); + String result = invokeFunction("renderOnServer", String::valueOf); + + log("Result:\n%s", result); + } catch (ScriptException | IOException e) { + e.printStackTrace(); + } + } + + private static void log(String format, Object... objects) { + System.err.printf(format+"\n", objects); + } +} diff --git a/src/main/resources/app.js b/src/main/resources/app.js new file mode 100644 index 0000000..1cf7b07 --- /dev/null +++ b/src/main/resources/app.js @@ -0,0 +1,14 @@ + + +function renderOnServer() { + return ReactDOMServer.renderToString( + React.createElement("h2", null, "Hello world") + ); +} + +function renderOnClient() { + ReactDOM.render( + React.createElement("h2", null, "Hello world"), + document.getElementById('app') + ); +} \ No newline at end of file