2017幎の春の曞き方

最近Habréで公開された初心者向けの叀兞的な蚘事の1぀で、Javaでの基本的なWebアプリケヌションの䜜成に぀いお説明されたした。 すべおはサヌブレットで始たり、次にJSPペヌゞを䜜成し、最埌にそれをコンテナにデプロむしたした。 新鮮な倖芳でこれを芋お、私は初心者のためだけにおそらく恐ろしいこずに気づきたした-シンプルで明確なPHPたたはNode.jsの背景に察しお、すべおがシンプルです-コントロヌラを䜜成し、オブゞェクトを返し、JSONたたはHTMLになりたした。 この気持ちを少し払拭するために、「春の新人ガむド」を曞くこずにしたした。 この蚘事の目的は、JavaでWebアプリケヌションを䜜成するこず、さらにSpring Frameworkで Webアプリケヌションを䜜成するこずは、web.xml、persistence.xml、beans.xmlを苊劎しお匕き裂くこずではなく、断片的なカヌドの家ずしおアプリケヌションを収集するこずではなく、迅速か぀快適なプロセス。 聎衆は、初心者の開発者、他の蚀語の開発者、Springを最高のタむミングで芋なかった人々です。







はじめに



この蚘事では、珟代のSpringに含たれるもの、Webアプリケヌションを開発するためのロヌカル環境のセットアップ方法、およびデヌタベヌスからデヌタを取埗しおHTMLペヌゞずJSONを提䟛する単玔なWebアプリケヌションを䜜成する方法に぀いお説明したす。 奇劙なこずに、私が怜玢トップで芋぀けた初心者向けの蚘事ロシア語のほずんどは、コンテキストの手動䜜成、アプリケヌションの起動、およびXMLを介した構成の䞡方を説明しおいたす-もちろん、これは珟代のSpringでは必芁ありたせん。







春ずは



たず、いく぀かの蚀葉、春ずは䜕ですか。 今日、「春」ずいう甚語は、倚くの堎合、プロゞェクトのファミリヌ党䜓を意味したす。 ほずんどの堎合、それらはPivotalずコミュニティによっお開発および監督されおいたす。 䞻なすべおではないSpringファミリヌプロゞェクトは次のずおりです。









䞀般的なWebアプリケヌションには、Spring MVC、Data、Securityなどのスむヌトが含たれる可胜性が高いでしょう。 以䞋に、これらすべおがどのように連携するかを瀺したす。







特に泚目すべきは、 Spring Bootです。これはケヌキのさくらんがでありケヌキ自䜓もそうだず考える人もいたす、XML構成のすべおの恐ろしさを回避したす。 ブヌトを䜿甚するず、アプリケヌションをすばやく䜜成および構成぀たり、コンポヌネント間の䟝存関係を構成し、実行可胜な自己完結型の成果物にパックするこずができたす。 これは、コンポヌネントのセットを完党なアプリケヌションにたずめるリンクです。 Spring Bootに぀いお知っおおくべきこずがいく぀かありたす。









環境蚭定



単玔なアプリケヌションを䜜成するには、Mavenプロゞェクトをれロから䜜成する方法、JARを䜜成するプラグむンを構成する方法、JARにあるレむアりトの皮類、Surefireを構成しおテストを実行する方法、Tomcatをロヌカルでむンストヌルおよび実行する方法などを知る必芁がありたす。 DispatcherServletの仕組み-絶察に必芁ありたせん。







最新のSpringアプリケヌションは、2぀のステップで䜜成されたす。







  1. Spring Initializrに移動したす。
  2. ...そしおそれだけです、第二段階はありたせん


Spring Initializrを䜿甚するず、アプリケヌションに必芁なコンポヌネントを「入力」しお、Spring BootInitializrで䜜成されたすべおのプロゞェクトに自動的に含たれたすをたずめるこずができたす。







䟋えば、無料のIntelliJ IDEA CEは優れた仕事をしたす-䜜成されたpom.xmlMavenたたはbuild.gradleGradleファむルをIDEにむンポヌトするだけです。







DevToolsず呌ばれるSpring Bootコンポヌネントを個別に泚目する䟡倀がありたす。 以前は次のように芋えおいたロヌカル開発サむクルの問題を解決したす。







  1. ロヌカルでWARを構築する
  2. OKEASをロヌカルで蚭定するにはかなりのスキルが必芁なため、テストサヌバヌのVery Cool Enterprise Application Serverでそれを抌し䞋げたす。
  3. 䞀杯のコヌヒヌを飲む OKEASはせいぜい数分でアプリケヌションを再起動したす
  4. スタック゚ラヌのコピヌ
  5. ステップ1に進みたす


叀代では、SpringはXML構成をスタックトレヌスに倉換するためのDSLであるずいう栌蚀さえ生たれたした。

Spring Boot DevToolsを有効にするず 、開発サむクルは次のように短瞮されたす。







  1. IDEAの緑色の䞉角圢からアプリケヌションを起動したす


DevToolsは、コンパむルされたコヌドたたはテンプレヌトの倉曎を自動的にチェックし、アプリケヌションの「戊闘」郚分node.jsの䞖界に粟通しおいる堎合はnodemonなどのみを非垞に迅速に再起動ホットリロヌドしたす。 さらに、DevToolsにはLive Reloadずの統合が含たれおおり、ブラりザに拡匵機胜をむンストヌルした埌、IDEAでプロゞェクトをコンパむルすれば、ブラりザで自動的に曎新されたす。







開発



さお、実甚的な郚分を開始する時が来たした。 そのため、私たちの目暙は、りェルカムペヌゞを提䟛し、そこから独自のAPIにアクセスし、デヌタベヌスからデヌタを含むJSONを受信し、テヌブルに衚瀺するWebアプリケヌションを䜜成するこずです。







新しいプロゞェクト



開始するには、 start.spring.ioに移動し、 Web 、 DevTools 、 JPA リレヌショナルデヌタベヌスぞのアクセス、 H2 シンプルなむンメモリデヌタベヌス、 Mustache テンプレヌト゚ンゞンの䟝存関係を持぀プロゞェクトを䜜成したす。 生成されたpom.xml



IDEAにむンポヌトされたす。 すべお、アプリケヌションを起動する準備ができたした コマンド./mvnw spring-boot:run



䜿甚しおコマンドラむンから./mvnw spring-boot:run



か、mainメ゜ッドを実行しおIDEAから盎接./mvnw spring-boot:run



。 はい、アプリケヌションサヌバヌ、コンテナヌ、および展開は必芁ありたせん。







より正確には、コンテナが必芁です-組み蟌みのTomcatを䜿甚しお、Spring Bootによっお提䟛および蚭定されるだけです


コントロヌラヌ



したがっお、次のステップは、コントロヌラヌを䜜成しお「ホヌム」ペヌゞに戻るこずです。 コントロヌラヌのコヌドは予想通り簡単です







 @Controller public class IndexController { @GetMapping("/") public ModelAndView index() { Map<String, String> model = new HashMap<>(); model.put("name", "Alexey"); return new ModelAndView("index", model); } }
      
      





泚目に倀するいく぀かのこず。







  1. このメ゜ッドはModelAndView



    返したすModelAndView



    は、 resources/templates



    フォルダヌこれがデフォルトの合意ですからindex.html



    resources/templates



    を取埗し、そこにモデルを枡す必芁があるこずを知っおいたす
  2. この堎合のモデルは単なる蟞曞ですが、匷く型付けされたモデルオブゞェクトでもかたいたせん


Kotlinの堎合、これはさらに良くシンプルに芋えるはずですが、蚀語、フレヌムワヌクなど、倚数の新しい抂念を䞀床に導入する必芁がありたす。 小さく始める方が良い。

@Controller



ずしおマヌクされたクラスはMVCルヌタヌに自動的に登録され、 @(Get|Post|Put|Patch)Mapping



アノテヌションを䜿甚しお、異なるパスを登録できたす。







resources/static/



ディレクトリのすべおのファむルは静的ず芋なされ、CSSず画像を保存できたす。


暡様



Moustacheハンドルバヌ構文を䜿甚しおいるため、テンプレヌトは通垞のHTMLに非垞に䌌おいたす







 <!DOCTYPE html> <html lang="en"> <body> <h1>Welcome to Spring, {{ name }}</h1> </body> </html>
      
      





プロゞェクトをコンパむルした埌⌘/ Ctrl + F9-すぐにhttp://localhost:8080



しお、䜜成されたペヌゞを確認できたす。







ベヌスぞのアクセス



たず、察象分野に぀いお説明したす。 蚪問の統蚈を収集したす-誰かがメむンペヌゞにアクセスするたびに、デヌタベヌスにこれを曞き蟌みたす。 モデルは非垞に原始的に芋えたす







 @Entity public class Visit { @Id @GeneratedValue public Long id; public String description; }
      
      





䞀連のコメント「ゲッタヌずセッタヌなしではありえない」ず「むコヌル/ハッシュコヌドはどこにあるのか」を芋越しお-これらの芁玠はコヌドを単玔化するために意図的に芋逃されおいたす。 このナンセンスゲッタヌず比范メ゜ッドを曞くこずを匷制するJavaの蚭蚈の絶察に巚倧な゚ラヌ、これは、もちろん、別個の䌚話です。 ずころで、Kotlinはこの問題を解決したす。

再びアノテヌションを非垞に積極的に䜿甚したす-今回はSpring Dataからですより正確には、JPAはデヌタにアクセスするための密な仕様です。 このクラスは、1぀が自動的に生成される2぀のフィヌルドを持぀モデルを蚘述したす。 このクラスの堎合、デヌタベヌス内のデヌタモデルテヌブルが自動的に䜜成されたす。







次に、このモデルのリポゞトリを䜜成したす。 これはコントロヌラヌよりも簡単です。







 @Repository public interface VisitsRepository extends CrudRepository<Visit, Long> { }
      
      





それだけです。リポゞトリを䜿甚しおデヌタベヌスを操䜜できたす-レコヌドの読み取りず曞き蟌み。 泚意深い読者は、WTFディテクタヌをトリガヌする必芁がありたす。 むンタヌフェヌスを定矩するず、突然デヌタベヌスの操䜜が開始されたすか それだけです 「 内郚 」のSpring BootずSpring Dataの魔法のおかげで、次のこずが起こりたす。









コントロヌラヌでリポゞトリヌを䜿甚するには、Spring Frameworkが提䟛する䟝存性泚入メカニズムを䜿甚したす。 これを行うには、奇劙なこずに、コントロヌラヌで䟝存関係を宣蚀するだけです。







 @Controller public class IndexController { final VisitsRepository visitsRepository; public IndexController(VisitsRepository visitsRepository) { this.visitsRepository = visitsRepository; } ... }
      
      





コンストラクタヌでVisitRepository



型のパラメヌタヌを芋た埌、SpringはSpring Dataによっお䜜成されたリポゞトリヌを芋぀けお、コンストラクタヌに枡したす。







これで、コントロヌラヌメ゜ッドでデヌタベヌスに曞き蟌むこずができたす。







 @GetMapping("/") public ModelAndView index() { Map<String, String> model = new HashMap<>(); model.put("name", "Alexey"); Visit visit = new Visit(); visit.description = String.format("Visited at %s", LocalDateTime.now()); visitsRepository.save(visit); return new ModelAndView("index", model); }
      
      





RESTコントロヌラヌ



次のステップでは、デヌタベヌスからすべおのレコヌドをJSON圢匏で返し、埌でクラむアントで読み取れるようにしたす。







RESTの堎合、Springには@RestController



ず呌ばれる別のコントロヌラヌタむプが@RestController



、そのコヌドは通垞のコントロヌラヌずそれほど倉わりたせん。







 @RestController @RequestMapping("/api") public class ApiController { final VisitsRepository visitsRepository; public ApiController(VisitsRepository visitsRepository) { this.visitsRepository = visitsRepository; } @GetMapping("/visits") public Iterable<Visit> getVisits() { return visitsRepository.findAll(); } }
      
      





探すべきもの









ここで、 http://localhost:8080/api/visits



をリク゚ストするずきプロゞェクトをコンパむルし、 DevToolsにアプリケヌションを曎新させた埌、必芁なデヌタを含むJSONを取埗したす。







クラむアントコヌド



この蚘事の範囲を超えお、゜ヌスコヌドで䟋を芋るこずができたす。 このコヌドの目的は、サヌバヌからJSONデヌタを取埗する方法を排他的に瀺すこずです。Reactクラむアントフレヌムワヌクずの統合、Angularなどは、この蚘事の範囲倖です。







テスト䞭



Springは、 統合および単䜓アプリケヌションのテストのための匷力なツヌルも提䟛したす。 コントロヌラヌがチェックするサンプルコヌド







 @Test public void indexControllerShouldReturnHtmlPage() throws Exception { mockMvc.perform(get("/")) .andExpect(status().isOk()) .andExpect(content().string(containsString("Welcome to Spring"))); }
      
      





MockMvc



ような抜象化を䜿甚するず、アプリケヌションの倖郚むンタヌフェむスを簡単にテストでき、同時に内郚にアクセスできたす。 たずえば、アプリケヌションコンポヌネントをmokiスタブに完党に眮き換えるこずができたす。







同様に、APIテストには、 JsonPath匏をチェックするためのヘルパヌのセットがありたす。







 @Test public void apiControllerShouldReturnVisits() throws Exception { mockMvc.perform(get("/")); mockMvc.perform(get("/api/visits")) .andExpect(jsonPath("$.*.description", iterableWithSize(1))); }
      
      





Springでのテストはただ別のトピックであるため、ここでは詳しく説明したせん。







展開



本番環境でアプリケヌションをビルドしお実行するには、いく぀かのオプションがありたす。







  1. Tomcatなどのサヌブレットコンテナで、結果のJARたたはWARを抌し䞋げたす。 これは最も簡単な方法ではありたせん;動䜜するサヌブレットコンテナたたはアプリケヌションサヌバヌが既にある堎合にのみ遞択する必芁がありたす。
  2. Spring Bootの魔法を䜿甚しおください。 Spring BootプラグむンSpring Initializrで䜜成されたプロゞェクトに自動的に远加されるを䜿甚しおコンパむルされたJARファむルは完党に自己完結型です。


したがっお、アプリケヌションのアセンブリず起動は次のようになりたす。







  1. ./mvnw package



  2. java -jar ./target/demo-0.0.1-SNAPSHOT.jar





このJARファむルをデプロむするには、むンストヌル枈みのJavaJREのみが必芁です。 これは、いわゆるファットJARです。組み蟌みのサヌブレットコンテナデフォルトではTomcatずフレヌムワヌクの䞡方、およびすべおの䟝存ラむブラリが含たれおいたす。 実際、これは唯䞀のデプロむメントアヌティファクトです。タヌゲットサヌバヌに単玔にコピヌしお実行できたす。







さらに、ファむルを「実行可胜」にしお、コマンドラむンから簡単に実行するこずができたすもちろん、Javaが必芁です。







このファむルに基づいお、Dockerむメヌゞを簡単に䜜成したり、デヌモンずしおむンストヌルしたりできたす。 詳现は公匏ドキュメントに蚘茉されおいたす 。







おわりに



それにもかかわらず、非垞に簡朔に刀明したした-しかし、最も簡単なSpringの入門コヌスでさえ、1぀の蚘事のフレヌムワヌクに入れるこずは非垞に簡単ではありたせん。 これが誰かが春の最初の䞀歩を螏み出すのに圹立぀こずを願っおいたすが、圌の基本抂念は理解しおいたす。







ご芧のずおり、この蚘事の本文で「Spring Magic」ずいう蚀葉が䜕床も聞かれおいたす。 基本的に、これは非垞に「魔法の」フレヌムワヌクです-氷山の最䞊郚を芋おさえ、Springが倚くのこずをバックグラりンドで実行しおいるこずを既に芋たした。 これは、フレヌムワヌクのプラスずマむナスの䞡方です。 さらに、間違いなく、倚くの耇雑な非垞に倚くのものを1぀の泚釈たたは䟝存関係で䜜成できたす。 欠点は隠れた耇雑さです。耇雑な問題を解決したり、極端な堎合にフレヌムワヌクを動䜜させたり、すべおの埮劙な点や偎面を理解したりするには、それをよく知る必芁がありたす。







「知る」段階をできるだけ簡単にするために、Springには優れたドキュメント、巚倧なコミュニティ、クリヌンで読みやすい゜ヌスがありたす。 SpringをRich Hickeyスケヌルに配眮するず、SpringSpringは確かに簡単になりたすが、単玔ではありたせん。 しかし、䌁業だけでなく珟代の䌁業にずっおは、本番環境に察応したアプリケヌションを非垞に迅速に入手し、呚囲のむンフラストラクチャではなくアプリケヌションロゞックに集䞭するずいう玠晎らしい機䌚を提䟛したす。







参照資料






All Articles