Spark-Java用の素晴らしいWebマイクロフレームワーク

画像






小さな紹介



Sparkは、多くの労力をかけずにJava Webアプリケーションを作成するための素晴らしいマイクロフレームワークです。 Sparkはシンプルさを追求し、最小限の機能セットのみを提供します。 ただし、数行のコードに適合するWebアプリケーションを作成するために必要なすべてを提供します。 Sinatraにヒントを得た構文を使用すると、コードは非常にきれいに見えます。



ユビキタスなHello Worldから始めましょう。



新しいプロジェクトを作成し、Sparkをインポートします。 個人的には、mavenを使用して依存関係を管理しています。



pom.xmlに追加します。



<dependency>    <groupId>com.sparkjava</groupId>    <artifactId>spark-core</artifactId>    <version>2.6.0</version> </dependency>
      
      





では、「Hello World」に直接進みましょう。



 import static spark.Spark.*; public class Main {   public static void main(String[] args) {       get("/hello", (req, res) -> "Hello, World!");   } }
      
      





以上です。 すべてがとてもシンプルです!



Sparkは/こんにちはのGETリクエストをリッスンするようになりました。 localhost :4567 / helloに切り替えるたびに、 handle()メソッドが呼び出されます。 その内部で、クライアントに送信する必要があるオブジェクト(この場合は「Hello World」)を返します。



個人的には、このコードは非常に簡潔であるため、説明する必要さえないと考えています。



やめて サーバーの起動/停止はどうですか?



  1. 停止 -stop()メソッドを呼び出すだけです。

  2. 起動 -ここではすべてが面白いです。 サーバーの起動を必要とする何かを行うと、サーバーが自動的に起動します(本当に奇妙に聞こえます)。 ただし、 init()メソッドを呼び出して手動で開始することもできます。



テンプレートのサポート



テンプレートエンジンなどのトピックに触れたいと思います。 Sparkはこれらに対して多くのネイティブサポートを備えています。 すなわち:





それらすべてに、スパークからの「ラッパー」があります。 たとえば、私のお気に入りのFreemarkerを見てみましょう。



最初に、余分にインポートしましょう。 中毒。



  <dependency> <groupId>com.sparkjava</groupId> <artifactId>spark-template-freemarker</artifactId> <version>2.5.5</version> </dependency>
      
      





src / main / resourcesディレクトリにテンプレート「hello.ftl」を作成します。



 <html> <head> </head> <body> <h1>Hello, ${name}!</h1> </body> </html>
      
      





次に、リソース内のパターンを探すようにfreemarkerを構成する必要があります。 これらはわずか4行のコードです。



 FreeMarkerEngine freeMarkerEngine = new FreeMarkerEngine(); Configuration freeMarkerConfiguration = new Configuration(); freeMarkerConfiguration.setTemplateLoader(new ClassTemplateLoader(Main.class, "/")); freeMarkerEngine.setConfiguration(freeMarkerConfiguration);
      
      





それだけです。無料マーカーを安全に使用できます。



 get("/", (request, response) -> { Map<String, Object> model = new HashMap<>(); model.put("name", "Freemarker"); return freeMarkerEngine.render(new ModelAndView(model, "hello.ftl")); });
      
      









ほぼ完全なプロジェクト



簡単に書きましょうが、sparkの機能の少なくとも一部を示すのに十分でしょうか? すぐに書けるものから、リンクの短縮版だけが思い浮かびました。 さあ、始めましょうか?



別のGoogle Guava依存関係を追加する必要があります。 その結果、3つの依存関係が得られます。



  <dependencies> <dependency> <groupId>com.sparkjava</groupId> <artifactId>spark-core</artifactId> <version>2.6.0</version> </dependency> <dependency> <groupId>com.sparkjava</groupId> <artifactId>spark-template-freemarker</artifactId> <version>2.5.5</version> </dependency> <dependency> <groupId>com.google.guava</groupId> <artifactId>guava</artifactId> <version>23.0</version> </dependency>
      
      





GumurにはMurmur3ハッシュ関数があるため、Guavaが必要です。 全体のプラスは、衝突に対して十分に強いということです。 また、余分な時間を無駄にしないために、データベースなどを使用せずに、変数のみにすべてのデータを保存します。



プログラムのバックボーンを作りましょう。



 staticFileLocation("/static"); get("/shortener", (request, response) -> { }); get("/:url", (request, response) -> { });
      
      





:urlは、 params()メソッドを介してアクセスできるパラメーターです。 例:



 get("/hello/:name", (request, response) -> { return "Hello: " + request.params(":name"); });
      
      





私が脱線したもの、続けます。



ストレージ用のコレクション(マップ)を作成し、テンプレートエンジンを構成し(freemarkerが私のお気に入りであるため、まさにそのとおりです)、統計ファイルを格納するペアを示します。 staticFiles.location( "/ static")は、ファイルがsrc / main / resources / staticにあることを彼に伝えます 。 たとえば、ファイル/ static / css / style.csshttp:// {host}:{port} /css/style.cssで利用できます。 ファイルを保存する場合は、 / var / www / public_htmlにあるとし 、次にstaticFiles.externalLocationメソッド( "/ var / www / public_html")を使用します。



  ConcurrentHashMap<String, String> urls = new ConcurrentHashMap<String, String>(); FreeMarkerEngine freeMarkerEngine = new FreeMarkerEngine(); Configuration freemarkerConfiguration = new Configuration(); freemarkerConfiguration.setTemplateLoader(new ClassTemplateLoader(Main.class, "/templates/")); freeMarkerEngine.setConfiguration(freemarkerConfiguration); staticFileLocation("/static");
      
      





リダイレクトを設定します。



  get("/:url", (request, response) -> { if(urls.containsKey(request.url())) response.redirect(urls.get(request.url())); response.redirect("/"); return null; });
      
      





ユーザーが短いリンクをたどると、リンクがコレクション内にある場合、目的のサイトに移動し、そうでない場合はメインのサイトに移動します。



フロントエンドで作業しましょう。さもなければ、それを完全に忘れてしまいました。 主なものから始めましょう。

ここでは、シンプルなシンプルなフォームを作成します。 そして、Proxima Novaフォントを詰め込みます。 もちろんプレイしすぎた...しかしまあ。



 <!DOCTYPE html> <html lang="en" style="height:100%;"> <head> <meta charset='utf-8'> <link rel="stylesheet" href="style.css"> </head> <body> <div id="main"> <form action="/shortener" method="GET"> <input type="text" id="input" name="url" autocomplete="off" autofocus size="44" maxlength="512" /> </form> </div> </body> </html>
      
      





 @font-face { font-family: Proxima Nova; src: url(pn.otf); } * { font-family: Proxima Nova; background: #2a2826; color: #9C9C9C; margin: 0; padding: 0; } body, html { height: 100%; } #main { display: flex; align-items: center; justify-content: center; height: 100%; font-size: 1.5em; } #input { border: none; outline:none; font-size: 1.5em; }
      
      





その結果、このすべての良さは次のようになります。







これで、リンク「shortener.ftl」が表示されるページ。



 <!DOCTYPE html> <html lang="en" style="height:100%;"> <head> <meta charset='utf-8'> <link rel="stylesheet" href="style.css"> </head> <body> <div id="main" style="text-align: center"> ${url} </div> </body> </html>
      
      





プロジェクトの最終構造。







さて、最後の行を追加します。 その結果、Mainクラスは次のようになります。



 import com.google.common.hash.Hashing; import freemarker.cache.ClassTemplateLoader; import freemarker.template.Configuration; import spark.ModelAndView; import spark.Request; import spark.Response; import spark.template.freemarker.FreeMarkerEngine; import java.nio.charset.StandardCharsets; import java.util.HashMap; import java.util.Map; import java.util.concurrent.ConcurrentHashMap; import static spark.Spark.*; public class Main { public static void main(String[] args) { ConcurrentHashMap<String, String> urls = new ConcurrentHashMap<String, String>(); FreeMarkerEngine freeMarkerEngine = new FreeMarkerEngine(); Configuration freemarkerConfiguration = new Configuration(); freemarkerConfiguration.setTemplateLoader(new ClassTemplateLoader(Main.class, "/templates/")); freeMarkerEngine.setConfiguration(freemarkerConfiguration); staticFileLocation("/static"); get("/shortener", (request, response) -> { String shortURL = "http://localhost:4567/" + Hashing.murmur3_32().hashString(request.queryParams("url"), StandardCharsets.UTF_8).toString(); Map<String, Object> model = new HashMap<>(); if(!urls.containsKey(shortURL)) { model.put("url", shortURL); urls.put(shortURL, request.queryParams("url")); return freeMarkerEngine.render(new ModelAndView(model, "shortener.ftl")); } model.put("url", shortURL); return freeMarkerEngine.render(new ModelAndView(model, "shortener.ftl")); }); get("/:url", (request, response) -> { if(urls.containsKey(request.url())) response.redirect(urls.get(request.url())); response.redirect("/"); return null; }); } }
      
      





以上です。 41行のコードで、リンク短縮サービスを作成しました。



おわりに



この時点で、この長引く「入門」記事を終了します。 Runetでこのプロジェクトがバイパスされたことは非常に残念です。 あなたがそれを好きなら、私はスパークについて書き続け、その可能性のより多くを明らかにします。



参照資料



プロジェクトサイト

SparkJavaソースコード



All Articles